den2life

Stm32F429 + Tft

13 сообщений в этой теме

den2life    2

Помогите Пожалуйста. (среда Keil, ЦП: STM32429VG)

Вообщем не получается настроить проц для экрана 480 на 272 RGB, использую встроенный контроллер LTDC. Экран без контроллер.

даташит от экрана вставил.

Вот мой пример инициализации для данного экрана.

void initialization_LTDC (void)
{

 LTDC_InitTypeDef	   LTDC_InitStruct;
 LTDC_Layer_InitTypeDef LTDC_Layer_InitStruct;
 //A, B, C, D, E
  RCC->AHB1ENR |= (1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);

 GPIOE->MODER |= (1<<20); //DISP


 GPIOA->MODER |= (1<<25)| //12
	  (1<<23)| //11
	  (1<<13)| //6
	  (1<<9)|  //4
	  (1<<7);  //3

 GPIOB->MODER |= (1<<23)| //11
	  (1<<21)| //10
	  (1<<19)| //9
	  (1<<17)| //8
	  (1<<3)|  //1
	  (1<<1);  //0

 GPIOC->MODER |= (1<<21)| //10
	  (1<<15)| //7
	  (1<<13); //6

 GPIOE->MODER |= (1<<31)| //15
	  (1<<29)| //14
	  (1<<27)| //13
	  (1<<25)| //12
	  (1<<23); //11

 GPIOD->MODER |= (1<<21)| //10
	  (1<<7);  //3

 GPIOA->OSPEEDR |= 0x3C033C0;
 GPIOB->OSPEEDR |= 0xFF000F;
 GPIOC->OSPEEDR |= 0x30F000;
 GPIOE->OSPEEDR |= 0xFFC00000;
 GPIOD->OSPEEDR |= 0x3000C0;

 GPIOA->AFR[0] |= 0xE0EE000;
 GPIOA->AFR[1] |= 0xEE000;
 GPIOB->AFR[0] |= 0xEE;
 GPIOB->AFR[1] |= 0xEEEE;
 GPIOC->AFR[0] |= 0xEE000000;
 GPIOC->AFR[1] |= 0xE00;
 GPIOE->AFR[1] |= 0xEEEEE000;
 GPIOD->AFR[0] |= 0xE000;
 GPIOD->AFR[1] |= 0xE00;

 //LTDC
 RCC->APB2ENR |= (1<<26);

 //DMA2D
 RCC->AHB1ENR |= (1<<23);
 /* Configure PLLSAI prescalers for LCD */
 /* Enable Pixel Clock */
 /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */
 /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAI_N = 192 Mhz */
 /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAI_R = 192/4 = 48 Mhz */
 /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 48/8 = 6 Mhz */
 RCC_PLLSAIConfig(192, 7, 4);
 RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);

//RCC->PLLSAICFGR |=
 /* Enable PLLSAI Clock */
 RCC_PLLSAICmd(ENABLE);
 /* Wait for PLLSAI activation */
 while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET)
 {
 }

/* LCD Size (Width and Height) */
#define  LCD_PIXEL_WIDTH    ((uint16_t)480)
#define  LCD_PIXEL_HEIGHT   ((uint16_t)272)
#define LCD_FRAME_BUFFER	   ((uint32_t)0xD0000000)
#define BUFFER_OFFSET		  ((uint32_t)0x50000)
#define HFP 2  //// HFP  96
#define HSYNC 40 //// HSYNC  22
#define HBP 87  //// HBP  33
///*************************************************************************************************
#define VFP 2  //// VFP  5
#define VSYNC 9  //// VSYNC 1
#define VBP 11  //// VBP  35
///*************************************************************************************************
#define ACTIVE_W 567//(HSYNC + LCD_PIXEL_WIDTH + HBP - 1)  //
#define ACTIVE_H 283//(VSYNC + LCD_PIXEL_HEIGHT + VBP - 1)
///*************************************************************************************************
#define TOTAL_WIDTH 575//(HSYNC + HBP + LCD_PIXEL_WIDTH + HFP - 1)  //
#define TOTAL_HEIGHT 286//(VSYNC + VBP + LCD_PIXEL_HEIGHT + VFP - 1)
///*************************************************************************************************
 /* Timing configuration */ 
 /* Configure horizontal synchronization width */	
 LTDC_InitStruct.LTDC_HorizontalSync = HSYNC;
 /* Configure vertical synchronization height */
 LTDC_InitStruct.LTDC_VerticalSync = VSYNC;
 /* Configure accumulated horizontal back porch */
 LTDC_InitStruct.LTDC_AccumulatedHBP = HBP+HSYNC-1;
 /* Configure accumulated vertical back porch */
 LTDC_InitStruct.LTDC_AccumulatedVBP = VSYNC+VBP-1; 
 /* Configure accumulated active width */ 
 LTDC_InitStruct.LTDC_AccumulatedActiveW = ACTIVE_W;
 /* Configure accumulated active height */
 LTDC_InitStruct.LTDC_AccumulatedActiveH = ACTIVE_H;
 /* Configure total width */
 LTDC_InitStruct.LTDC_TotalWidth = TOTAL_WIDTH;
 /* Configure total height */
 LTDC_InitStruct.LTDC_TotalHeigh = TOTAL_HEIGHT;

 LTDC_Init(&LTDC_InitStruct);

 /*//LTDC
 LTDC->SSCR = 0x90001; //Sync
 LTDC->BPCR = 0xE0005; //Back Porch
 LTDC->AWCR = 0x11E01E5; //Active Width
 LTDC->TWCR = 0x12001E7; //Total Width
 */
   /* Windowing configuration */
 /* In this case all the active display area is used to display a picture then :
 Horizontal start = horizontal synchronization + Horizontal back porch = 30
 Horizontal stop = Horizontal start + window width -1 = 30 + 240 -1
 Vertical start   = vertical synchronization + vertical back porch	 = 4
 Vertical stop   = Vertical start + window height -1  = 4 + 320 -1	  */	 
LTDC_Layer_InitStruct.LTDC_HorizontalStart = HBP+HSYNC;
LTDC_Layer_InitStruct.LTDC_HorizontalStop = (LCD_PIXEL_WIDTH + HBP+HSYNC - 1);
LTDC_Layer_InitStruct.LTDC_VerticalStart = VSYNC + VBP;
LTDC_Layer_InitStruct.LTDC_VerticalStop = (LCD_PIXEL_HEIGHT + VSYNC+VBP - 1);

 /* Pixel Format configuration*/
 LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB565;
 /* Alpha constant (255 totally opaque) */
 LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 255;
 /* Default Color configuration (configure A,R,G,B component values) */		 
 LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 255;	   
 LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 255;	  
 LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 255;		
 LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0;
 /* Configure blending factors */	  
 LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_CA;   
 LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_CA;

 /* the length of one line of pixels in bytes + 3 then :
 Line Lenth = Active high width x number of bytes per pixel + 3
 Active high width		 = LCD_PIXEL_WIDTH
 number of bytes per pixel = 2    (pixel_format : RGB565)
 */
 LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((LCD_PIXEL_WIDTH * 2) + 3);
 /* the pitch is the increment from the start of one line of pixels to the
 start of the next line in bytes, then :
 Pitch = Active high width x number of bytes per pixel */
 LTDC_Layer_InitStruct.LTDC_CFBPitch = (LCD_PIXEL_WIDTH * 2);

 /* Configure the number of lines */ 
 LTDC_Layer_InitStruct.LTDC_CFBLineNumber = LCD_PIXEL_HEIGHT;

 /* Start Address configuration : the LCD Frame buffer is defined on SDRAM */   
 LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER;

 /* Initialize LTDC layer 1 */
 LTDC_LayerInit(LTDC_Layer1, &LTDC_Layer_InitStruct);

 /* Configure Layer2 */
 /* Start Address configuration : the LCD Frame buffer is defined on SDRAM w/ Offset */	
 LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER + BUFFER_OFFSET;

 /* Configure blending factors */	  
 LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_PAxCA;   
 LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA;

 /* Initialize LTDC layer 2 */
 LTDC_LayerInit(LTDC_Layer2, &LTDC_Layer_InitStruct);

 /* LTDC configuration reload */ 
 LTDC_ReloadConfig(LTDC_IMReload);

 /* Enable foreground & background Layers */
 LTDC_LayerCmd(LTDC_Layer1, ENABLE);
 LTDC_LayerCmd(LTDC_Layer2, ENABLE);

 /* LTDC configuration reload */ 
 LTDC_ReloadConfig(LTDC_IMReload);

 /* Set default font */   
// LCD_SetFont(&LCD_DEFAULT_FONT);

 /* dithering activation */
 LTDC_DitherCmd(ENABLE);

LTDC->GCR |= (1<<0);   //LTDC En

GPIOE->ODR |= (1<<10); //DISPLAY ON

Как быть? Фото вставил что из этого вышло.

NHD-4.3-480272MF-ATXI-T-1.pdf

post-144830-0-52185100-1395138873_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Диман    107

Вынул подобный экран из gps и подключаю его к stm32f407. Судя по фото, не правильно настроены такты горизонтальной и вертикальной синхронизации

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
den2life    2
Судя по фото, не правильно настроены такты горизонтальной и вертикальной синхронизации

Как правильно настраивать hsync, vsync, horizontal and vertical back porch, etc? не правильно понял как настраивать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
den2life    2

Вс

не правильно настроены такты горизонтальной и вертикальной синхронизации

вообщем сделал по даташиту кристала все значения параметров tft. вышел такой код:

LTDC_InitTypeDef	 LTDC_InitStruct;
LTDC_Layer_InitTypeDef LTDC_Layer_InitStruct;
//A, B, C, D, E
RCC->AHB1ENR |= (1<<4)|(1<<3)|(1<<2)|(1<<1)|(1<<0);

GPIOE->MODER |= (1<<20); //DISP
GPIOE->ODR |= (1<<10);

GPIOA->MODER |= (1<<25)| //12
	 (1<<23)| //11
	 (1<<13)| //6
	 (1<<9)| //4
	 (1<<7); //3

GPIOB->MODER |= (1<<23)| //11
	 (1<<21)| //10
	 (1<<19)| //9
	 (1<<17)| //8
	 (1<<3)| //1
	 (1<<1); //0

GPIOC->MODER |= (1<<21)| //10
	 (1<<15)| //7
	 (1<<13); //6

GPIOE->MODER |= (1<<31)| //15
	 (1<<29)| //14
	 (1<<27)| //13
	 (1<<25)| //12
	 (1<<23); //11

GPIOD->MODER |= (1<<21)| //10
	 (1<<7); //3

GPIOA->OSPEEDR |= 0x3C033C0;
GPIOB->OSPEEDR |= 0xFF000F;
GPIOC->OSPEEDR |= 0x30F000;
GPIOE->OSPEEDR |= 0xFFC00000;
GPIOD->OSPEEDR |= 0x3000C0;

GPIOA->AFR[0] |= 0xE0EE000;
GPIOA->AFR[1] |= 0xEE000;
GPIOB->AFR[0] |= 0xEE;
GPIOB->AFR[1] |= 0xEEEE;
GPIOC->AFR[0] |= 0xEE000000;
GPIOC->AFR[1] |= 0xE00;
GPIOE->AFR[1] |= 0xEEEEE000;
GPIOD->AFR[0] |= 0xE000;
GPIOD->AFR[1] |= 0xE00;

//LTDC
RCC->APB2ENR |= (1<<26);

//DMA2D
RCC->AHB1ENR |= (1<<23);
/* Configure PLLSAI prescalers for LCD */
/* Enable Pixel Clock */
/* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */
/* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAI_N = 192 Mhz */
/* PLLLCDCLK = PLLSAI_VCO Output/PLLSAI_R = 192/4 = 48 Mhz */
/* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 48/8 = 6 Mhz */
RCC_PLLSAIConfig(192, 7, 4);
RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);

//RCC->PLLSAICFGR |=
/* Enable PLLSAI Clock */
RCC_PLLSAICmd(ENABLE);
/* Wait for PLLSAI activation */
while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET)
{
}

/* LCD Size (Width and Height) */
#define LCD_PIXEL_WIDTH ((uint16_t)480)
#define LCD_PIXEL_HEIGHT ((uint16_t)272)
#define LCD_FRAME_BUFFER	 ((uint32_t)0xD0000000)
#define BUFFER_OFFSET		 ((uint32_t)0x50000)
#define HFP 2 //// HFP 96
#define HSYNC 35 //// HSYNC 22
#define HBP 120 //// HBP 33
///*************************************************************************************************
#define VFP 2 //// VFP 5
#define VSYNC 7 //// VSYNC 1
#define VBP 11 //// VBP 35
///*************************************************************************************************
#define ACTIVE_W (HSYNC + HBP + LCD_PIXEL_WIDTH - 1)
#define ACTIVE_H (VSYNC + VBP+ LCD_PIXEL_HEIGHT - 1)
///*************************************************************************************************
#define TOTAL_WIDTH (HSYNC + HBP + LCD_PIXEL_WIDTH + HFP - 1) //
#define TOTAL_HEIGHT (VSYNC + VBP + LCD_PIXEL_HEIGHT + VFP - 1)
///*************************************************************************************************
/* Timing configuration */
/* Configure horizontal synchronization width */	
LTDC_InitStruct.LTDC_HorizontalSync = HSYNC;
/* Configure vertical synchronization height */
LTDC_InitStruct.LTDC_VerticalSync = VSYNC;
/* Configure accumulated horizontal back porch */
LTDC_InitStruct.LTDC_AccumulatedHBP = HBP+HSYNC-1;
/* Configure accumulated vertical back porch */
LTDC_InitStruct.LTDC_AccumulatedVBP = VSYNC+VBP-1;
/* Configure accumulated active width */
LTDC_InitStruct.LTDC_AccumulatedActiveW = ACTIVE_W;
/* Configure accumulated active height */
LTDC_InitStruct.LTDC_AccumulatedActiveH = ACTIVE_H;
/* Configure total width */
LTDC_InitStruct.LTDC_TotalWidth = TOTAL_WIDTH;
/* Configure total height */
LTDC_InitStruct.LTDC_TotalHeigh = TOTAL_HEIGHT;

LTDC_Init(&LTDC_InitStruct);

/*//LTDC
LTDC->SSCR = 0x90001; //Sync
LTDC->BPCR = 0xE0005; //Back Porch
LTDC->AWCR = 0x11E01E5; //Active Width
LTDC->TWCR = 0x12001E7; //Total Width
*/
/* Windowing configuration */
/* In this case all the active display area is used to display a picture then :
Horizontal start = horizontal synchronization + Horizontal back porch = 30
Horizontal stop = Horizontal start + window width -1 = 30 + 240 -1
Vertical start = vertical synchronization + vertical back porch	 = 4
Vertical stop = Vertical start + window height -1 = 4 + 320 -1	 */	
LTDC_Layer_InitStruct.LTDC_HorizontalStart = 2;//HBP+HSYNC;
LTDC_Layer_InitStruct.LTDC_HorizontalStop = (LCD_PIXEL_WIDTH + HBP+HSYNC - 1);
LTDC_Layer_InitStruct.LTDC_VerticalStart = 25;//VSYNC + VBP;
LTDC_Layer_InitStruct.LTDC_VerticalStop = (LCD_PIXEL_HEIGHT + VSYNC+VBP - 1);

/* Pixel Format configuration*/
LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB565;
/* Alpha constant (255 totally opaque) */
LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 255;
/* Default Color configuration (configure A,R,G,B component values) */		
LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 255;	
LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0;	
LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 0;		
LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0;
/* Configure blending factors */	
LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_CA;
LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_CA;

/* the length of one line of pixels in bytes + 3 then :
Line Lenth = Active high width x number of bytes per pixel + 3
Active high width		 = LCD_PIXEL_WIDTH
number of bytes per pixel = 2 (pixel_format : RGB565)
*/
LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((LCD_PIXEL_WIDTH * 2) + 3);
/* the pitch is the increment from the start of one line of pixels to the
start of the next line in bytes, then :
Pitch = Active high width x number of bytes per pixel */
LTDC_Layer_InitStruct.LTDC_CFBPitch = (LCD_PIXEL_WIDTH * 2);

/* Configure the number of lines */
LTDC_Layer_InitStruct.LTDC_CFBLineNumber = LCD_PIXEL_HEIGHT;

/* Start Address configuration : the LCD Frame buffer is defined on SDRAM */
LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER;

/* Initialize LTDC layer 1 */
LTDC_LayerInit(LTDC_Layer1, &LTDC_Layer_InitStruct);

/* Configure Layer2 */
/* Start Address configuration : the LCD Frame buffer is defined on SDRAM w/ Offset */	
LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER + BUFFER_OFFSET;

/* Configure blending factors */	
LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_PAxCA;
LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA;

/* Initialize LTDC layer 2 */
LTDC_LayerInit(LTDC_Layer2, &LTDC_Layer_InitStruct);

/* LTDC configuration reload */
LTDC_ReloadConfig(LTDC_IMReload);

/* Enable foreground & background Layers */
LTDC_LayerCmd(LTDC_Layer1, ENABLE);
LTDC_LayerCmd(LTDC_Layer2, ENABLE);

/* LTDC configuration reload */
LTDC_ReloadConfig(LTDC_IMReload);

/* Set default font */
// LCD_SetFont(&LCD_DEFAULT_FONT);

/* dithering activation */
LTDC_DitherCmd(ENABLE);

LTDC->GCR |= (1<<0);

Фото прилагаю.

Немного не понял данное значение:

/* Default Color configuration (configure A,R,G,B component values) */		
LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 255;	
LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0;	
LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 0;	
LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0;

сделал так чтоб фон 2 слоев был синий, насколько я понял. Поправьте?

Синий цвет появился, но странно, почему он сверху и не на весь экран. Недоумеваю....

а ну это при том что

LTDC_Layer_InitStruct.LTDC_HorizontalStart = 2;//HBP+HSYNC;
LTDC_Layer_InitStruct.LTDC_VerticalStart = 25;//VSYNC + VBP;

поправлял "ручным" способом. Не по даташиту, а если делать как по даташиту то всё потемнеет и всё. Не синего цвета ни чего. только темный экран.

post-144830-0-94167300-1395183306_thumb.jpg

Изменено пользователем den2life

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
UTSource

Найдите миллионы труднодоступных

электронных компонентов

den2life    2

Вообщем всё вроде б получилось. Всё сдал как нужно, по даташиту.

Теперь помогите вывести какое либо изображение, например для начало квадраты по дисплею с разными цветами. Как это сделать? Что тут никто не разбирался? Я думал тут форум, в котором могут помочь желающим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
andryxa    229

Начните с простого, нарисуйте для начала один пиксель по заданным координатам. А дальше или писать свою графическую фиблиотеку или скачать чюжую и адаптировать под себя. Как записать пиксел незнаю, я стаким дисплеем работал через SSD1963

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
den2life    2

Использовать dma2d необходимо, вроде б нужно. только вот как точку эту на экране поставить?;*(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
andryxa    229
как точку эту на экране поставить?

Если я правильно понял, нужно инициализировать SDRAM и в нее записать три байта (RGB)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Диман    107

Всё сдал как нужно, по даташиту.

А какому именно датащиту, в том что прикреплён не вижу ни временных диаграмм, ни таймингов

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
den2life    2

Если я правильно понял, нужно инициализировать SDRAM и в нее записать три байта (RGB)

Внешнюю оперативку? Мне кажется 256кбайт оперативы должен справится с статическим цветом точки на экране.

А какому именно датащиту, в том что прикреплён не вижу ни временных диаграмм, ни таймингов

если внимательно присмотрется в даташите есть ссылка на другой док пдф. Если точнее на рекомендованный компанией контроллер дисплея. Там в конце того дока имеется таблица со всеми характеристиками дисплея с которым контроллер сможет работать для разрешения экрана 480x272.

Изменено пользователем den2life

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
den2life    2

Посмею всех огорчить. Без оперативки на всю мощь дисплейчика не поюзаешь. Спасибо всем за не оказанную помощь. Тема закрыта

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Диман    107

Без оперативки

А в чём проблема внешнюю подключить, если посмотреть в реальных устройствах, то там так и сделано (в gps, который я разобрал, так и сделано, там даже 2 оперативки внешних стоит)

Изменено пользователем Диман

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
castiel    1

В каком режиме может работать tft контроллер в stm32f429? тоже хочу подключить экран, непонятно, он работает в de-mode или sync-mode?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

  • Похожие публикации

    • Автор: Aven
      Находимся в поиске программиста на длительный проект.
      Что есть: плата на основе STM32F103 + SIM808 (используется GSM, GPS, Bluetooth) + GPIO
      Задача - заставить все это работать с сервером (сервер пишется).
      Подробности при личном общении.
      Желательно Ростов-на-Дону или Ростовская область.
      Связь через ЛС или почту Rough_ne(a)mail.ru.
       
    • Автор: RDL_Rider
      Требуются разработчики электроники, знающие программирование STM32 или программисты STM32, знающие электронику, возможно студенты.
      Требования: желание развиваться в данном направлении, наличие собственных проектов на stm32.
      Возможно официальное оформление или договор подряда.
      Возможна удалённая работа, но всё равно актуально только для минчан, или для людей, 
      которые в случае чего в течение нескольких часов могут быть в Минске.
      Связь через ЛС.
    • Гость Максим
      Автор: Гость Максим
      Всем светлым и умным головам привет!

      Никак не могу найти информацию о данном прерывании TIM1_BRK_UP_TRG_COM.
      Вопрос 1: Что это за стек или система прерываний? 
      Вопрос 2: Когда будет вызываться обработчик прерывания TIM1_BRK_UP_TRG_COM_IRQHandler, если также есть обработчик прерывания TIM1_CC_IRQHandler?
      Вопрос 3: период переполнения таймера равен 100 мкс. Сколько раз будет вызываться обработчик прерывания TIM1_BRK_UP_TRG_COM_IRQHandler до обработчика прерывания TIM1_CC_IRQHandler? По логике вещей, предполагаю, что 100 раз?
      Заранее благодарен!

      Всем радости))
    • Автор: lamer19
      Здравствуйте, хочу изучить семейство Cortex. Начал изучение программирования микроконтроллеров с AVR Attiny2313, Atmega8. Программки писал по самоучителю Белова. Писал простенькие программки чтобы светодиодом при помощи кнопки моргать, бегущие огни, прерывания по таймеру и т.п. Но в моем городе востребованы микроконтроллеры Cortex. В результате нашел вакансию:
      Требования:
      • Профильное образование;
      • Уверенное знание C, опыт разработки от 1-ого года;
      • Опыт разработки ПО для микроконтроллеров STM32 (ARM CORTEX M) в среде KEIL на языках С и ассемблера.
      • Опыт работы с интерфейсами передачи данных: Ethernet, UART, I2C, SPI, USB.
      • Умение читать принципиальные схемы;
      • Умение пользоваться для отладки осциллографом, JTAG-интерфейсом;
      • Опыт работы с SVN, Git 
      Отсюда - подскажите литературу где описывается теория, т.е. строение МК, память, регистры и т.д. Также практические примеры использования JTAG, Ethernet, UART, I2C, SPI, USB. Ну и какие железки использовать. В алиэкспресс нашёл: отладочная плата (https://ru.aliexpress.com/item/Free-shipping-100-Original-STM32-Discovery-Board-Stm32f4discovery-Stm32f4-kit-Cortex-m4-STM32-Development-Board-St/32655207218.html?ws_ab_test=searchweb0_0,searchweb201602_2_10152_5722813_10151_10065_10344_10068_10342_5722613_10343_5722913_10340_10341_10543_10698_5711413_10696_10084_10083_5722713_10618_10307_10301_5711213_10059_308_100031_10103_5711513_10624_10623_10622_10621_10620_5722513_5711313_10125,searchweb201603_25,ppcSwitch_5&algo_expid=6bb60057-1829-4c3a-bfcf-64b27a13a331-29&algo_pvid=6bb60057-1829-4c3a-bfcf-64b27a13a331&priceBeautifyAB=0), программатор (https://ru.aliexpress.com/item/1pcs-New-ST-LINK-V2-ST-LINK-V2-CN-ST-LINK-STLINK-Emulator-Download-Manager-STM8/32725864986.html?spm=a2g0v.10010108.1000014.3.2e3e252eARrNY5&traffic_analysisId=recommend_3035_null_null_null&scm=1007.13338.98644.000000000000000&pvid=be1ab406-7b1c-4874-82ab-5ccf70631523&tpp=1). В общем помогите кто чем может.
       
    • Автор: aske12345
      Здравствуйте! Прошу помощи ! Столкнулся со следующей проблемой пытаюсь подключить к контроллеру по spi память FRAM FM25CL64 ,компилятор keil , пытаюсь записать одно число и его же считать, а осциллографом вижу, что считывается не то, что записывал. Пытался в разные ячейки памяти разные числа - считываются разные числа, но не те. Пишу 0x2F считывается 0x1С,  пишу 0xFF считывается 0xFE, пишу 0x99 считывается 0x20 - ерунда какая то. 
      Куски кода привел ниже:

      int main(void) {          SystemCoreClockUpdate();     SysTick_Config(SystemCoreClock/1000);//1ms     LEDs_ini();     Button_ini();     SPI3_FRAM_ini();         delay_ms(50);     //проверим FRAM начало запись 1 байта        CS_FRAM_ON();//        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};        SPI_I2S_SendData(SPI3, 0x06);//Set Write Enable Latch 6        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};        while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется        CS_FRAM_OFF();        delay_us(3);    //на самом деле задержка выходит около 500нс                CS_FRAM_ON();         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};     SPI_I2S_SendData(SPI3, 0x02);// Write              while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется     SPI_I2S_SendData(SPI3, 0x10);// 13 битный адрес         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется         SPI_I2S_SendData(SPI3, 0x00);// 13 битный адрес         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется     SPI_I2S_SendData(SPI3, 0x2F);// данные          while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется              CS_FRAM_OFF();         delay_us(3);//на самом деле задержка выходит около 500нс         //проверим FRAM конец запись  1 байта         //проверим FRAM начало чтение 1 байта         CS_FRAM_ON();//         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};     SPI_I2S_SendData(SPI3, 0x03);// Read              while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется     SPI_I2S_SendData(SPI3, 0x10);// 13 битный адрес         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется         SPI_I2S_SendData(SPI3, 0x00);// 13 битный адрес         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется     SPI_I2S_SendData(SPI3, 0x00);// пишем 0 для считывания         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE)== RESET){};         while(SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_BSY)== SET){};//ждем пока запишется         CS_FRAM_OFF(); //проверим FRAM конец чтение 1 байта              //LED1_OFF;          while(1)     {
      настройки spi:

      SPI_Init_user3.SPI_Direction = SPI_Direction_2Lines_FullDuplex;     SPI_Init_user3.SPI_Mode = SPI_Mode_Master;     SPI_Init_user3.SPI_DataSize = SPI_DataSize_8b;     SPI_Init_user3.SPI_CPOL = SPI_CPOL_High;//SPI_CPOL_Low     SPI_Init_user3.SPI_CPHA = SPI_CPHA_2Edge;     SPI_Init_user3.SPI_NSS = SPI_NSS_Soft;     SPI_Init_user3.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;//4     SPI_Init_user3.SPI_FirstBit = SPI_FirstBit_MSB;         SPI_Init_user3.SPI_CRCPolynomial = 7;          SPI_Init(SPI3, &SPI_Init_user3);
      контакты вроде все пересмотрел, думал провода может длинноваты,  клок spi настраивал на разную частоту уменьшал до 1МГц - не влияет,  пробовал делать паузу между командой WREN и командой записи 15мс, а записью и считыванием 20мс, всё то же самое не помогло..
      приложил осциллограммы:
      Осциллограмма всех посылок  WREN, WITE, READ  (тактовый сигнал ch1 и miso FRAM ch2) (синий луч отношения к делу не имеет)
      Осциллограмма  команды WREN (тактовый сигнал ch1 и miso FRAM ch2)(синий луч отношения к делу не имеет)
      Осциллограмма  команды WITE (тактовый сигнал ch1 и miso FRAM ch2)
      Осциллограмма  считанного значения записывал 0x2F, считал 0x1C (тактовый сигнал ch1 и mosi FRAM ch2)