跳转到主要内容

SPI显示接口

本场景描述在使用配备SPI串行接口和GRAM的显示屏时,如何配置SPI和TouchGFX Generator

Note
本场景假设已在板启动阶段完成可用显示驱动程序的开发。 驱动程序必须能够将像素传输到显示屏,并可以控制显示屏的像素写入位置。 如需进一步的详细信息,请查看显示屏的数据手册。

配置

SPI 配置

与其他显示接口(如FMC)相比,SPI的带宽较低。 因此需要将SPI配置优化至最高波特率,以最大化带宽。 在STM32CubeMX分类列表的Connectivity组中启用SPI。 建议为SPI配置DMA通道以最大限度减轻CPU负载。 下方示例适用于64MHz MCU,其SPI波特率上限为32 Mbit/s。

FMC Bank配置

请务必配置与显示屏保持一致的时钟参数。

TouchGFX Generator

使用SPI显示接口时,必须在TouchGFX Generator中选择自定义显示接口。 这意味着无法自动生成完整的HAL,因此开发人员必须实现手动配置和将像素从帧缓存传输到显示屏的功能。 实现此功能所需的所有句柄均由TouchGFX Generator生成:

显示接口 - 自定义

DMA配置

为最大限度减轻CPU负载,可配置一个DMA通道,将像素数据从帧缓存传输到SPI TX地址。

用户代码

对于配备嵌入式GRAM的显示屏,在TouchGFXHAL.cpp中实现生成的TouchGFX HAL句柄时,应执行以下步骤,以便将像素传输到显示屏并使显示屏与TouchGFX引擎同步:

  1. 等待“VSYNC”(有时也称为“撕裂效应 (TE) 信号”)向TouchGFX引擎发送信号。
  2. 根据要重绘的帧缓存,将“显示光标”和“活动窗口”(显示屏上正在更新的区域)移动到GRAM中与此区域对应的位置。
  3. 准备将传入的像素数据写入GRAM。 根据所使用的帧缓存策略和显示接口,这可能需要交换帧缓存指针、向TouchGFX Engine发送信号,或等待之前的传输完成。
  4. 发送像素数据。

根据所使用的显示屏和帧缓存策略,上述步骤的实现方式会有所不同。

支持的帧缓存策略

  • 单帧缓存
  • 双帧缓存
  • 部分缓存 - GRAM显示(推荐)
Further reading
有关TouchGFX中帧缓存策略的概述,请参见文章帧缓存策略

与其他显示接口相比,SPI实现的带宽有限,因此建议使用部分缓存 - GRAM显示策略。 这种策略的优点是只需使用极少的RAM(SPI通常用于RAM有限的简单系统),并通过仅向显示屏发起包含更新像素的传输来优化可用带宽的使用。 不过存在撕裂的风险。

使用SPI单缓冲可避免长时间渲染导致的撕裂。 然而SPI的低带宽意味着向显示屏传输像素的速度通常比显示屏扫描行读取GRAM缓存的速度更慢。 因此必须在TE信号的下降沿(当显示屏进入有效区域时)启动传输以避免撕裂。 过程可能如下所述:

TouchGFXHAL.cpp
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == LCD_TE_Pin)
{
// VSync发生,TouchGFX引擎的vsync计数器递增
HAL::getInstance()->vSync();
// VSync发生,向TouchGFX引擎发出信号
OSWrappers::signalVSync();
GPIO::clear(GPIO::VSYNC_FREQ);

if (refreshRequested)
{
refreshRequested = false;
nextSendToDisplayLine = refreshMinLine;
maxSendToDisplayLine = refreshMaxLine;
sendNextFrameBufferBlockToDisplay();
}
}
}
Note
如果显示传输带宽比显示屏扫描行慢,则必须在TE信号的下降沿启动传输以避免撕裂。

使用SPI双缓冲可以避免长时间渲染造成的撕裂。 但是,如果每帧传输到显示屏的像素过多,读取GRAM缓存的扫描行可能会与正在传输的区域发生冲突, 由于传输带宽过慢而导致撕裂。 通过仅传输已更新的像素区域而非整个帧缓存,可以缓解这一问题。 函数 TouchGFXHAL::flushFrameBuffer可用于计算每帧中的更新区域,从而定义要传输的最小区域。

单帧缓存

目前,TouchGFX板支持没有SPI单缓冲的参考实现。 该设置类似于FMC单缓冲设置,但 使用SPI驱动程序函数而非FMC。

双帧缓存

目前,TouchGFX板支持没有SPI双缓冲的参考实现。 该设置类似于FMC双缓冲设置,但 使用SPI驱动程序函数而非FMC。

部分缓存 - GRAM显示

TouchGFX板设置NUCLEO-G071RB + GFX01M2包含一个使用SPI的部分缓存 - GRAM显示的参考实现。 该设置类似于FMC部分缓存设置, 但使用SPI驱动程序函数而非FMC。