xiaolingoei 发表于 2019-3-22 10:14:29

STM32F429ZI 100引脚 驱动RGB666 LTDC

本帖最后由 xiaolingoei 于 2019-3-22 10:16 编辑

之前用STM32F429IGT6(176pin)成功驱动过RGB565,和RGB888的显示屏,现在要用STM32F429ZI(100pin)驱动RGB666,我的思路是直接用RGB565的驱动,改一下对应的引脚,以及根据屏幕datasheet配置一下参数。没想到,没有成功驱动显示屏,完全不亮。(驱动程序是按照秉火书上改的)
目前下载程序后,屏幕没有任何反应,不知道是思路上有问题,还是程序配置上有问题,麻烦各位大佬看看了!
用的是TIANMA的显示屏,具体型号是TM057QDH01,SYNC mode下的参数如下图所示:


1、根据上图,配置LTDC的参数如下:
CLK      25M
HSW   1
VSW   1
HBP   144
VBP      35
HFP      16
VFP      10


<p>//2.使用LTDC初始化结构体,配置液晶屏的控制参数
static void LCD_Mode_Config(void)
{
      LTDC_InitTypeDef      LTDC_InitTypeStruct;

      RCC_PLLSAIConfig(200,20,2);      
      
      RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div4);
      
      RCC_PLLSAICmd(ENABLE);
      
      //等待RCC时钟使能完成
      while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET);
      
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC,ENABLE);
      
      //引脚极性
      LTDC_InitTypeStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL; //HSYNC低电平有效
      LTDC_InitTypeStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL; //VSYNC低电平有效
      LTDC_InitTypeStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL; //DE低电平有效
      LTDC_InitTypeStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC;//上升沿采集数据
      
      //时间参数
      LTDC_InitTypeStruct.LTDC_HorizontalSync = HSW - 1;
      LTDC_InitTypeStruct.LTDC_VerticalSync = VSW - 1;
      LTDC_InitTypeStruct.LTDC_AccumulatedHBP = HSW + HBP - 1;
      LTDC_InitTypeStruct.LTDC_AccumulatedVBP = VSW + VBP - 1;
      
      LTDC_InitTypeStruct.LTDC_AccumulatedActiveW = HSW + HBP + LCD_WIDTH - 1;
      LTDC_InitTypeStruct.LTDC_AccumulatedActiveH = VSW + VBP + LCD_HEIGHT - 1;
      
      LTDC_InitTypeStruct.LTDC_TotalWidth =HSW + HBP + LCD_WIDTH + HFP - 1;
      LTDC_InitTypeStruct.LTDC_TotalHeigh =VSW + VBP + LCD_HEIGHT +VFP - 1;
      
      //配置底层颜色,全0为黑,全255为白
      LTDC_InitTypeStruct.LTDC_BackgroundRedValue = 0;
      LTDC_InitTypeStruct.LTDC_BackgroundGreenValue = 0;
      LTDC_InitTypeStruct.LTDC_BackgroundBlueValue = 0;
      
      LTDC_Init(<DC_InitTypeStruct);
}

//3.使用LTDC的层级初始化结构体,配置各层的控制参数
static void LCD_Layer_Init(void)
{
      LTDC_Layer_InitTypeDefLTDC_Layer_InitTypeStruct;
      
      //配置层级输出窗口
      LTDC_Layer_InitTypeStruct.LTDC_HorizontalStart = HBP + HSW;
      LTDC_Layer_InitTypeStruct.LTDC_HorizontalStop = HSW + HBP + LCD_WIDTH - 1;
      LTDC_Layer_InitTypeStruct.LTDC_VerticalStart = VBP + VSW;
      LTDC_Layer_InitTypeStruct.LTDC_VerticalStop =VSW + VBP + LCD_HEIGHT - 1;
      
      LTDC_Layer_InitTypeStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB565;
      
      //0为透明,0xFF为不透明
      LTDC_Layer_InitTypeStruct.LTDC_ConstantAlpha = 0xFF;
      LTDC_Layer_InitTypeStruct.LTDC_DefaultColorRed = 0;
      LTDC_Layer_InitTypeStruct.LTDC_DefaultColorGreen = 0;
      LTDC_Layer_InitTypeStruct.LTDC_DefaultColorBlue = 0;
      LTDC_Layer_InitTypeStruct.LTDC_DefaultColorAlpha = 0;
      
      //混合因子
      LTDC_Layer_InitTypeStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_CA;
      LTDC_Layer_InitTypeStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_CA;
      
      //配置显存相关的参数
      LTDC_Layer_InitTypeStruct.LTDC_CFBStartAdress = LCD_LAYER1_START_ADDR;
      LTDC_Layer_InitTypeStruct.LTDC_CFBLineLength = LCD_WIDTH * 2 + 3;
      LTDC_Layer_InitTypeStruct.LTDC_CFBLineNumber = LCD_HEIGHT;
      LTDC_Layer_InitTypeStruct.LTDC_CFBPitch = LCD_WIDTH * 2;
      
      LTDC_LayerInit(LTDC_Layer1,<DC_Layer_InitTypeStruct);
      
      //配置第二层
      LTDC_Layer_InitTypeStruct.LTDC_PixelFormat = LTDC_Pixelformat_ARGB8888;
      
      //混合因子
      LTDC_Layer_InitTypeStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_PAxCA;
      LTDC_Layer_InitTypeStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA;
      
      //配置显存相关的参数      
      LTDC_Layer_InitTypeStruct.LTDC_CFBStartAdress = LCD_LAYER2_START_ADDR;
      LTDC_Layer_InitTypeStruct.LTDC_CFBLineLength = LCD_WIDTH * 4 + 3;
      LTDC_Layer_InitTypeStruct.LTDC_CFBLineNumber = LCD_HEIGHT;
      LTDC_Layer_InitTypeStruct.LTDC_CFBPitch = LCD_WIDTH * 4;
      
      LTDC_LayerInit(LTDC_Layer2,<DC_Layer_InitTypeStruct);
      
      //使能两层数据源
      LTDC_LayerCmd(LTDC_Layer1,ENABLE);
      LTDC_LayerCmd(LTDC_Layer2,ENABLE);
      
      //更新配置参数
      LTDC_ReloadConfig(LTDC_IMReload);
      
      //使能抖动单元
      LTDC_DitherCmd(ENABLE);
      
      //使能LTDC
      LTDC_Cmd(ENABLE);
}</p>

wenyangzeng 发表于 2019-3-22 10:31:08

驱动LTDC需要外扩SDRAM缓存的。

xiaolingoei 发表于 2019-3-22 10:34:41

wenyangzeng 发表于 2019-3-22 10:31
驱动LTDC需要外扩SDRAM缓存的。

SDRAM没有任何问题,已经读写字节驱动成功了。不好意思,刚刚没有说显存没有问题:L

toofree 发表于 2019-3-22 12:37:09

本帖最后由 toofree 于 2019-3-22 12:41 编辑

背光有吧?电源、信号线接的都没错吧?
DE应该是高有效这种屏有HS/VS模式和DE模式,一般会有个管脚选择的。
如果没有管脚选择的话,接HS、VS时,不要接DE;接DE的话,不要接HS、VS。

xiaolingoei 发表于 2019-3-22 14:34:50

toofree 发表于 2019-3-22 12:37
背光有吧?电源、信号线接的都没错吧?
DE应该是高有效这种屏有HS/VS模式和DE模式,一般会有个管脚选择的。 ...

背光部分直接拉低了(全黑),选择的是SYNC模式,没有选择DE模式。不好意思哈......经验不够,没有说清楚,我现在在拿示波器看HS和VS波形。

xiaolingoei 发表于 2019-3-22 16:11:31

本帖最后由 xiaolingoei 于 2019-3-22 16:25 编辑

根据测量发现了一个BUG。通过分频得到的CLK应该是25M,实际上示波器测出来的却是16.667M,这块屏的驱动CLK 24.8-34.2M。
target中的设置如下:

并且使用了自带的库函数的设置函数:
HSE_SetSysClock(25,360,2,8);
将频率基准定为了25M;

根据计算,我的LTCD时钟分频后得到的CLK也应该是25M。不知道这个BUG是怎么来的?


页: [1]
查看完整版本: STM32F429ZI 100引脚 驱动RGB666 LTDC