STM32F4 LTDC学习
很久没有写东西了,也很久没看文档了吼吼,觉得有点无聊,找来F4看看,主要看F429。督促自己多看多记录。
首先配置同步时序先看参考手册
下面看一个实际例子,一块439的开发板
设置:
1 LTDC_InitStruct.LTDC_HorizontalSync = 40; 2 /* */ 3 LTDC_InitStruct.LTDC_VerticalSync = 9; 4 /* */ 5 LTDC_InitStruct.LTDC_AccumulatedHBP = 42; 6 /* */ 7 LTDC_InitStruct.LTDC_AccumulatedVBP = 11; 8 /* */ 9 LTDC_InitStruct.LTDC_AccumulatedActiveW = 522; 10 /* */ 11 LTDC_InitStruct.LTDC_AccumulatedActiveH = 283; 12 /* */ 13 LTDC_InitStruct.LTDC_TotalWidth = 524; 14 /* */ 15 LTDC_InitStruct.LTDC_TotalHeigh = 285; 16 17 LTDC_Init(<DC_InitStruct);
注意每个参数定义,之前是累加
看下完整的初始化代码
1 void LCD_Init(void) 2 { 3 LTDC_InitTypeDef LTDC_InitStruct; 4 LTDC_Layer_InitTypeDef LTDC_Layer_InitStruct; 5 LTDC_Layer_TypeDef LTDC_Layerx; 6 7 8 /* IO¿Ú³õʼ»¯ */ 9 LCD_GPIOInit(); 10 11 LCD_DisplayOff(); 12 /* ʹÄÜLCDʱÖÓ */ 13 RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE); 14 /* ʹÄÜDMAʧ×Ù*/ 15 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE); 16 17 /* ˮƽͬ²½ÐźÅ---µÍµçƽÓÐЧ */ 18 LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL; 19 /* ´¹Ö±Í¬²½ÐźÅ---µÍµçƽÓÐЧ */ 20 LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL; 21 /* Êý¾ÝʹÄÜÐźÅ---µÍµçƽÓÐЧ */ 22 LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL; 23 /* ÏñËØʱÖÓÅäÖÃ--- */ 24 LTDC_InitStruct.LTDC_PCPolarity = LTDC_DEPolarity_AL; 25 /* LCD±³¹âÉèÖà */ 26 LTDC_InitStruct.LTDC_BackgroundRedValue = 0; 27 LTDC_InitStruct.LTDC_BackgroundGreenValue = 0; 28 LTDC_InitStruct.LTDC_BackgroundBlueValue = 0; 29 /* 30 **************************************************************************** 31 *PLLSAI_VCO = HSE*PLLSAI_N / PLL_M = 8 * 192 / 8 = 192MHz 32 *PLLLCDCLK = PLLSAI_VCO / PLLSAI_R = 192 / 3 = 64 Mhz 33 *LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 64 / 8 = 8 Mhz 34 **************************************************************************** 35 */ 36 RCC_PLLSAIConfig(192, 7, 3); 37 RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4); 38 /* ʹÄÜPLLSAIʱÖÓ */ 39 RCC_PLLSAICmd(ENABLE); 40 /* µÈ´ýPLLSAIʱÖÓ */ 41 while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET){} 42 /* */ 43 LTDC_InitStruct.LTDC_HorizontalSync = 40; 44 /* */ 45 LTDC_InitStruct.LTDC_VerticalSync = 9; 46 /* */ 47 LTDC_InitStruct.LTDC_AccumulatedHBP = 42; 48 /* */ 49 LTDC_InitStruct.LTDC_AccumulatedVBP = 11; 50 /* */ 51 LTDC_InitStruct.LTDC_AccumulatedActiveW = 522; 52 /* */ 53 LTDC_InitStruct.LTDC_AccumulatedActiveH = 283; 54 /* */ 55 LTDC_InitStruct.LTDC_TotalWidth = 524; 56 /* */ 57 LTDC_InitStruct.LTDC_TotalHeigh = 285; 58 59 LTDC_Init(<DC_InitStruct); 60 61 LTDC_Layer_InitStruct.LTDC_HorizontalStart = 43; 62 LTDC_Layer_InitStruct.LTDC_HorizontalStop = (480 + 43 - 1); 63 LTDC_Layer_InitStruct.LTDC_VarticalStart = 12; 64 LTDC_Layer_InitStruct.LTDC_VerticalStop = (272 + 12 - 1); 65 66 /* Pixel Format configuration*/ 67 LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB565; 68 /* Alpha constant (255 totally opaque) */ 69 LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 255; 70 /* Default Color configuration (configure A,R,G,B component values) */ 71 LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 0; 72 LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0; 73 LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 0; 74 LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0; 75 /* Configure blending factors */ 76 LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_CA; 77 LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_CA; 78 /* the length of one line of pixels in bytes + 3 then : 79 Line Lenth = Active high width x number of bytes per pixel + 3 80 Active high width = LCD_PIXEL_WIDTH 81 number of bytes per pixel = 2 (pixel_format : RGB565) 82 */ 83 LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((480 * 2) + 3); 84 /* the pitch is the increment from the start of one line of pixels to the 85 start of the next line in bytes, then : 86 Pitch = Active high width x number of bytes per pixel 87 */ 88 LTDC_Layer_InitStruct.LTDC_CFBPitch = (480 * 2); 89 /* configure the number of lines */ 90 LTDC_Layer_InitStruct.LTDC_CFBLineNumber = 272; 91 92 /* Input Address configuration */ 93 LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER; 94 95 LTDC_LayerInit(LTDC_Layer1, <DC_Layer_InitStruct); 96 97 /* Configure Layer2 */ 98 LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER + BUFFER_OFFSET; 99 LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_PAxCA; 100 LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA; 101 LTDC_LayerInit(LTDC_Layer2, <DC_Layer_InitStruct); 102 103 LTDC_ReloadConfig(LTDC_IMReload); 104 105 /* Enable foreground & background Layers */ 106 LTDC_LayerCmd(LTDC_Layer1, ENABLE); 107 // LTDC_LayerCmd(LTDC_Layer2, ENABLE); 108 LTDC_ReloadConfig(LTDC_IMReload); 109 110 LCD_DisplayOn(); 111 }
LTDC_DefaultColorBlue就是背景色
每个Layer支持窗口(Window)操作,所谓Window,就是指该层的图像只有在Window区域内有效,而Window区域外则用该层的DefaultColor填充。如下图:
填色直接写内存
1 int main (void) 2 { 3 uint32_t i, j; 4 uint16_t *addr = (uint16_t *)LCD_FRAME_BUFFER; 5 6 7 SDRAM_Init(); 8 LCD_Init(); 9 j = 0; 10 while (1) { 11 12 for (i = 0; i < 0x2000000;i++); 13 for (i = 0; i < 480 * 272; i++) 14 { 15 addr[i] = 1 << j; 16 } 17 j++; 18 if (j > 15)j = 0; 19 } 20 }