주요 내용으로 건너뛰기

MIPI-DSI Video Mode

이 섹션에서는 비디오 모드용 MIPI DSI 인터페이스를 구성하는 방법과 TouchGFX Generator에서 이 구성을 사용하는 방법에 대해 설명합니다. 이 문서에서 사용되는 예제는 24비트/RGB888 프레임 버퍼 형식에 대한 것으로, 일반적으로 STM32CubeMX에서는 다음과 같은 구성을 거쳐서 생성된 코드로 예시가 됩니다.

  • LTDC IP
  • DSI-HOST IP
  • TouchGFX Generator

STM32CubeMX - 하드웨어 구성

LTDC

  • 모드
    • Display TypeRGB888(24 bits) - DSI Mode로 설정
  • Layer Settings
    • Number of layers1 layer로 설정
    • Layer 0 - Pixel FormatRGB888로 설정
    • Layer 0 - Alpha constant for blending255로 설정

      LTDC 구성

  • NVIC 설정
    • LCD-TFT 전역 인터럽트 활성화

      LTDC NVIC 설정

DSIHOST 구성

  • 모드
    • DSIHost를 _*Video Mode**로 설정
  • 디스플레이 인터페이스
    • Color CodingRGB888 (24 bits) - DSI mode로 설정
    • 나머지 구성은 선택한 LCD HW에 따라 다릅니다.

      DSIHOST 구성

  • NVIC 설정
    • DSIHOST 전역 인터럽트는 필요하지 않기 때문에 비활성화되어야 합니다.

      DSIHOST NVIC 설정

STM32CubeMX - TouchGFX Generator

  • 모드
    • Graphics Application 활성화
  • TouchGFX Generator
    • Display / InterfaceParallel RGB (LTDC)로 설정(여전히 애플리케이션이 통신해야 하는 컨트롤러이기 때문)
    • Application Tick SourceLTDC로 설정

      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 디스플레이가 켜지지 않게 할 수 있는 한 가지 방법은 TouchGFX에서 첫 번째 프레임을 렌더링할 때까지 디스플레이를 꺼진 상태로 유지하도록 TouchGFXHAL::endFrame 함수를 보호하는 것입니다. 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();
}