硬汉嵌入式论坛

 找回密码
 立即注册
查看: 136|回复: 5
收起左侧

【求助】使用STM32F429驱动RGB565屏幕总是颜色设置全屏覆盖

[复制链接]

2

主题

5

回帖

11

积分

新手上路

积分
11
发表于 2025-5-19 15:36:12 | 显示全部楼层 |阅读模式
使用ST论坛上面得一份参考代码,修改好适配自己的硬件配置后,想要看下LCD读写效果,我就调用了一个画线函数,发现设置文本颜色时,总是设置的时整个屏幕得颜色,并没有看到线,而且我配置成layer1&layer2后,layer1做为背景层设置为黄色,然后在将文本设置为前景层,蓝色,上电时发现黄色直接被蓝色覆盖,实在搞不清楚啥问题,感觉像是LCD缓存地址被覆盖的意思,SDRAM没起作用似的。


代码片段如下:


/* Global variables to set the written text color */


/* LCD Size (Width and Height) */
#define  LCD_PIXEL_WIDTH    ((uint16_t)800)
#define  LCD_PIXEL_HEIGHT   ((uint16_t)480)

#define LCD_FRAME_BUFFER       (SDRAM_BANK_ADDR)
#define BUFFER_OFFSET            ((uint32_t)LCD_PIXEL_WIDTH*LCD_PIXEL_HEIGHT*2)


static uint16_t CurrentTextColor   = 0x0000;//LCD_COLOR_BLACK
static uint16_t CurrentBackColor   = 0xFFFF;//LCD_COLOR_WHITE
/* Default LCD configuration with LCD Layer 1 */
static uint32_t CurrentFrameBuffer = LCD_FRAME_BUFFER  ;
static uint32_t CurrentLayer       = LCD_BACKGROUND_LAYER;




void LCD_LayerInit(void)
{
  LTDC_Layer_InitTypeDef LTDC_Layer_InitStruct;
/*初始化 LTDC 的层参数
** LTDC共有3层,分别为:LTDC背景层(颜色恒定),第一层(背景层),第二层(前景层)
*/
    /* 层窗口配置 */
    LTDC_Layer_InitStruct.LTDC_HorizontalStart = HBP + HSW;
    LTDC_Layer_InitStruct.LTDC_HorizontalStop  = HSW+HBP+LCD_PIXEL_WIDTH-1;
    LTDC_Layer_InitStruct.LTDC_VerticalStart   = VBP + VSW;
    LTDC_Layer_InitStruct.LTDC_VerticalStop    = VSW+VBP+LCD_PIXEL_HEIGHT-1;
    LTDC_Layer_InitStruct.LTDC_PixelFormat     = LTDC_Pixelformat_RGB565;/* 像素格式配置 */
    /* 默认背景颜色,该颜色在定义的层窗口外或在层禁止时使用。 */
    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_ConstantAlpha     = 255;/* 恒定 Alpha 值配置,0-255(完全不透明)*/
               
    /* 配置混合因子 CA 表示使用恒定 Alpha 值,PAxCA 表示使用像素 Alpha x 恒定 Alpha
    值 */
    LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_CA;
    LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_CA;
    /* 该成员应写入 (一行像素数据占用的字节数 +3)
    Line Lenth = 行有效像素个数 x 每个像素的字节数 + 3
    行有效像素个数 = LCD_PIXEL_WIDTH
    每个像素的字节数 = 2(RGB565/RGB1555)/ 3 (RGB888)/ 4(ARGB8888)
    */
    LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((LCD_PIXEL_WIDTH * 2) + 3);
    /* 从某行的起始位置到下一行起始位置处的像素增量
    Pitch = 行有效像素个数 x 每个像素的字节数 */
    LTDC_Layer_InitStruct.LTDC_CFBPitch      = (LCD_PIXEL_WIDTH * 2);
    LTDC_Layer_InitStruct.LTDC_CFBLineNumber = LCD_PIXEL_HEIGHT;/* 配置有效的行数 */
    LTDC_Layer_InitStruct.LTDC_CFBStartAdress= LCD_FRAME_BUFFER;//LCD_FRAME_BUFFER;/* 配置本层的显存首地址 */
    /* 以上面的配置初始化第 1 层 */
    LTDC_LayerInit(LTDC_Layer1, &LTDC_Layer_InitStruct) ;
#if 1               
    /*配置第2层,若没有重写某个成员的值,则该成员使用跟第1层一样的配置*/
    /*配置本层的显存首地址,这里配置它紧挨在第1层的后面*/
    LTDC_Layer_InitStruct.LTDC_CFBStartAdress= LCD_FRAME_BUFFER+ BUFFER_OFFSET;
    /*配置混合因子,使用像素Alpha参与混合*/
    LTDC_Layer_InitStruct.LTDC_BlendingFactor_1=LTDC_BlendingFactor1_PAxCA;
    LTDC_Layer_InitStruct.LTDC_BlendingFactor_2=LTDC_BlendingFactor2_PAxCA;
    /*初始化第2层*/
    LTDC_LayerInit(LTDC_Layer2,&LTDC_Layer_InitStruct);
#endif
    /*使能前景及背景层*/
    LTDC_LayerCmd(LTDC_Layer1,ENABLE);       
#if 1               
    LTDC_LayerCmd(LTDC_Layer2,ENABLE);
#endif               
    /*立即重载配置*/
    LTDC_ReloadConfig(LTDC_IMReload);
    LTDC_Cmd(ENABLE); /* display ON */       

}


/**
  * @brief  Displays a line.
  * @param Xpos: specifies the X position, can be a value from 0 to 240.
  * @param Ypos: specifies the Y position, can be a value from 0 to 320.
  * @param Length: line length.
  * @param Direction: line direction.
  *   This parameter can be one of the following values: LCD_DIR_HORIZONTAL or LCD_DIR_VERTICAL.
  * @retval None
  */
void LCD_DrawLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length, uint8_t Direction)
{
  DMA2D_InitTypeDef      DMA2D_InitStruct;
  
  uint32_t Xaddress = CurrentFrameBuffer + 2*(LCD_PIXEL_WIDTH*Ypos + Xpos);

  uint16_t Red_Value = (0xF800 & CurrentTextColor) >> 11;
  uint16_t Blue_Value = 0x001F & CurrentTextColor;
  uint16_t Green_Value = (0x07E0 & CurrentTextColor) >> 5;

  /* Configure DMA2D */   
  DMA2D_DeInit();  
  DMA2D_InitStruct.DMA2D_Mode        = DMA2D_R2M;      
  DMA2D_InitStruct.DMA2D_CMode       = DMA2D_RGB565;      
  DMA2D_InitStruct.DMA2D_OutputGreen = Green_Value;      
  DMA2D_InitStruct.DMA2D_OutputBlue  = Blue_Value;     
  DMA2D_InitStruct.DMA2D_OutputRed   = Red_Value;               
  DMA2D_InitStruct.DMA2D_OutputAlpha = 0x0F;                  
  DMA2D_InitStruct.DMA2D_OutputMemoryAdd = Xaddress;                  
  
  if(Direction == LCD_DIR_HORIZONTAL)
  {                                                      
    DMA2D_InitStruct.DMA2D_OutputOffset = 0;               
    DMA2D_InitStruct.DMA2D_NumberOfLine = 1;            
    DMA2D_InitStruct.DMA2D_PixelPerLine = Length;
  }
  else
  {                                                            
    DMA2D_InitStruct.DMA2D_OutputOffset = LCD_PIXEL_WIDTH - 1;               
    DMA2D_InitStruct.DMA2D_NumberOfLine = Length;            
    DMA2D_InitStruct.DMA2D_PixelPerLine = 1;  
  }
  
  DMA2D_Init(&DMA2D_InitStruct);  
  /* Start Transfer */
  DMA2D_StartTransfer();  
  /* Wait for CTC Flag activation */
  while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET)
  {
  }
  
}




//------------------------------------------------------------------------------
//主函数
//------------------------------------------------------------------------------
int main(void)
{
  LCD_Init();                                                                                        //LCD初始化
  LCD_LayerInit();                                                                //LCD层次显示初始化  
        LTDC_Cmd(ENABLE);                                                                //打开LTDC
  LCD_SetLayer(LCD_BACKGROUND_LAYER);                //设置为背景层
  LCD_SetTransparency(120);                                                  //背景层透明度
        LCD_Clear(LCD_COLOR_YELLOW);
        LCD_SetLayer(LCD_FOREGROUND_LAYER);                        //把LCD设置为前景显示层
        LCD_SetTransparency(120);                                //前景层透明度       
        LCD_SetTextColor(LCD_COLOR_BLUE);
        while(1)
        {        
                LCD_DrawLine(20,50,200,LCD_DIR_VERTICAL);                       
        }
}




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115988
QQ
发表于 2025-5-20 09:42:56 | 显示全部楼层
这个问题的排查是这样,f429不是有背景层,图层1图层2,优先看背景层是否正常,正常后,测试图层1,配置上关闭图层2,然后图层1的显存填充三原色看看正常不,这个正常就没问题
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2025-5-20 10:22:17 | 显示全部楼层
eric2013 发表于 2025-5-20 09:42
这个问题的排查是这样,f429不是有背景层,图层1图层2,优先看背景层是否正常,正常后,测试图层1,配置上 ...

已解决,是SDRAM引脚配置漏了引起的
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2025-5-20 14:50:54 | 显示全部楼层
【帖内再求助】 移植V9.2 LVGL后,不显示控件,调了stack也没用,disp_flush改了多个版本也为见效;
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2025-5-20 14:53:16 | 显示全部楼层
【帖内再求助】移植了LVGL V9后,只是让她显示label都不显示,尝试修改了stack_size也没有用
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2025-5-20 14:54:38 | 显示全部楼层
static void disp_flush(lv_display_t * disp_drv, const lv_area_t * area, uint8_t * px_map)接口实现函数是:void lcd_win_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t *fill_color) {  for (uint16_t y = sy; y < ey + 1; y++)          {       for (uint16_t x = sx; x< ex + 1; x++)                    {                                 ltdc_draw_point(x,y,*fill_color);         fill_color++;       }                 } }       
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-2 02:17 , Processed in 0.233467 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表