STM32F429--LTDC显示图片
硬件平台:正点原子阿波罗F429
软件工具:STM32CubeMX 5.6.0
开发IDE: SW4STM32
1.首先配置STM32CUBEMX的LTDC:
1)选择RGB565,参考ATK-4.3 LCD的TIming Table如下:
将上面红色圈内的数据填入STM32CUBEMX的Parameter setting
以下摘取自:第27章 LTDC/DMA2D—液晶显示 - 野火_firege - 博客园 (cnblogs.com)
(1) HSPolarity
本成员用于设置行同步信号HSYNC的极性,即HSYNC有效时的电平,该成员的值可设置为高电平(HSPolarity_AH)或低电平(LTDC_HSPolarity_AL)。
(2) VSPolarity
本成员用于设置垂直同步信号VSYNC的极性,可设置为高电平(VSPolarity_AH)或低电平(VSPolarity_AL)。
(3) DEPolarity
本成员用于设置数据使能信号DE的极性,可设置为高电平(DEPolarity_AH)或低电平(DEPolarity_AL)。
(4) PCPolarity
本成员用于设置像素时钟信号CLK的极性,可设置为上升沿(DEPolarity_AH)或下降沿(DEPolarity_AL),表示RGB数据信号在CLK的哪个时刻被采集。
(5) HorizontalSync
本成员设置行同步信号HSYNC的宽度HSW,它以像素时钟CLK的周期为单位,实际写入该参数时应写入(HSW-1),参数范围为0x000- 0xFFF。
(6) VerticalSync
本成员设置垂直同步信号VSYNC的宽度VSW,它以“行”为位,实际写入该参数时应写入(VSW-1) ,参数范围为0x000- 0x7FF。
(7) AccumulatedHBP
本成员用于配置“水平同步像素HSW”加“水平后沿像素HBP”的累加值,实际写入该参数时应写入(HSW+HBP-1) ,参数范围为0x000- 0xFFF。
(8) AccumulatedVBP
本成员用于配置“垂直同步行VSW”加“垂直后沿行VBP”的累加值,实际写入该参数时应写入(VSW+VBP-1) ,参数范围为0x000- 0x7FF。
(9) AccumulatedActiveW
本成员用于配置“水平同步像素HSW”加“水平后沿像素HBP”加“有效像素”的累加值,实际写入该参数时应写入(HSW+HBP+有效宽度-1) ,参数范围为0x000- 0xFFF。
(10) AccumulatedActiveH
本成员用于配置“垂直同步行VSW”加“垂直后沿行VBP”加“有效行”的累加值,实际写入该参数时应写入(VSW+VBP+有效高度-1) ,参数范围为0x000- 0x7FF。
(11) TotalWidth
本成员用于配置“水平同步像素HSW”加“水平后沿像素HBP”加“有效像素”加“水平前沿像素HFP”的累加值,即总宽度,实际写入该参数时应写入(HSW+HBP+有效宽度+HFP-1) ,参数范围为0x000- 0xFFF。
(12) TotalHeigh
本成员用于配置“垂直同步行VSW”加“垂直后沿行VBP”加“有效行”加“垂
直前沿行VFP”的累加值,即总高度,实际写入该参数时应写入(HSW+HBP+有效高度+VFP-1) ,参数范围为0x000- 0x7FF。
(12)Background Color
此处R,G,B都设置为0 白色
2) Layer Seeting
这里只用一层,layer0. 显存首地址先设置成0,在代码中在修改为图片数组地址
以下摘取自:第27章 LTDC/DMA2D—液晶显示 - 野火_firege - 博客园 (cnblogs.com)
(1) WindowX0 / WindowX1/ WindowY0/ WindowY1这些成员用于确定该层显示窗口的边界,分别表示行起始、行结束、垂直起始及垂直结束的位置。注意这些参数包含同步HSW/VSW、后沿大小HBP/VBP和有效数据区域的内部时序发生器的配置,表 27-4的是各个窗口配置成员应写入的数值。
LTDC层级窗口配置成员
(2) PixelFormat
本成员用于设置该层数据的像素格式,可以设置为LTDC_PIXEL_FORMAT_ARGB8888/ RGB888/ RGB565/ ARGB1555/ ARGB4444/ L8/ AL44/ AL88格式。
(3) Alpha
本成员用于设置该层恒定的透明度常量Alpha,称为恒定Alpha,参数范围为0x00-0xFF,在图层混合时,可根据后面的BlendingFactor成员的配置,选择是只使用这个恒定Alpha进行混合运算还是把像素本身的Alpha值也加入到运算中。
(4) Alpha0
这些成员用于配置该层的默认透明分量,该颜色在定义的层窗口外或在层禁止时使用。
(5) LTDC_BlendingFactor_1/2
本成员用于设置混合系数 BF1 和 BF2。每一层实际显示的颜色都需要使用透明度参与运算,计算出不包含透明度的直接RGB颜色值,然后才传输给液晶屏(因为液晶屏本身没有透明的概念)。混合的计算公式为:BC = BF1 x C + BF2 x Cs
本结构体成员可以设置BF1/BF2参数使用CA配置(LTDC_BlendingFactor1/2_CA)还是PAxCA配置(LTDC_BlendingFactor1/2_PAxCA)。配置成CA表示混合系数中只包含恒定的Alpha值,即像素本身的Alpha不会影响混合效果,若配置成PAxCA,则混合系数中包含有像素本身的Alpha值,即把像素本身的Alpha加入到混合运算中。其中的恒定Alpha值即前面“LTDC_ConstantAlpha”结构体配置参数的透明度百分比:(配置的Alpha值/0xFF)。
见图,数据源混合时,由下至上,如果使用了2层,则先将第1层与LTDC背景混合,随后再使用该混合颜色与第2层混合得到最终结果。例如,当只使用第1层数据源时,且BF1及BF2都配置为使用恒定Alpha,该Alpha值在LTDC_ConstantAlpha结构体成员值中被配置为240(0xF0)。因此,恒定Alpha值为240/255=0.94。若当前层颜色C=128,背景色Cs=48,那么第1层与背景色的混合结果为:
BC=恒定Alpha x C + (1- 恒定Alpha) x Cs=0.94 x Cs +(1-0.94)x 48=123
(6) FBStartAdress
本成员用于设置该层的显存首地址,该层的像素数据保存在从这个地址开始的存储空间内。
(7) ImageWidth
本成员用于设置当前层的行数据长度,即每行的有效像素点个数x每个像素的字节数,实际配置该参数时应写入值(行有效像素个数x每个像素的字节数+3),每个像素的字节数跟像素格式有关,如RGB565为2字节,RGB888为3字节,ARGB8888为4字节。
(8) ImageHeight
本成员用于设置从某行的有效像素起始位置到下一行起始位置处的数据增量,无特殊情况的话,它一般就直接等于行的有效像素个数x每个像素的字节数。
(9) Backcolor
本成员用于设置当前层的背景颜色
3)使能LTDC全局中断
4) LCD GPIO 全部配置成Very High
5)LCD CLOCK
9M配置参照LCD Timing Table
6)将显示的图片转成RGB565
这里测试不交换R,G图像会失真,这里选red blue swapped
将生成的数组赋值到工程:
LTDC初始化参数配置:
1 void MX_LTDC_Init(void) 2 { 3 LTDC_LayerCfgTypeDef pLayerCfg = {0}; 4 5 hltdc.Instance = LTDC; 6 hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL; 7 hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL; 8 hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL; 9 hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC; 10 hltdc.Init.HorizontalSync = 0; 11 hltdc.Init.VerticalSync = 0; 12 hltdc.Init.AccumulatedHBP = 40; 13 hltdc.Init.AccumulatedVBP = 8; 14 hltdc.Init.AccumulatedActiveW = 520; 15 hltdc.Init.AccumulatedActiveH = 280; 16 hltdc.Init.TotalWidth = 525; 17 hltdc.Init.TotalHeigh = 288; 18 hltdc.Init.Backcolor.Blue = 0; 19 hltdc.Init.Backcolor.Green = 0; 20 hltdc.Init.Backcolor.Red = 0; 21 if (HAL_LTDC_Init(&hltdc) != HAL_OK) 22 { 23 Error_Handler(); 24 } 25 pLayerCfg.WindowX0 = 0; 26 pLayerCfg.WindowX1 = 480; 27 pLayerCfg.WindowY0 = 0; 28 pLayerCfg.WindowY1 = 272; 29 pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; 30 pLayerCfg.Alpha = 255; 31 pLayerCfg.Alpha0 = 0; 32 pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; 33 pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; 34 //这里不用SDRAM,先用内部SRAM 35 pLayerCfg.FBStartAdress = (uint32_t)&gImage_logo; 36 pLayerCfg.ImageWidth = 480; 37 pLayerCfg.ImageHeight = 272; 38 pLayerCfg.Backcolor.Blue = 0; 39 pLayerCfg.Backcolor.Green = 0; 40 pLayerCfg.Backcolor.Red = 0; 41 if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK) 42 { 43 Error_Handler(); 44 } 45 46 }
1 int main(void) 2 { 3 /* USER CODE BEGIN 1 */ 4 5 /* USER CODE END 1 */ 6 7 /* MCU Configuration--------------------------------------------------------*/ 8 9 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ 10 HAL_Init(); 11 12 /* USER CODE BEGIN Init */ 13 14 /* USER CODE END Init */ 15 16 /* Configure the system clock */ 17 SystemClock_Config(); 18 19 /* USER CODE BEGIN SysInit */ 20 21 /* USER CODE END SysInit */ 22 23 /* Initialize all configured peripherals */ 24 MX_GPIO_Init(); 25 MX_USART1_UART_Init(); 26 MX_FMC_Init(); //先配置SDRAM,后续会用上 27 MX_DMA2D_Init(); //先配置DMA2D,后续会用上 28 MX_LTDC_Init(); 29 /* USER CODE BEGIN 2 */ 30 HAL_GPIO_WritePin(LTDC_BL_GPIO_Port, LTDC_BL_Pin, GPIO_PIN_RESET); 31 HAL_Delay(500); 32 HAL_GPIO_WritePin(LTDC_BL_GPIO_Port, LTDC_BL_Pin, GPIO_PIN_SET); 33 34 /* USER CODE END 2 */ 35 36 /* Infinite loop */ 37 /* USER CODE BEGIN WHILE */ 38 while (1) 39 { 40 /* USER CODE END WHILE */ 41 42 /* USER CODE BEGIN 3 */ 43 } 44 /* USER CODE END 3 */ 45 }
显示效果: