初始化LTDC连接显示屏

1,初始化GPIO

查看代码
 void LTDC_GPIO_Init(void)
{
                          //红色数据线
  RCC_AHB1PeriphClockCmd(LTDC_R0_GPIO_CLK | LTDC_R1_GPIO_CLK | LTDC_R2_GPIO_CLK| 
                         LTDC_R3_GPIO_CLK | LTDC_R4_GPIO_CLK | LTDC_R5_GPIO_CLK|
                         LTDC_R6_GPIO_CLK | LTDC_R7_GPIO_CLK |
                          //绿色数据线
                          LTDC_G0_GPIO_CLK|LTDC_G1_GPIO_CLK|LTDC_G2_GPIO_CLK|
                          LTDC_G3_GPIO_CLK|LTDC_G4_GPIO_CLK|LTDC_G5_GPIO_CLK|
                          LTDC_G6_GPIO_CLK|LTDC_G7_GPIO_CLK|
                          //蓝色数据线
                          LTDC_B0_GPIO_CLK|LTDC_B1_GPIO_CLK|LTDC_B2_GPIO_CLK|
                          LTDC_B3_GPIO_CLK|LTDC_B4_GPIO_CLK|LTDC_B5_GPIO_CLK|
                          LTDC_B6_GPIO_CLK|LTDC_B7_GPIO_CLK|
                          //控制信号线
                          LTDC_CLK_GPIO_CLK | LTDC_HSYNC_GPIO_CLK |LTDC_VSYNC_GPIO_CLK|
                          LTDC_DE_GPIO_CLK  | LTDC_BL_GPIO_CLK    |LTDC_DISP_GPIO_CLK ,ENABLE);

/* GPIO配置 */
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    
 /* 红色数据线 */
    GPIO_InitStruct.GPIO_Pin = LTDC_R0_GPIO_PIN;                             
    GPIO_Init(LTDC_R0_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_R0_GPIO_PORT, LTDC_R0_PINSOURCE, LTDC_R0_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_R1_GPIO_PIN;
    GPIO_Init(LTDC_R1_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_R1_GPIO_PORT, LTDC_R1_PINSOURCE, LTDC_R1_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_R2_GPIO_PIN;
    GPIO_Init(LTDC_R2_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_R2_GPIO_PORT, LTDC_R2_PINSOURCE, LTDC_R2_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_R3_GPIO_PIN;
    GPIO_Init(LTDC_R3_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_R3_GPIO_PORT, LTDC_R3_PINSOURCE, LTDC_R3_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_R4_GPIO_PIN;
    GPIO_Init(LTDC_R4_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_R4_GPIO_PORT, LTDC_R4_PINSOURCE, LTDC_R4_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_R5_GPIO_PIN;
    GPIO_Init(LTDC_R5_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_R5_GPIO_PORT, LTDC_R5_PINSOURCE, LTDC_R5_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_R6_GPIO_PIN;
    GPIO_Init(LTDC_R6_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_R6_GPIO_PORT, LTDC_R6_PINSOURCE, LTDC_R6_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_R7_GPIO_PIN;
    GPIO_Init(LTDC_R7_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_R7_GPIO_PORT, LTDC_R7_PINSOURCE, LTDC_R7_AF);
  
  //绿色数据线
    GPIO_InitStruct.GPIO_Pin = LTDC_G0_GPIO_PIN;
    GPIO_Init(LTDC_G0_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_G0_GPIO_PORT, LTDC_G0_PINSOURCE, LTDC_G0_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_G1_GPIO_PIN;
    GPIO_Init(LTDC_G1_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_G1_GPIO_PORT, LTDC_G1_PINSOURCE, LTDC_G1_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_G2_GPIO_PIN;
    GPIO_Init(LTDC_G2_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_G2_GPIO_PORT, LTDC_G2_PINSOURCE, LTDC_G2_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_G3_GPIO_PIN;
    GPIO_Init(LTDC_G3_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_G3_GPIO_PORT, LTDC_G3_PINSOURCE, LTDC_G3_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_G4_GPIO_PIN;
    GPIO_Init(LTDC_G4_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_G4_GPIO_PORT, LTDC_G4_PINSOURCE, LTDC_G4_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_G5_GPIO_PIN;
    GPIO_Init(LTDC_G5_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_G5_GPIO_PORT, LTDC_G5_PINSOURCE, LTDC_G5_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_G6_GPIO_PIN;
    GPIO_Init(LTDC_G6_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_G6_GPIO_PORT, LTDC_G6_PINSOURCE, LTDC_G6_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_G7_GPIO_PIN;
    GPIO_Init(LTDC_G7_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_G7_GPIO_PORT, LTDC_G7_PINSOURCE, LTDC_G7_AF);
  
  //蓝色数据线
    GPIO_InitStruct.GPIO_Pin = LTDC_B0_GPIO_PIN;
    GPIO_Init(LTDC_B0_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_B0_GPIO_PORT, LTDC_B0_PINSOURCE, LTDC_B0_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_B1_GPIO_PIN;
    GPIO_Init(LTDC_B1_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_B1_GPIO_PORT, LTDC_B1_PINSOURCE, LTDC_B1_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_B2_GPIO_PIN;
    GPIO_Init(LTDC_B2_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_B2_GPIO_PORT, LTDC_B2_PINSOURCE, LTDC_B2_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_B3_GPIO_PIN;
    GPIO_Init(LTDC_B3_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_B3_GPIO_PORT, LTDC_B3_PINSOURCE, LTDC_B3_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_B4_GPIO_PIN;
    GPIO_Init(LTDC_B4_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_B4_GPIO_PORT, LTDC_B4_PINSOURCE, LTDC_B4_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_B5_GPIO_PIN;
    GPIO_Init(LTDC_B5_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_B5_GPIO_PORT, LTDC_B5_PINSOURCE, LTDC_B5_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_B6_GPIO_PIN;
    GPIO_Init(LTDC_B6_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_B6_GPIO_PORT, LTDC_B6_PINSOURCE, LTDC_B6_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_B7_GPIO_PIN;
    GPIO_Init(LTDC_B7_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_B7_GPIO_PORT, LTDC_B7_PINSOURCE, LTDC_B7_AF);
  
  /*控制信号线 
  CLK 时钟输出
  HSYNC 水平同步 
  VSYNC 垂直同步
  DE    数据使能
  */
  
    GPIO_InitStruct.GPIO_Pin = LTDC_CLK_GPIO_PIN;
    GPIO_Init(LTDC_CLK_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_CLK_GPIO_PORT, LTDC_CLK_PINSOURCE, LTDC_CLK_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_HSYNC_GPIO_PIN;
    GPIO_Init(LTDC_HSYNC_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_HSYNC_GPIO_PORT, LTDC_HSYNC_PINSOURCE, LTDC_HSYNC_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_VSYNC_GPIO_PIN;
    GPIO_Init(LTDC_VSYNC_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_VSYNC_GPIO_PORT, LTDC_VSYNC_PINSOURCE, LTDC_VSYNC_AF);

    GPIO_InitStruct.GPIO_Pin = LTDC_DE_GPIO_PIN;
    GPIO_Init(LTDC_DE_GPIO_PORT, &GPIO_InitStruct);
    GPIO_PinAFConfig(LTDC_DE_GPIO_PORT, LTDC_DE_PINSOURCE, LTDC_DE_AF);
  
  //背光BL 及液晶使能信号DISP
    GPIO_InitStruct.GPIO_Pin = LTDC_DISP_GPIO_PIN;                             
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_Init(LTDC_DISP_GPIO_PORT, &GPIO_InitStruct);


    GPIO_InitStruct.GPIO_Pin = LTDC_BL_GPIO_PIN; 
    GPIO_Init(LTDC_BL_GPIO_PORT, &GPIO_InitStruct);

    //拉高使能lcd
    GPIO_SetBits(LTDC_DISP_GPIO_PORT,LTDC_DISP_GPIO_PIN);
    GPIO_SetBits(LTDC_BL_GPIO_PORT,LTDC_BL_GPIO_PIN);
    
}

2.LTDC初始化

***配置LTDC前要先配置PLLSAI

void BSP_LTDC_Init(void)
{
    /*LTDC 像素时钟域 通过PLLSAI进行配置*/
    RCC_PLLSAIConfig(200, 20, 2);
    RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
    RCC_PLLSAICmd(ENABLE);
    while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET);
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE);
    
    LTDC_InitTypeDef LTDC_InitStruct;
    /*同步信号极性*/
    LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL;//行同步信号 HSYNC 极性
    LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL;//列同步极性
    LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL;//数据使能极性
    LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC;//时钟采样边沿
    /*LTDC同步时序*/
    LTDC_InitStruct.LTDC_HorizontalSync = HSW-1;//行同步信号宽度
    LTDC_InitStruct.LTDC_VerticalSync =   VSW-1;//垂直同步信号宽度
    LTDC_InitStruct.LTDC_AccumulatedHBP = HSW + HBP - 1;
    LTDC_InitStruct.LTDC_AccumulatedVBP = VSW + VBP - 1;
    LTDC_InitStruct.LTDC_AccumulatedActiveW = HSW+HBP+LCD_PIXEL_WIDTH -1;
    LTDC_InitStruct.LTDC_AccumulatedActiveH = VSW+VBP+LCD_PIXEL_HEIGHT -1;
    LTDC_InitStruct.LTDC_TotalWidth = HSW+ HBP+LCD_PIXEL_WIDTH  + HFP -1;
    LTDC_InitStruct.LTDC_TotalHeigh = VSW+ VBP+LCD_PIXEL_HEIGHT  + VFP -1;
    /*背景色*/
    LTDC_InitStruct.LTDC_BackgroundRedValue = 0x00;
    LTDC_InitStruct.LTDC_BackgroundGreenValue = 0x00;
    LTDC_InitStruct.LTDC_BackgroundBlueValue = 0xFF;
    LTDC_Init(&LTDC_InitStruct);

    LTDC_Cmd(ENABLE);
}

3.两层Layer层初始化

void BSP_LCD_Layer_Init(void)
{
    LTDC_Layer_InitTypeDef LTDC_Layer_InitStruct;
    /*Layer 1配置*/
    LTDC_Layer_InitStruct.LTDC_HorizontalStart = HBP + HSW;
    LTDC_Layer_InitStruct.LTDC_HorizontalStop = HSW+HBP+LCD_PIXEL_WIDTH -1;
    LTDC_Layer_InitStruct.LTDC_VerticalStart = VSW+ VBP;
    LTDC_Layer_InitStruct.LTDC_VerticalStop = VSW+ VBP+LCD_PIXEL_HEIGHT -1;
    LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB565;
    LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 0xFF;
    LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 0;
    LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0;
    LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 0;
    LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0;
    LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_CA;
    LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_CA;
    LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_LAYER1_Buffer_Adderess;
    LTDC_Layer_InitStruct.LTDC_CFBLineLength = LCD_PIXEL_WIDTH * 2 + 3;//行 字节数
    LTDC_Layer_InitStruct.LTDC_CFBPitch = LCD_PIXEL_WIDTH * 2;
    LTDC_Layer_InitStruct.LTDC_CFBLineNumber = LCD_PIXEL_HEIGHT;
    LTDC_LayerInit(LTDC_Layer1,&LTDC_Layer_InitStruct);
    /*Layer2*/
    LTDC_Layer_InitStruct.LTDC_HorizontalStart = HBP + HSW;
    LTDC_Layer_InitStruct.LTDC_HorizontalStop = HSW+HBP+LCD_PIXEL_WIDTH -1;
    LTDC_Layer_InitStruct.LTDC_VerticalStart = VSW+ VBP;
    LTDC_Layer_InitStruct.LTDC_VerticalStop = VSW+ VBP+LCD_PIXEL_HEIGHT  + VFP -1;
    LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_ARGB8888;
    LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 0xFF;
    LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 0;
    LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0;
    LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 0;
    LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0;
    LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_PAxCA;
    LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA;
    LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_LAYER2_Buffer_Adderess;
    LTDC_Layer_InitStruct.LTDC_CFBLineLength = LCD_PIXEL_WIDTH * 4 + 3;//行 字节数
    LTDC_Layer_InitStruct.LTDC_CFBPitch = LCD_PIXEL_WIDTH * 4;
    LTDC_Layer_InitStruct.LTDC_CFBLineNumber = LCD_PIXEL_HEIGHT;
    LTDC_LayerInit(LTDC_Layer2,&LTDC_Layer_InitStruct);
    
    LTDC_LayerCmd(LTDC_Layer1,ENABLE);
    LTDC_LayerCmd(LTDC_Layer2,ENABLE);

    LTDC_DitherCmd(ENABLE);
    LTDC_ReloadConfig(LTDC_IMReload);
}

4.LCD初始化

void BSP_LCD_Init(void)
{
    LTDC_GPIO_Init();
    BSP_LTDC_Init();
    BSP_LCD_Layer_Init();
}

5.给Layer层填入颜色白色

    /*显存地址在SDRAM中*/
    #define LCD_LAYER1_Buffer_Adderess  (0xD0000000)
    #define LCD_LAYER1_Buffer_Size      ((uint32_t)800*480*4)
    #define LCD_LAYER2_Buffer_Adderess  (LCD_LAYER1_Buffer_Adderess + LCD_LAYER1_Buffer_Size)
    #define LCD_LAYER2_Buffer_Size      (LCD_PIXEL_WIDTH*LCD_PIXEL_HEIGHT*4)
    #define WHITE               0xFFFFFFFF

void BSP_Clear_Layer2(void)
{
    uint16_t i,j;
    uint32_t *p = (uint32_t *)LCD_LAYER2_Buffer_Adderess;
 
    for(j=0;j<480;j++)
    for(i=0;i<800;i++)
        {
            *p = WHITE;
            p++;
        }
}

6.显示结果

 

posted @ 2023-10-05 23:16  Yannnnnnn  阅读(51)  评论(0编辑  收藏  举报