跳轉到主要內容

MIPI-DS影片模式

本節介紹如何為影片模式配置MIPI DSI介面,以及如何在TouchGFX Generator中使用此配置。 本文使用的範例將用於24位、RGB888和影像緩存格式,通常在STM32CubeMX中進行以下配置,並使用生成的程式碼舉例。

  • LTDC IP
  • DSI-HOST IP
  • TouchGFX Generator

STM32CubeMX - 硬體設定

LTDC

  • 模式
    • Display Type設置為RGB888(24位元)-DSI模式
  • 層設置
    • Number of layers設置為1 layer
    • 設置Layer 0 - Pixel Format設置為RGB888
    • 設置Layer 0 - Alpha constant for blending255

      LTDC設定

  • NVIC設定
    • 啟用LCD-TFT全域中斷

      LTDC NVIC 設定

DSIHOST 配置

  • 模式
    • DSIHost設定為_*Video Mode**
  • 顯示介面
    • Color Coding設定為“RGB888(24位元)- DSI模式”
    • 其餘配置取決於所選的LCD HW

      DSIHOST 配置

  • NVIC設定
    • DSIHOST無需全域中斷,應禁用。

      DSIHOST NVIC 設定

STM32CubeMX - TouchGFX Generator

  • 模式
    • 啟用Graphics Application
  • TouchGFX Generator
    • Display / Interface設定為Parallel RGB(LTDC),因為這仍是應用程式與之通信的控制器。
    • Application Tick Source設定為LTDC

      TouchGFXGenerator設定

DSIHOST / LTDC初始化順序

  • MX_DSIHOST_DSI_Init()的呼叫必須在MX_LTDC_Init()之前完成。 應由CubeMX來處理。

  • User Code部分的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();
}