MIPI-DSI视频模式
本节介绍如何配置MIPI DSI接口工作在视频模式,以及如何在TouchGFX Generator中使用此配置。 本文使用的示例将用于24位、RGB888的帧缓存格式,通常在STM32CubeMX中进行以下配置,并使用生成的代码举例。
- LTDC IP
- DSI-HOST IP
- TouchGFX Generator
STM32CubeMX - 硬件配置
LTDC
- 模式
- 将
显示类型
设置为RGB888(24位)-DSI模式
- 将
- 层设置
- 将
层数
设置为1层 - 设置
0层-像素格式
设置为RGB888 - 设置
0层- Alpha混合常数
为255
- 将
- NVIC 设置
- 启用LCD-TFT全局中断
DSIHOST 配置
- 模式
- 将
DSIHost
设置为_*视频模式**
- 将
- 显示接口
- 将
色彩格式
设置为“RGB888(24位)- DSI模式” - 其余配置取决于所选的LCD HW
- 将
- NVIC 设置
- DSIHOST无需全局中断,应禁用。
STM32CubeMX - TouchGFX Generator
- 模式
- 启用图形应用程序
- TouchGFX Generator
- 将
显示/接口
设置为并行RGB(LTDC),因为这仍是应用程序与之通信的控制器。 - 将
应用计时源
设置为LTDC
- 将
DSIHOST / LTDC初始化顺序
对
MX_DSIHOST_DSI_Init()
的调用必须在MX_LTDC_Init()
之前完成。 应由CubeMX来处理。在用户代码部分的
MX_DSIHOST_DSI_Init()
末尾调用HAL_DSI_Start()
。在调用
HAL_DSI_Start()
之后,将DSIHOST时钟切换到DSIPHY
源。/**
* @brief DSIHOST Initialization Function
* @param None
* @retval None
*/
static void MX_DSIHOST_DSI_Init(void)
{
...
/* USER CODE BEGIN DSIHOST_Init 2 */
// Start DSI
if (HAL_DSI_Start(&hdsi) != HAL_OK)
{
Error_Handler();
}
/* 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 */
...
}用户必须在
MX_LTDC_Init()
函数的末尾添加特定于所用LCD控制器的必要初始化代码。- 该代码将基于DSI HAL API
HAL_DSI_ShortWrite()
和HAL_DSI_LongWrite
/**
* @brief LTDC Initialization Function
* @param None
* @retval None
*/
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 HAL API
更新了DSI视频模式的TouchGFXHAL类
LTDC中断的代码与使用并行RGB显示接口时生成的代码相同。
防止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();
}