MIPI-DSI视频模式
本场景描述在使用配备显示串行接口 (DSI) 的显示屏时,如何在视频模式下配置STM32 DSIHOST以及TouchGFX Generator。
本文使用的示例将用于24位RGB888的帧缓存格式,在STM32CubeMX中进行配置,并使用生成的代码举例。
配置
LTDC 配置
- 模式
- 将
显示类型
设置为RGB888(24位)-DSI模式
- 将
- 层设置
- 将
层数
设置为1层 - 设置
0层-像素格式
设置为RGB888 - 设置
0层- Alpha混合常数
为255
- 将
- NVIC 设置
- 启用LCD-TFT全局中断
DSIHOST 配置
- 模式
- 将
DSIHost
设置为_*视频模式**
- 将
- 显示接口
- 将
色彩格式
设置为“RGB888(24位)- DSI模式” - 其余配置取决于所选的LCD HW
- 将
- NVIC 设置
- DSIHOST无需全局中断,应禁用。
TouchGFX Generator
- 模式
- 启用图形应用程序
- TouchGFX Generator
- 将
显示/接口
设置为并行RGB(LTDC),因为这仍是应用程序与之通信的控制器。 - 将
应用计时源
设置为LTDC
- 将
用户代码
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显示接口。