跳转到主要内容

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

      LTDC 配置

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

      LTDC NVIC 设置

DSIHOST 配置

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

      DSIHOST 配置

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

      DSIHOST NVIC 设置

STM32CubeMX - TouchGFX Generator

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

      TouchGFX Generator配置

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视频模式的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();
}