跳转到主要内容

MIPI-DSI视频模式

本场景描述在使用配备显示串行接口 (DSI) 的显示屏时,如何在视频模式下配置STM32 DSIHOST以及TouchGFX Generator

本文使用的示例将用于24位RGB888的帧缓存格式,在STM32CubeMX中进行配置,并使用生成的代码举例。

配置

LTDC 配置

  • 模式
    • 显示类型设置为RGB888(24位)-DSI模式
  • 层设置
    • 层数设置为1层
    • 设置0层-像素格式设置为RGB888
    • 设置0层- Alpha混合常数255

      LTDC 配置

  • NVIC 设置
    • 启用LCD-TFT全局中断

      LTDC NVIC 设置

DSIHOST 配置

  • 模式
    • DSIHost设置为_*视频模式**
  • 显示接口
    • 色彩格式设置为“RGB888(24位)- DSI模式”
    • 其余配置取决于所选的LCD HW

      DSIHOST 配置

  • NVIC 设置
    • DSIHOST无需全局中断,应禁用。

      DSIHOST NVIC 设置

TouchGFX Generator

  • 模式
    • 启用图形应用程序
  • TouchGFX Generator
    • 显示/接口设置为并行RGB(LTDC),因为这仍是应用程序与之通信的控制器。
    • 应用计时源设置为LTDC

      TouchGFX Generator配置

用户代码

TouchGFX Generator可生成完整的TouchGFX AL,用于配置LTDC以使其通过DSI主机控制器从帧缓存存储器向显示屏传输像素,并使显示屏与TouchGFX引擎同步。 如下所述,可能只需稍作调整。

DSIHOST / LTDC初始化顺序

MX_DSIHOST_DSI_Init()的调用必须在MX_LTDC_Init()之前完成。 这应由STM32CubeMX处理。 如果不正确,需在用户代码部分修正顺序。

在调用HAL_DSI_Start() 之后,将DSIHOST时钟切换到DSIPHY源。

static void MX_DSIHOST_DSI_Init(void)
{
...
/* 切换到DSI PHY PLL时钟 */
RCC_PeriphCLKInitTypeDef PeriphClkInit;
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_DSI;
PeriphClkInit.DsiClockSelection = RCC_DSICLKSOURCE_DSIPHY;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
/* 用户编码结束DSIHOST_Init 2 */
...
}

用户必须在MX_LTDC_Init()函数的末尾添加特定于所用LCD控制器的必要初始化代码。 该代码将基于DSI HAL API HAL_DSI_ShortWrite()HAL_DSI_LongWrite()

  static void MX_LTDC_Init(void)
{
...
/* USER CODE BEGIN LTDC_Init 2 */
// Specific LCD controller's initialization code
...

// 退出睡眠模式
if (HAL_DSI_ShortWrite(&hdsi, 0, DSI_DCS_SHORT_PKT_WRITE_P0, DSI_EXIT_SLEEP_MODE, 0x00) != HAL_OK)
{
Error_Handler();
}

HAL_Delay(120);
/* 用户代码结束LTDC_Init 2 */
...
}

更新了DSI视频模式的TouchGFXHAL类

LTDC中断生成的代码与使用并行RGB显示接口时生成的代码相同。

防止MIPI DSI显示在应用程序中渲染第一帧之前打开的一种方法是保护TouchGFXHAL::endFrame函数,在TouchGFX渲染第一帧之前关闭显示。 TouchGFXHAL::endFrame()可像下面这样更新,通过配置为PWM输出的HW定时器启用LCD及其背光。

void TouchGFXHAL::endFrame()
{
if (!display_on)
{
display_on = true;
/* 开启LCD,向显示器发送Display on DCS命令 */
HAL_DSI_ShortWrite(&hdsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, DSI_SET_DISPLAY_ON, 0x00);
/* 启动PWM定时器通道 */
(void)HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_2);
/* 通过将亮度设置为100%来开启背光 */
__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, 2U * 100);
}

TouchGFXGeneratedHAL::endFrame();
}

支持的帧缓存策略

  • 单帧缓存
  • 双帧缓存
  • 部分缓存 - LTDC驱动显示
Further reading
有关TouchGFX中帧缓存策略的概述,请参见文章帧缓存策略

参考实现

TouchGFX板设置STM32U5G9J DK1包含一个以RGB888 24位帧缓存格式运行DSI视频模式的参考实现。

Further reading
有关与LTDC的DSI视频模式兼容的生成TouchGFX AL的更多信息,请参见文章LTDC显示接口