ST意法半导体
直播中

哈哈哈

11年用户 963经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

STM32U5+8bit_8080 LCD怎么配置touchgfx?

                                                                       
我参与的项目使用STM32U575做为主空,使用fmc来驱动8080接口的8bitLCD,配置touchgfx时不能配置为8bit,其他选型例如DMA2D也使用不了,我该怎么做?

回帖(1)

丁冬芹

2025-5-7 17:56:52

针对STM32U5系列通过FMC驱动8位8080接口LCD并集成TouchGFX的问题,以下是分步解决方案:




1. FMC硬件配置(STM32CubeMX)




  • 数据宽度配置



    • 在FMC的NOR/PSRAM控制器配置中,选择8-bit数据宽度(而非默认的16位)。

    • 检查地址线(如A6用于8080的D/CX信号)和控制信号(RD、WR、CS)的引脚分配。




  • 时序参数调整


    // 在FMC初始化代码中调整时序(示例值,需根据LCD手册优化)
    hfmc->Init.AddressSetupTime = 2;
    hfmc->Init.AddressHoldTime = 1;
    hfmc->Init.DataSetupTime = 4;
    hfmc->Init.BusTurnAroundDuration = 0;



  • DMA2D使能



    • 在CubeMX的System Core > DMA2D中启用DMA2D,并配置时钟(确保与FMC时钟无冲突)。






2. TouchGFX适配层修改




  • FrameBuffer配置



    • TouchGFXConfiguration.cpp中强制指定颜色格式为8位色(需LCD支持):
      static uint8_t frameBuffer[LCD_WIDTH * LCD_HEIGHT]; // 8-bit灰度或调色板模式
      hal.setFrameBufferStartAddress((uint16_t*)frameBuffer, 8);

    • 若LCD实际支持16/18-bit,但使用8位总线,需在写入时扩展数据位(如高位补零)。




  • 自定义数据传输函数



    • 重写HAL_LTDC_WriteReg或FMC写入函数,处理8位到LCD数据总线的映射:
      void HAL_LCD_WriteData(uint8_t data) {
      *(__IO uint8_t*)(FMC_BANK1_BASE | DCX_PIN) = data; // D/CX=1时写数据
      }






3. DMA2D与颜色格式处理




  • 颜色格式转换


    // 在TouchGFXHal.cpp中重写DMA2D配置
    void TouchGFXHAL::configureDMA2D()
    {
      DMA2D->OPFCCR = DMA2D_OUTPUT_RGB565; // 根据LCD实际格式调整
      // 若LCD为8-bit索引色,需启用调色板并配置颜色LUT
    }



  • 手动触发DMA2D传输


    void TouchGFXHAL::dma2dTransfer(const Rect& rect, const uint8_t* src)
    {
      // 配置DMA2D源地址、目标地址(FMC地址)、数据宽度
      DMA2D->CR = DMA2D_R2M; // 寄存器到内存模式
      DMA2D->OOR = LCD_WIDTH - rect.width;
      DMA2D->OMAR = (uint32_t)(fmcAddress + rect.y * LCD_WIDTH + rect.x);
      // 启动传输并等待完成
    }





4. TouchGFX Generator配置




  • Display Settings



    • 在CubeMX的TouchGFX配置中,选择Custom显示接口,禁用自动生成的LTDC配置。

    • 设置像素格式为RGB565RGB888(根据实际LCD驱动IC需求,通过8位总线分次传输)。




  • Memory Layout调整



    • 确保FrameBuffer地址与FMC映射的LCD显存地址对齐(可能需要分散加载文件修改)。






5. 调试与验证




  • 信号检查



    • 使用逻辑分析仪抓取FMC的D0-D7、WR/RD信号,确认时序符合LCD手册要求。




  • 软件调试



    • TouchGFXHAL::initialize()中插入断点,确认FrameBuffer地址正确映射到FMC。

    • 通过简单颜色填充测试(如全屏红色),验证数据传输链路。






关键代码示例


// 在stm32u5xx_hal_ltdc.c中自定义数据传输
void HAL_LTDC_WriteData(uint8_t* pData, uint32_t length) {
    for(uint32_t i=0; i         *(__IO uint8_t*)LCD_DATA_ADDR = pData[i]; // 8-bit数据写入
    }
}

// 在TouchGFX HAL层中重写数据发送
void TouchGFXHAL::flushFrameBuffer(const Rect& rect) {
    uint8_t* buffer = (uint8_t*)getFrameBuffer();
    // 将rect区域的buffer数据通过FMC发送到LCD
    HAL_LCD_WriteData(buffer + rect.y * LCD_WIDTH + rect.x, rect.width * rect.height);
}



注意事项



  • 颜色深度兼容性:若LCD实际支持16/18-bit颜色,需将TouchGFX的16/24-bit颜色拆分为多个8-bit传输。

  • 性能优化:在8位总线下,DMA2D可能无法直接加速,需权衡是否采用软件渲染或部分加速。


建议参考STM32U5的参考手册中FMC章节,以及TouchGFX手册中关于Custom Display Driver的章节。

举报

更多回帖

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