硬件平台:正點原子阿波羅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 }
顯示效果: