Перейти к содержанию
    

STM32F429 + LCD без HSYNC VSYNC, только DE

Помогите настроить периферийный модуль LTDC в stm32f429 для дисплея MI0430HT (даташит в приложении).

Дисплей 480 * 272 точки.

Плата от Стартеркита :

http://starterkit.ru/html/index.php?name=s...view&id=128

Настройки взял из примера на плату, но в оригинальном примере работает а под HAL нет. Прошу помощи.

	LtdcHandler.Init.HorizontalSync = 40;
LtdcHandler.Init.VerticalSync = 9;
LtdcHandler.Init.AccumulatedHBP = 42;
LtdcHandler.Init.AccumulatedVBP = 11;
LtdcHandler.Init.AccumulatedActiveW = 52;
LtdcHandler.Init.AccumulatedActiveH = 283;
LtdcHandler.Init.TotalWidth = 525;
LtdcHandler.Init.TotalHeigh = 288;
LtdcHandler.Init.Backcolor.Red= 0;
LtdcHandler.Init.Backcolor.Blue= 0;
LtdcHandler.Init.Backcolor.Green= 0;
/* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 25/15 =1,667 Mhz */
/* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 180 Mhz */
/* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 180/5 = 36 Mhz */
/* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_8 = 36/4 = 9 Mhz */
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
PeriphClkInitStruct.PLLSAI.PLLSAIN = 108;
PeriphClkInitStruct.PLLSAI.PLLSAIR = 5;
PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_4;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); 
LtdcHandler.Init.HSPolarity = LTDC_HSPOLARITY_AL;
LtdcHandler.Init.VSPolarity = LTDC_VSPOLARITY_AL;
LtdcHandler.Init.DEPolarity = LTDC_DEPOLARITY_AL;
LtdcHandler.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
HAL_LTDC_Init(&LtdcHandler); 

 Layercfg.WindowX0 = 43;
 Layercfg.WindowX1 = (480 + 43 - 1);
 Layercfg.WindowY0 = 12;
 Layercfg.WindowY1 = (272 + 12 - 1); 

 Layercfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
 Layercfg.FBStartAdress = FB_Address;
 Layercfg.Alpha = 255;
 Layercfg.Alpha0 = 0;
 Layercfg.Backcolor.Blue = 0;
 Layercfg.Backcolor.Green = 0;
 Layercfg.Backcolor.Red = 0;
 Layercfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
 Layercfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
 Layercfg.ImageWidth = ((480 * 4) + 3);//524;//480;
 Layercfg.ImageHeight = 272;

 HAL_LTDC_ConfigLayer(&LtdcHandler, &Layercfg, LayerIndex); 

 DrawProp[LayerIndex].BackColor = LCD_COLOR_WHITE;
 DrawProp[LayerIndex].pFont	 = &Font24;
 DrawProp[LayerIndex].TextColor = LCD_COLOR_BLACK; 

 HAL_LTDC_EnableDither(&LtdcHandler);

MI0430HT_V1.0_withTP.PDF

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

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


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

После разбора даташита на дисплей создал код

	LtdcHandler.Init.HorizontalSync = 0;
LtdcHandler.Init.VerticalSync = 0;
LtdcHandler.Init.AccumulatedHBP = 44;			  //HBP+HSYNC-1;
LtdcHandler.Init.AccumulatedVBP = 15;			  //VSYNC+VBP-1;
LtdcHandler.Init.AccumulatedActiveW = 524;
LtdcHandler.Init.AccumulatedActiveH = 287;	   
LtdcHandler.Init.TotalWidth = 525;
LtdcHandler.Init.TotalHeigh = 288;
LtdcHandler.Init.Backcolor.Red= 0;
LtdcHandler.Init.Backcolor.Blue= 0;
LtdcHandler.Init.Backcolor.Green= 0;

/* LCD clock configuration */
/* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 25/15 = 1,6667Mhz */
/* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 180 Mhz */
/* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 180/5 = 36 Mhz */
/* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_8 = 36/4 = 9 Mhz */
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
PeriphClkInitStruct.PLLSAI.PLLSAIN = 108;
PeriphClkInitStruct.PLLSAI.PLLSAIR = 5;//
PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_4;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct); 

/* Polarity */
LtdcHandler.Init.HSPolarity = LTDC_HSPOLARITY_AL;
LtdcHandler.Init.VSPolarity = LTDC_VSPOLARITY_AL;
LtdcHandler.Init.DEPolarity = LTDC_DEPOLARITY_AL;
LtdcHandler.Init.PCPolarity = LTDC_PCPOLARITY_IPC;

HAL_LTDC_Init(&LtdcHandler); 

 Layercfg.WindowX0 = 0;
 Layercfg.WindowX1 = 480;
 Layercfg.WindowY0 = 0;
 Layercfg.WindowY1 = 272;

 Layercfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;
 Layercfg.FBStartAdress = FB_Address;
 Layercfg.Alpha = 255;
 Layercfg.Alpha0 = 0;
 Layercfg.Backcolor.Blue = 0;
 Layercfg.Backcolor.Green = 0;
 Layercfg.Backcolor.Red = 0;
 Layercfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
 Layercfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
 Layercfg.ImageWidth = 480;
 Layercfg.ImageHeight = 272;
 HAL_LTDC_ConfigLayer(&LtdcHandler, &Layercfg, LayerIndex); 
 DrawProp[LayerIndex].BackColor = LCD_COLOR_WHITE;
 DrawProp[LayerIndex].pFont	 = &Font24;
 DrawProp[LayerIndex].TextColor = LCD_COLOR_BLACK; 
 HAL_LTDC_EnableDither(&LtdcHandler);

 

изображение выводится, но через секунду или меньше ... или больше начинают мерцать точки в буквах и изображениях. Где может быть косяк.

Ау, пожалуйста, отзовитесь специалисты по ТФТ.

 

Непонятки в настройке области. Почему

  Layercfg.WindowX0 = 0;
  Layercfg.WindowX1 = 480;
  Layercfg.WindowY0 = 0;
  Layercfg.WindowY1 = 272;
....
  Layercfg.ImageWidth = 480;

а не

  Layercfg.WindowX0 = 44;     //HBP+HSYNC;;
  Layercfg.WindowX1 = 524;   //(LCD_PIXEL_WIDTH + HBP+HSYNC - 1);
  Layercfg.WindowY0 = 15;     //VSYNC + VBP;
  Layercfg.WindowY1 = 287    //(LCD_PIXEL_HEIGHT + VSYNC+VBP - 1);
.....
  Layercfg.ImageWidth = (480*4)+3;  // the length of one line of pixels in bytes + 3 then :

во втором случае выводится бред

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

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


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

изображение выводится, но через секунду или меньше ... или больше начинают мерцать точки в буквах и изображениях. Где может быть косяк.

подобный экран успешно работал на АРМ содержащих линукс системах и для пробы на голом Xilinx - если времянки укладывались в допуски, то изображение было стабильным.. изредка требовалось подкрутить в регистрах, чтобы уложить изображение "пиксель-в-пиксель"..

лучше всего посмотреть осциллографом "что там на контактах бегает, а 4-х канальный даст полную картину для сравнения с диаграммой в даташите..

если осцилла нет, то выведите содержимое критичных регистров в отладку и проверьте правильность с расчетными значениями..

 

на мой вкус я бы покрутил эти значения:

    LtdcHandler.Init.HorizontalSync = 0;
    LtdcHandler.Init.VerticalSync = 0;
    LtdcHandler.Init.AccumulatedHBP = 44;              //HBP+HSYNC-1;
    LtdcHandler.Init.AccumulatedVBP = 15;              //VSYNC+VBP-1;
    LtdcHandler.Init.AccumulatedActiveW = 524;
    LtdcHandler.Init.AccumulatedActiveH = 287;       
    LtdcHandler.Init.TotalWidth = 525;
    LtdcHandler.Init.TotalHeigh = 288;

особенно первые два, т.к. хоть VS/HS физически не участвуют, но значения могут использоваться для вычисления других сигналов

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


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

изображение выводится, но через секунду или меньше ... или больше начинают мерцать точки в буквах и изображениях. Где может быть косяк.

Ау, пожалуйста, отзовитесь специалисты по ТФТ.

Обычно такое происходит если ОЗУ сбоит.

Я себе брал, там инициализация ОЗУ была неверная... Точнее не совсем верная. В проге было на один адрес меньше. Ты проверь там всё.

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


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

Обычно такое происходит если ОЗУ сбоит.

Я себе брал, там инициализация ОЗУ была неверная... Точнее не совсем верная. В проге было на один адрес меньше. Ты проверь там всё.

В инициализации ОЗУ просто указано

FMC_SDRAMInitStructure.FMC_ColumnBitsNumber = FMC_ColumnBits_Number_8b;

FMC_SDRAMInitStructure.FMC_RowBitsNumber = FMC_RowBits_Number_11b;

а надо

FMC_SDRAMInitStructure.FMC_ColumnBitsNumber = FMC_ColumnBits_Number_9b;

FMC_SDRAMInitStructure.FMC_RowBitsNumber = FMC_RowBits_Number_13b;

просто не вся адресация ОЗУ

 

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


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

Интересно получается: при отладке в пошаговом режиме после вывода изображения на экран и остановки отладки всё хорошо выводится. Как только запускаю RUN в режиме отладки начинают мерцать буквы и бары.

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


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

Может что с питанием? У меня всё заработало сразу да и всё! Я начал с DMA2D баловаться. И там всё с пол пинка заработало... Я, правда, наоборот КУБ убрал и всё перенёс на регистры. Там очень всё прозрачно получается.

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


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

Antony не привык читать документацию https://electronix.ru/forum/index.php?showt...p;#entry1471914.

Чтобы исключить проблемы с SDRAM надо всего лишь попробовать вывести статичную картинку из флешки или внутренней оперативы.

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


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

Может что с питанием? У меня всё заработало сразу да и всё! Я начал с DMA2D баловаться. И там всё с пол пинка заработало... Я, правда, наоборот КУБ убрал и всё перенёс на регистры. Там очень всё прозрачно получается.

Не могли бы дать свой пример настройки ОЗУ и ЛЦД.

Хотел бы проверить работу железа.

При записи в память внешнего ОЗУ запись происходит с ошибками не все значения записываются. Что это может быть?

 

Не могли бы дать свой пример настройки ОЗУ и ЛЦД.

Хотел бы проверить работу железа.

При записи в память внешнего ОЗУ запись происходит с ошибками не все значения записываются. Что это может быть?

 

 

Помогите вывести изображение из ФЛЭШИ. Похоже, что у меня как-то переключаются слои

 

Похоже, что из флэши изображения выводится стабильно

Завёл константу const unsigned char logotip[16400] =

{

0xff,0xff....

Белая полоса, далее непонятные цвета по видимому содержимое кода программы.

Вывел изображение из флэш уже цветная картинка всё гууд. Затык в работе с SDRAM

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

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


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

Слушай, там так увязано... Не очень хочется раскапывать. Попытаюсь конечно...

Это ОЗУ

#define SDRAM_TIMEOUT     ((uint32_t)0xFFFF) 

// *** Биты контроллера FMC ***
// Программирование контроллера

#define FMC_ColumnBits_Number_8b				((uint32_t)0x00000000)
#define FMC_ColumnBits_Number_9b				((uint32_t)0x00000001)
#define FMC_ColumnBits_Number_10b				((uint32_t)0x00000002)
#define FMC_ColumnBits_Number_11b				((uint32_t)0x00000003)

#define FMC_RowBits_Number_11b					((uint32_t)0x00000000)
#define FMC_RowBits_Number_12b					((uint32_t)0x00000004)
#define FMC_RowBits_Number_13b					((uint32_t)0x00000008)

#define FMC_NORSRAM_MemoryDataWidth_8b			((uint32_t)0x00000000)
#define FMC_NORSRAM_MemoryDataWidth_16b			((uint32_t)0x00000010)
#define FMC_NORSRAM_MemoryDataWidth_32b			((uint32_t)0x00000020)

#define FMC_InternalBank_Number_2				((uint32_t)0x00000000)
#define FMC_InternalBank_Number_4				((uint32_t)0x00000040)

#define FMC_CAS_Latency_1						((uint32_t)0x00000080)
#define FMC_CAS_Latency_2						((uint32_t)0x00000100)
#define FMC_CAS_Latency_3						((uint32_t)0x00000180)

#define FMC_Write_Protection_Disable			((uint32_t)0x00000000)
#define FMC_Write_Protection_Enable				((uint32_t)0x00000200)

#define FMC_SDClock_Disable						((uint32_t)0x00000000)
#define FMC_SDClock_Period_2					((uint32_t)0x00000800)
#define FMC_SDClock_Period_3					((uint32_t)0x00000C00)

#define FMC_Read_Burst_Disable					((uint32_t)0x00000000)
#define FMC_Read_Burst_Enable					((uint32_t)0x00001000)

#define FMC_ReadPipe_Delay_0					((uint32_t)0x00000000)
#define FMC_ReadPipe_Delay_1					((uint32_t)0x00002000)
#define FMC_ReadPipe_Delay_2					((uint32_t)0x00004000)


// Комманды контроллера
#define FMC_Command_Mode_normal					((uint32_t)0x00000000)
#define FMC_Command_Mode_CLK_Enabled			((uint32_t)0x00000001)
#define FMC_Command_Mode_PALL					((uint32_t)0x00000002)
#define FMC_Command_Mode_AutoRefresh			((uint32_t)0x00000003)
#define FMC_Command_Mode_LoadMode				((uint32_t)0x00000004)
#define FMC_Command_Mode_Selfrefresh			((uint32_t)0x00000005)
#define FMC_Command_Mode_PowerDown				((uint32_t)0x00000006)

#define FMC_Command_Target_bank2				((uint32_t)0x00000008)
#define FMC_Command_Target_bank1				((uint32_t)0x00000010)
#define FMC_Command_Target_bank1_2				((uint32_t)0x00000018)

// управление памятью
#define SDRAM_MODEREG_BURST_LENGTH_1			((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_LENGTH_2			((uint16_t)0x0001)
#define SDRAM_MODEREG_BURST_LENGTH_4			((uint16_t)0x0002)
#define SDRAM_MODEREG_BURST_LENGTH_8			((uint16_t)0x0004)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL		((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED	((uint16_t)0x0008)
#define SDRAM_MODEREG_CAS_LATENCY_2				((uint16_t)0x0020)
#define SDRAM_MODEREG_CAS_LATENCY_3				((uint16_t)0x0030)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD	((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAM	((uint16_t)0x0000) 
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE	((uint16_t)0x0200) 



// Инициализация ОЗУ на плате.
void draminit(void)
{
 uint32_t	tmp = 0;
 uint32_t	timeout = SDRAM_TIMEOUT;


 // Инициализация пинов памяти
 PINSDRAM_INIT;
 // FMC SDRAM последовательность инициализации устройства

 // Шаг 1

 // Строки: [9:0]
 tmp |= FMC_ColumnBits_Number_9b;
 // Столбцы: [13:0]
 tmp |= FMC_RowBits_Number_13b;
 tmp |= FMC_NORSRAM_MemoryDataWidth_16b;
 tmp |= FMC_InternalBank_Number_4;
 // CL: Cas Latency = 3 цикла
 tmp |= FMC_CAS_Latency_3;
 tmp |= FMC_Write_Protection_Disable;
 tmp |= FMC_SDClock_Period_2;
 tmp |= FMC_Read_Burst_Enable;
 tmp |= FMC_ReadPipe_Delay_1;
 // FMC SDRAM bank initialization

 // FMC SDRAM control configuration. Банк 1.
 FMC_Bank5_6->SDCR[0] = tmp;

 // Шаг 2

 // Тайминги для 90 Mhz на SD. Частота (180Mhz/2)
 // TMRD: 2 цикла ожидания
 tmp = 2-1;      
 // TXSR: min=70ns (7x11.11ns)
 tmp |= (7-1)<<4;
 // TRAS: min=42ns (4x11.11ns) max=120k (ns)
 tmp |= (4-1)<<8;
 // TRC:  min=70 (7x11.11ns)
 tmp |= (7-1)<<12;         
 // TWR:  min=1+ 7ns (1+1x11.11ns)
 tmp |= (2-1)<<16;      
 // TRP:  20ns => 2x11.11ns
 tmp |= (2-1)<<20;                
 // TRCD: 20ns => 2x11.11ns
 tmp |= (2-1)<<24;

 // FMC SDRAM тайминги. Банк 1.
 FMC_Bank5_6->SDTR[0] = tmp;

 // Шаг 3

 // Разрешение команд
 tmp = FMC_Command_Mode_CLK_Enabled;
 tmp |= FMC_Command_Target_bank1;
 // FMC_AutoRefreshNumber
 tmp |= (1-1)<<5;
 // FMC_ModeRegisterDefinition
 tmp |= 0<<9;
 // ждать пока SDRAM контроллер будет готов
 timeout = SDRAM_TIMEOUT;
 while((FMC_Bank5_6->SDSR & FMC_SDSR_BUSY) && (timeout > 0))
 {
   timeout--;
 }
 // Послать комманду
 FMC_Bank5_6->SDCMR = tmp;

 // Шаг 4

 // Задержка 100мс
 hDelay(100);

 // Шаг 5

 // Сконфигурировать PALL (precharge all)
 tmp = FMC_Command_Mode_PALL;
 tmp |= FMC_Command_Target_bank1;
 // FMC_AutoRefreshNumber
 tmp |= (1-1)<<5;
 // FMC_ModeRegisterDefinition
 tmp |= 0<<9;
 // ждать пока SDRAM контроллер будет готов
 timeout = SDRAM_TIMEOUT;
 while((FMC_Bank5_6->SDSR & FMC_SDSR_BUSY) && (timeout > 0))
 {
   timeout--;
 }
 // Послать комманду
 FMC_Bank5_6->SDCMR = tmp;

 // Шаг 6

 // Сконфигурировать Auto-Refresh
 tmp = FMC_Command_Mode_AutoRefresh;
 tmp |= FMC_Command_Target_bank1;
 // FMC_AutoRefreshNumber
 tmp |= (8-1)<<5;
 // FMC_ModeRegisterDefinition
 tmp |= 0<<9;
 // ждать пока SDRAM контроллер будет готов
 timeout = SDRAM_TIMEOUT;
 while((FMC_Bank5_6->SDSR & FMC_SDSR_BUSY) && (timeout > 0))
 {
   timeout--;
 }
 // Послать комманду
 FMC_Bank5_6->SDCMR = tmp;

 // Шаг 7

 // Сконфигурировать load Mode регистр
 tmp = FMC_Command_Mode_LoadMode;
 tmp |= FMC_Command_Target_bank1;
 // FMC_AutoRefreshNumber
 tmp |= (8-1)<<5;
 // FMC_ModeRegisterDefinition
 // Запрограммировать mode register внешней памяти
 tmp |= ((uint32_t)SDRAM_MODEREG_BURST_LENGTH_1          |
 					SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
					SDRAM_MODEREG_CAS_LATENCY_3           |
 					SDRAM_MODEREG_OPERATING_MODE_STANDARD |
 					SDRAM_MODEREG_WRITEBURST_MODE_SINGLE)<<9;
 // ждать пока SDRAM контроллер будет готов
 timeout = SDRAM_TIMEOUT;
 while((FMC_Bank5_6->SDSR & FMC_SDSR_BUSY) && (timeout > 0))
 {
   timeout--;
 }
 // Послать комманду
 FMC_Bank5_6->SDCMR = tmp;

 // Шаг 8

 // Установить счётчик регенерации памяти
 // (7.81 us x Freq) - 20
 FMC_Bank5_6->SDRTR |= (683<<1);

 // ждать пока SDRAM контроллер будет готов
 timeout = SDRAM_TIMEOUT;
 while((FMC_Bank5_6->SDSR & FMC_SDSR_BUSY) && (timeout > 0))
 {
   timeout--;
 }

}

 

Это LCD c DMA2D

/************************************************************************
*					  *** Работа с оборудованием ***					*
************************************************************************/

// Alias word address of PLLSAION bit
#define RCC_OFFSET					(RCC_BASE - PERIPH_BASE)
#define CR_OFFSET					(RCC_OFFSET + 0x00)
#define PLLSAION_BITNUMBER			0x1C
//#define CR_PLLSAION_BB				(PERIPH_BB_BASE + (CR_OFFSET * 32) + (PLLSAION_BITNUMBER * 4))

#define RCC_FLAG_PLLSAIRDY			0x1D

#define GCR_MASK					((uint32_t)0x0FFE888F)				// LTDC GCR Mask

#define LTDC_HSPOLARITY_AL			((uint32_t)0x00000000)				// Horizontal Synchronization is active low.
#define LTDC_HSPOLARITY_AH			LTDC_GCR_HSPOL						// Horizontal Synchronization is active high.
#define LTDC_VSPOLARITY_AL			((uint32_t)0x00000000)				// Vertical Synchronization is active low.
#define LTDC_VSPOLARITY_AH			LTDC_GCR_VSPOL						// Vertical Synchronization is active high.
#define LTDC_DEPOLARITY_AL			((uint32_t)0x00000000)				// Data Enable, is active low.
#define LTDC_DEPOLARITY_AH			LTDC_GCR_DEPOL						// Data Enable, is active high.
#define LTDC_PCPOLARITY_IPC			((uint32_t)0x00000000)				// input pixel clock.
#define LTDC_PCPOLARITY_IIPC		LTDC_GCR_PCPOL						// inverted input pixel clock.

#define LTDC_PIXELFORMAT_RGB565		((uint32_t)0x00000002)

#define LTDC_BLENDINGFACTOR1_CA		((uint32_t)0x00000400)
#define LTDC_BLENDINGFACTOR1_PAXCA	((uint32_t)0x00000600)
#define LTDC_BLENDINGFACTOR2_CA		((uint32_t)0x00000005)
#define LTDC_BLENDINGFACTOR2_PAXCA	((uint32_t)0x00000007)

#define LTDC_IMRELOAD				LTDC_SRCR_IMR						// Immediately Reload.
#define LTDC_VBRELOAD				LTDC_SRCR_VBR						// Vertical Blanking Reload.

// ChromART

// @defgroup DMA2D_Input_Color_Mode DMA2D Input Color Mode
#define CM_ARGB8888					((uint32_t)0x00000000U)				// ARGB8888 color mode
#define CM_RGB888					((uint32_t)0x00000001U)				// RGB888 color mode
#define CM_RGB565					((uint32_t)0x00000002U)				// RGB565 color mode
#define CM_ARGB1555					((uint32_t)0x00000003U)				// ARGB1555 color mode
#define CM_ARGB4444					((uint32_t)0x00000004U)				// ARGB4444 color mode
#define CM_L8						((uint32_t)0x00000005U)				// L8 color mode
#define CM_AL44						((uint32_t)0x00000006U)				// AL44 color mode
#define CM_AL88						((uint32_t)0x00000007U)				// AL88 color mode
#define CM_L4						((uint32_t)0x00000008U)				// L4 color mode
#define CM_A8						((uint32_t)0x00000009U)				// A8 color mode
#define CM_A4						((uint32_t)0x0000000AU)				// A4 color mode

#define DMA2D_ARGB8888				((uint32_t)0x00000000U)				// ARGB8888 DMA2D color mode
#define DMA2D_RGB888				((uint32_t)0x00000001U)				// RGB888 DMA2D color mode
#define DMA2D_RGB565				((uint32_t)0x00000002U)				// RGB565 DMA2D color mode
#define DMA2D_ARGB1555				((uint32_t)0x00000003U)				// ARGB1555 DMA2D color mode
#define DMA2D_ARGB4444				((uint32_t)0x00000004U)				// ARGB4444 DMA2D color mode

// Инициализация LCD
void drvTFTinit(void)
{
 uint32_t tmpreg;

 // 480X272
 // Разрешить Pixel Clock
 // Конфигурируем PLLSAI предделитель для LCD
 // 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/3 = 64 Mhz
 RCC->PLLSAICFGR = (192 << 6) | (7 << 24) | (3 << 28);
 // LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 64/8 = 8 Mhz
 tmpreg = RCC->DCKCFGR;
 tmpreg &= ~RCC_DCKCFGR_PLLSAIDIVR;		// Очистить биты PLLSAIDIVR[2:0]
 tmpreg |= RCC_DCKCFGR_SAI1ASRC_1;			// Установить значение PLLSAIDIVR 2 (поделить на 8)
 RCC->DCKCFGR = tmpreg;					// Сохранить

 *(__IO uint32_t *) CR_PLLSAION_BB = (uint32_t)1; // Разрешить PLLSAI тактирование
 // Ждать запуска PLLSAI
 while((RCC->CR & (1<<RCC_FLAG_PLLSAIRDY)) == 0)
 {
 } 

 // Включить тактирование LTDC
 __LTDC_CLK_ENABLE();

 // Настроить пины LCD 
 PINLCD_INIT;


 //	***** Инициализация LTDC *****

 // *** Тайминги ***
 // горизонтальная синхронизация ширина = Hsync - 1 (41)
 LTDC->SSCR &= ~(LTDC_SSCR_VSH | LTDC_SSCR_HSW);
 tmpreg = (40 << 16);
 // вертикальная синхронизация высота = Vsync - 1 (10)
 LTDC->SSCR |= (tmpreg | 9);
 // горизонтальная ширина с полочкой = Hsync + HBP - 1
 LTDC->BPCR &= ~(LTDC_BPCR_AVBP | LTDC_BPCR_AHBP);
 tmpreg = (42 << 16);
 // вертикальная высота с полочкой = Vsync + HBP - 1
 LTDC->BPCR |= (tmpreg | 11);
 // активная ширина = Hsync + HBP + Active Width - 1
 LTDC->AWCR &= ~(LTDC_AWCR_AAH | LTDC_AWCR_AAW);
 tmpreg = (522 << 16);
 // активная высота = Vsync + VBP + Active Heigh - 1
 LTDC->AWCR |= (tmpreg | 283);
 // полная ширина = Hsync + HBP + Active Width + HFP - 1
 LTDC->TWCR &= ~(LTDC_TWCR_TOTALH | LTDC_TWCR_TOTALW);
 tmpreg = (524 << 16);
 // полная высота = Vsync + VBP + Active Heigh + VFP - 1
 LTDC->TWCR |= (tmpreg | 285);

 // *** Полярность ***
 // Полярность горизонтальной синхронизации = активный 0
 // Полярность вертикальной синхронизации = активный 0
 // Полярность "data enable" = активный 0
 // Полярность "pixel clock" без инверсии 
 LTDC->GCR &= (uint32_t)GCR_MASK;
 LTDC->GCR |=  (uint32_t)(LTDC_HSPOLARITY_AL | LTDC_VSPOLARITY_AL | LTDC_DEPOLARITY_AL | LTDC_PCPOLARITY_IPC);

 // R,G,B фона
 //LTDC->BCCR &= ~(LTDC_BCCR_BCBLUE | LTDC_BCCR_BCGREEN | LTDC_BCCR_BCRED);
 //LTDC->BCCR |= BACKGROUNDCOLOR;
 LTDC->BCCR = BACKGROUNDCOLOR;


 // *** Завершение инициализации LTDC ***
 // *** инициализация слоя 1 ***

 // Если вся область активного дисплея используется для отображения изображения, то:
 // Horizontal start = horizontal synchronization + Horizontal back porch = 43 
 // Vertical start   = vertical synchronization + vertical back porch     = 12
 // Horizontal stop = Horizontal start + window width -1 = 43 + 480 -1 
 // Vertical stop   = Vertical start + window height -1  = 12 + 272 -1
 //LTDC_Layer1->WHPCR &= ~(LTDC_LxWHPCR_WHSTPOS | LTDC_LxWHPCR_WHSPPOS);
 tmpreg = (480 + 43 - 1) << 16;		// Horizontal stop
 LTDC_Layer1->WHPCR = (43 | tmpreg);	// Horizontal start
 //LTDC_Layer1->WVPCR &= ~(LTDC_LxWVPCR_WVSTPOS | LTDC_LxWVPCR_WVSPPOS);
 tmpreg = (272 + 12 - 1) << 16;		// Vertical stop
 LTDC_Layer1->WVPCR  = (12 | tmpreg);	// Vertical start

 // Формат пикселя
 //LTDC_Layer1->PFCR &= ~(LTDC_LxPFCR_PF);
 LTDC_Layer1->PFCR = LTDC_PIXELFORMAT_RGB565;

 // Alpha constant (255 totally opaque)
 //LTDC_Layer1->CACR &= ~(LTDC_LxCACR_CONSTA);
 LTDC_Layer1->CACR = 255;

 // Цвет по умолчанию
 LTDC_Layer1->DCCR = 0;

 // Блэндинг факторы
 LTDC_Layer1->BFCR = (LTDC_BLENDINGFACTOR1_CA | LTDC_BLENDINGFACTOR2_CA);

 // Стартовый адресс
 LTDC_Layer1->CFBAR = VIDEOBUF_L1ADR;

 // Длина одной строки пикселей в байтах + 3:
 // Длина строки = Ширина x число байт на пиксель + 3 
 // Ширина         = 480 
 // число байт на пиксель = 2    (формат пикселя : RGB565)
 tmpreg = ((480 * 2) + 3);

 // Смещение между 2 строками
 LTDC_Layer1->CFBLR = ((480 * 2)<<16) | tmpreg;

 // Число строк
 LTDC_Layer1->CFBLNR = 272;

 // Разрешить работу слоя 1
 LTDC_Layer1->CR |= (uint32_t)LTDC_LxCR_LEN;

 // Перегрузить конфигурацию слоя 1
 LTDC->SRCR = (uint32_t)LTDC_IMRELOAD;

 // Запустить LCD
 LTDC->GCR |= (uint32_t)LTDC_GCR_LTDCEN;

 // Запустить ChromART
 __DMA2D_CLK_ENABLE();

}

 

Я просто HAL не задействую. Ну и тащить хидеры, если это одна операция разовая, не очень желаю. Поэтому подкидывал так.

Проект был "для изучения вопроса". Работу сейчас поменял.. Пока возвращаться планирую значительно позже...

 

Некоторые примитивы кину. Собственно там всё понятно... Ну напрягитесь ребята... Почитайте.

// Распаковать картинку A4 на экран
void copyA4toTFT(void *pSrc, void *pDst, uint16_t xSize, uint16_t ySize)
{
 DMA2D->CR = 0x00010000UL | (1 << 9);				// Control Register (Memory to memory with pixel format conversion and TCIE)

 // Указатели
 DMA2D->FGMAR = (uint32_t)pSrc;					// Foreground Memory Address Register (Source address)
 DMA2D->OMAR = (uint32_t)pDst;						// Output Memory Address Register (Destination address)

 // Смещения
 DMA2D->FGOR    = xSize;							// Foreground Offset Register (Source line offset)
 DMA2D->OOR     = _layerX-1;						// Output Offset Register (Destination line offset)

 // Входной и выходной Форматы пикселя
 DMA2D->FGPFCCR = CM_A4;                  			// Foreground PFC Control Register (Defines the input pixel format)
 DMA2D->OPFCCR  = DMA2D_RGB565;                  	// Output PFC Control Register (Defines the output pixel format)

 // Установить цвет
 DMA2D->FGCOLR = _fcolor;                  		// Foreground PFC Control Register (Defines the input pixel format)

 // Установить размер
 DMA2D->NLR     = (uint32_t)(xSize << 16) | ySize;	// Number of Line Register (Size configuration of area to be transfered)

 // Выполнить
 DMA2D->CR     |= DMA2D_CR_START;  

 while (DMA2D->CR & DMA2D_CR_START) 
 {
 }
}

// Скопировать картинку С16 на экран
void copyC16(void *pSrc, void *pDst, uint16_t xSize, uint16_t ySize, uint16_t xSizeSrc, uint16_t xSizeDst)
{
 DMA2D->CR = (1 << 9);								// без модификации

 // Указатели
 DMA2D->FGMAR = (uint32_t)pSrc;					// Foreground Memory Address Register (Source address)
 DMA2D->OMAR = (uint32_t)pDst;						// Output Memory Address Register (Destination address)

 // Смещения
 DMA2D->FGOR    = xSizeSrc;						// Foreground Offset Register (Source line offset)
 DMA2D->OOR     = xSizeDst;						// Output Offset Register (Destination line offset)

 // Входной и выходной Форматы пикселя
 DMA2D->FGPFCCR = CM_RGB565;						// Foreground PFC Control Register (Defines the input pixel format)
 DMA2D->OPFCCR  = DMA2D_RGB565;                  	// Output PFC Control Register (Defines the output pixel format)

 // Установить размер
 DMA2D->NLR     = (uint32_t)(xSize << 16) | ySize;	// Number of Line Register (Size configuration of area to be transfered)

 // Выполнить
 DMA2D->CR     |= DMA2D_CR_START;  

 while (DMA2D->CR & DMA2D_CR_START) 
 {
 }
}

// Залить прямоугольник на экране
void FillRectTFT(void *pSrc, uint16_t xSize, uint16_t ySize)
{
 // Set up mode
 DMA2D->CR = 0x00030000UL | (1 << 9);        
 DMA2D->OCOLR = _color;                     

 // Set up pointers
 DMA2D->OMAR = (uint32_t)pSrc;                      

 // Set up offsets
 DMA2D->OOR = _layerX-1;                        

 // Set up pixel format
 DMA2D->OPFCCR = DMA2D_RGB565;                    

 //  Set up size
 DMA2D->NLR = (uint32_t)(xSize << 16) | (uint16_t)ySize;

 DMA2D->CR |= DMA2D_CR_START; 

 // Wait until transfer is done
 while (DMA2D->CR & DMA2D_CR_START) 
 {
 }
}

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


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

У меня вот такая плата была: http://www.starterkit.ru/html/index.php?na...view&id=128

 

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


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

ПЛАТА ТАЖЕ

 

похоже, что самопроизвольно в ОЗУ появляются какие-то записи, что можно наблюдать в окне Memory 0xC0000000. Откуда могут браться это значения?

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

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


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

:biggrin: Может ваша прога пишет несанкционированно?

А родной пример работает без проблем?

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


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

:biggrin: Может ваша прога пишет несанкционированно?

А родной пример работает без проблем?

Тоже на это похоже, поставте while(1); после инита и выдачи первой картинки и наблюдайте, будет работать - ищите баги в своей проге, кто, куда в память лезет, а может еще и в регистры попадает :biggrin:

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

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

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

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

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

×
×
  • Создать...