RT-Thread论坛
直播中

邓长生

11年用户 997经验值
擅长:可编程逻辑
私信 关注
[问答]

LCD屏幕无法正确显示效果如何解决?

问题:首先使用RT-Thread Studio创建了一个rtthread的标准工程,接着直接将正点原子例程LCD驱动的LCD文件夹和SDRAM文件夹移植到rtthread的标准工程,并做对应的适配,最后发现屏幕显示效果异常。请问这种问题应该如何解决?
实际想要的效果:

移植完成后出现的效果:

下面是移植的步骤:
1.使用RT-Thread Studio创建一个STM32F429IGT6的rtthread的标准工程。
2.找到正点原子例程:实验14 LTDC LCD(RGB屏)实验,然后将目录下面的驱动移动到rtthread例程的

3.修改SDRAM和LCD中.c.h的头文件,例如

4.通过修改link文件将LCD缓存数组定义到SDRAM里面去:


5.在main线程中初始化和写一个小方块函数:

6.下载后效果不理想。
这块驱动是正点的官方例程,在裸机的时候是没有问题的,并且我曾经在这个例程的基础上移植过rtthread的内核代码,跑起来也没有问题,包括再移植LVGL都没有问题,但是通过RT-Thread Studio创建工程再去移植就不行了,怀疑是hal库哪里有问题,但是一直没思路能够找到问题,所以发帖子请教大家!!!


回帖(1)

手托初梦

2025-10-11 16:04:43

针对LCD屏幕显示异常的问题,以下是系统性的解决方案及步骤:


1. 排查SDRAM初始化



  • 底层初始化顺序

    确保SDRAM在LCD之前初始化(修改rt_hw_board_init()顺序):
     // 在 board.c 的 rt_hw_board_init() 函数中
    void rt_hw_board_init() {
         // ...
         extern void sdram_init(void);
         sdram_init();   // 确保SDRAM初始化代码在LCD之前调用
         // ...
         extern void lcd_init(void);
         lcd_init();
    }

  • 硬件时序配置

    对照正点原子例程检查SDRAM时序参数(刷新周期、行列延迟等),确保二者一致:
     // 检查 SDRAM_Timing 结构体(例:FMC_SDRAM_TIMING_INIT结构)
    SDRAM_Timing.LoadToActiveDelay    = 2;      // TMRD
    SDRAM_Timing.ExitSelfRefreshDelay = 6;      // TXSR
    SDRAM_Timing.SelfRefreshTime      = 4;      // TRAS
    // ... 其他参数与原子例程对齐

  • 内存测试验证

    在初始化后添加SDRAM读写测试代码,确认地址读写正常:
     uint32_t *test_addr = (uint32_t*)0xC0000000;
    *test_addr = 0x12345678;
    if (*test_addr != 0x12345678) {
         rt_kprintf("SDRAM Test FAILED at 0x%xn", test_addr);
    }


2. 帧缓冲(Framebuffer)地址与Cache




  • 链接脚本定位

    修改链接脚本(link.lds),将帧缓冲定位在SDRAM起始地址,保证足够空间:


     memory {
         sdram (rwx)   : ORIGIN = 0xC0000000, LENGTH = 32M   // SDRAM地址空间
    }

    SECTIONS {
         .lcd_fb (NOLOAD) : {
             . = ALIGN(32);
             _lcd_fb_start = .;
             KEEP(*(.lcd_fb))
             . = . + 2 * 1024 * 1024;   // 假设2MB缓存
             _lcd_fb_end = .;
         } > sdram
    }


  • Cache一致性处理

    若开启Cache,必须处理数据一致性问题:
     // 在写入帧缓冲前清理Cache
    SCB_CleanDCache_by_Addr((uint32_t*)lcd_fb_address, buffer_size);

  • MPU配置(可选)

    STM32F429需配置MPU将SDRAM区域设置为Non-Cacheable
     MPU_Region_InitTypeDef MPU_InitStruct = {0};
    MPU_InitStruct.Enable = MPU_REGION_ENABLE;
    MPU_InitStruct.BaseAddress = 0xC0000000;
    MPU_InitStruct.Size = MPU_REGION_SIZE_32MB;
    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE; // 禁用Cache
    HAL_MPU_ConfigRegion(&MPU_InitStruct);


3. LCD时序与层配置



  • 时序参数校准

    核对LCD规格书及正点原子例程,检查以下关键时序(示例):
     LTDC_Handle.Init.HorizontalSync = 40;     // HSYNC宽度
    LTDC_Handle.Init.VerticalSync = 9;        // VSYNC宽度
    LTDC_Handle.Init.AccumulatedHBP = 53;     // HSYNC+水平后沿
    // ... 确保与原子代码完全一致

  • 层配置检查

    确保图层参数匹配(层1示例):
     LTDC_LayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;
    LTDC_LayerCfg.Width       = 800;          // 屏幕宽度
    LTDC_LayerCfg.Height      = 480;          // 屏幕高度
    LTDC_LayerCfg.FBStartAdress = (uint32_t)lcd_fb; // 帧缓冲地址


4. 引脚复用与时钟



  • 引脚复用确认

    使用CubeMX重新生成引脚配置,确保所有LTDC相关引脚(如RGB、HSYNC、VSYNC)被正确映射为AF14。

  • LTDC时钟源

    确认PLLSAI或PLL3提供LTDC时钟(需原子例程一致):
     // 原子例程中的时钟设置片段(HAL库)
    PeriphClkInitStruct.PLLSAI.PLLSAIN = 192;
    PeriphClkInitStruct.PLLSAI.PLLSAIR = 5;  // 分频系数
    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);


5. 硬件连接与电气测试



  • 电源与信号量测  

    • 使用万用表检查LCD供电(3.3V/5V、背光电压)是否稳定。

    • 用示波器测量LTDC时钟信号(典型值20-30MHz),确认波形无畸变。

    • 检查复位(RST)信号是否正常释放(高电平)。


  • 物理连接检查

    重新插接FPC排线,排除接触不良。


6. 调试与验证步骤




  1. 纯色填充测试

    在初始化后立即填充单一颜色,屏蔽驱动逻辑问题:


      uint16_t *fb = (uint16_t*)0xC0000000;
      for (uint32_t i = 0; i < 800*480; i++) {
          fb[i] = 0xF800;  // 红色(RGB565)
      }

    如果显示纯红色,说明LTDC基本工作。




  2. 缩小问题范围  



    • 若纯色正常 → 检查图形绘制函数(字符/图片)。

    • 若纯色异常 → 集中排查SDRAM/LTDC初始化。




  3. 日志输出跟踪

    在关键函数(初始化SDRAM、LTDC配置)后添加日志,确认函数执行状态:


      rt_kprintf("LTDC Layer1 status: %dn", HAL_LTDC_ConfigLayer(<DC_Handle, <DC_LayerCfg, 1));



总结顺序



优先验证SDRAM → 检查Cache/MPU → 校准LTDC时序 → 引脚/时钟确认 → 硬件信号测试 → 分步调试填充。



通过逐步排除配置冲突(SDRAM时序、Cache)、硬件参数(引脚、时钟)、物理连接问题,通常可解决显示异常。若仍无法解决,建议抓取LTDC时序波形与正点原子开发板对比分析。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分