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 blending
為255
- 將
- NVIC設定
- 啟用LCD-TFT全域中斷
DSIHOST 配置
- 模式
- 將
DSIHost
設定為_*Video Mode**
- 將
- 顯示介面
- 將
Color Coding
設定為“RGB888(24位元)- DSI模式” - 其餘配置取決於所選的LCD HW
- 將
- NVIC設定
- DSIHOST無需全域中斷,應禁用。
STM32CubeMX - TouchGFX Generator
- 模式
- 啟用Graphics Application
- TouchGFX Generator
- 將
Display / Interface
設定為Parallel RGB(LTDC),因為這仍是應用程式與之通信的控制器。 - 將
Application Tick Source
設定為LTDC
- 將
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 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();
}