MIPI-DSI命令模式
This scenario describes how to configure MIPI DSI interface in Command Mode and TouchGFX Generator when using a display with a Display Serial Interface (DSI) and GRAM. The example used in this article will be for 16-bit RGB565 frame buffer format and goes through configurations in STM32CubeMX.
Note
Configuration
LTDC 配置
- 模式
- 将
显示类型
设置为RGB565(16位)-DSI模式
- 将
- 层设置
- 将
层数
设置为1层 - 在
窗口位置
和帧缓冲区行长度
以及帧缓冲区行数
中设置屏幕分辨率 - 设置
0层-像素格式
设置为RGB565 - 设置
0层- Alpha混合常数
为255
- 将
- NVIC 设置
LTDC全局中断
和LTDC全局错误中断
均不需要,应禁用。
DSIHOST 配置
- 模式
- 使用TE Pin将
DSIHost
设置为_*自适应命令模式**
- 使用TE Pin将
- 显示接口
- 将
色彩格式
设置为“RGB888(16位)- DSI模式” - 根据显示宽度设置
Maximum Command Size
- 通过启用LTDC将显示帧缓冲区的
刷新设置为手动触发
- 其余配置取决于所选的LCD HW
- 将
- NVIC 设置
- 启用
DSI全局中断
- 启用
TouchGFX Generator
- 模式
- 启用图形应用程序
- TouchGFX Generator
- 将
显示/接口
设置为并行RGB(LTDC),因为这仍是应用程序与之通信的控制器。 - 将
应用计时源
设置为自定义
- 将
User Code
The TouchGFX Generator can only generate a partial TouchGFX AL that configures the LTDC to transfer pixels through the DSI Host controller from the framebuffer memory to the display and synchronize the display with the TouchGFX Engine. However, all necessary handles to accomplish this are generated by the TouchGFX Generator.
Generally, for displays with embedded GRAM, the implementation of the generated TouchGFX HAL handles in TouchGFXHAL.cpp
should perform the following steps to transfer pixels to the display and synchronize the display with the TouchGFX Engine:
- Wait for "VSYNC" (sometimes called Tearing Effect (TE) signal) to signal the TouchGFX Engine.
- Based on the area of the framebuffer to be redrawn, move the "display cursor" and "active window" (the region of the display being updated) to a place in GRAM that matches this area.
- Prepare to write incoming pixel data to GRAM. Depending on the framebuffer strategy and display interface used, this could be swapping framebuffer pointers, signaling TouchGFX Engine, or waiting for previous transfers to complete.
- Send pixel data.
Depending on the display used and the framebuffer strategy, the implementation of the above steps will vary.
Some of the adjustments that may be needed specifcally for DSI Command Mode interfaces are described below.
DSIHOST / LTDC初始化顺序
对MX_DSIHOST_DSI_Init()
的调用必须在MX_LTDC_Init()
之前完成。 This should be handled by STM32CubeMX. If this is not correct, take care to fix the order in a user code section.
After calling HAL_DSI_Start()
, switch DSIHOST clock to the DSIPHY
source:
static void MX_DSIHOST_DSI_Init(void)
{
...
/* Switch to DSI PHY PLL clock */
RCC_PeriphCLKInitTypeDef PeriphClkInit;
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_DSI;
PeriphClkInit.DsiClockSelection = RCC_DSICLKSOURCE_DSIPHY;
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);
/* USER CODE END DSIHOST_Init 2 */
...
}
User has to add the required initialization code specific to the used LCD controller at the end of the MX_LTDC_Init()
function. That code will be based on the DSI HAL APIs HAL_DSI_ShortWrite()
and HAL_DSI_LongWrite()
:
static void MX_LTDC_Init(void)
{
...
/* USER CODE BEGIN LTDC_Init 2 */
// Specific LCD controller's initialization code
...
// Exit Sleep Mode
if (HAL_DSI_ShortWrite(&hdsi, 0, DSI_DCS_SHORT_PKT_WRITE_P0, DSI_EXIT_SLEEP_MODE, 0x00) != HAL_OK)
{
Error_Handler();
}
HAL_Delay(120);
/* USER CODE END LTDC_Init 2 */
...
}
更新了DSI命令模式的TouchGFXHAL类
防止MIPI DSI显示在应用程序中的第一帧被渲染之前打开的一种方法是保护TouchGFXHAL::endFrame
功能,保持显示关闭,直至TouchGFX渲染第一帧为止。 TouchGFXHAL::endFrame()
可像下面这样更新,通过配置为PWM输出的HW定时器启用LCD及其背光。
void TouchGFXHAL::endFrame()
{
if (!display_on)
{
display_on = true;
/* Enable the LCD, Send Display on DCS command to display */
HAL_DSI_ShortWrite(&hdsi, 0, DSI_DCS_SHORT_PKT_WRITE_P1, DSI_SET_DISPLAY_ON, 0x00);
/* Start PWM Timer channel */
(void)HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_2);
/* Enable Backlight by setting Brightness to 100% */
__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, 2U * 100);
}
TouchGFXGeneratedHAL::endFrame();
}
Supported Framebuffer Strategies
- Single
- Double
- Partial - GRAM display
Further reading
DSI Command Mode usually has a high enough bandwidth to transfer pixels to GRAM fast than the display scans the pixels. This is very similar to to the FMC Parallel display interface. Therefore, the implementation steps for a working TouchGFX AL for DSI Command Mode is very similar to the FMC Parallel display interface.
Further reading
Single
Currently, no TouchGFX Board Support have a reference implementation for Single buffering with DSI Command Mode. The setup would be similar to FMC Single buffer setup, but using DSI Command Mode driver functions instead of FMC.
Double
Currently, no TouchGFX Board Support have a reference implementation for Double buffering with DSI Command Mode. The setup would be similar to FMC Double buffer setup, but using DSI Command Mode driver functions instead of FMC.
Partial - GRAM display
Currently, no TouchGFX Board Support have a reference implementation for Partial - GRAM display with DSI Command Mode. The setup would be similar to FMC Partial - GRAM display setup, but using DSI Command Mode driver functions instead of FMC.