初始化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(<DC_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,<DC_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,<DC_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.显示结果