STM32F429 LCD 구동 - ili9341

STM32 그래픽 라이브러리(LvGL)를 사용하려면 먼저 LCD를 동작시켜야 되기 때문에, LCD 초기화 및 제어하려면 몇가지 학습이 필요하다. 아래 블로그를 참고하여 STM32F429I-DISC1 데모보드의 LCD 관련 핀 및 모듈 설정을 한다.

 

7.[STM32F429] TFT LCD -LTDC 사용

1. STM32CubeMX 설정 여기서 중요!!! LTDC를 설정하면 핀설정이 아래와 같은데 핀설정이 실제 핀 설정이랑 틀리므로 변경 해줘야 한다. 2. TrueSTUDIO 설정 이젠 개발 환경 설정을 합시다~! 일단 BSP를 이용

hnydiy.tistory.com

위 블로그는 CubeMX와 TrueStudio로 작업하였으나, 이 포스트에서는 CubeIDE를 기준으로 정리하여, 위 블로그의 소스코드를 CubeIDE에 맞게 수정하여 다소 차이가 있다. STM32는 LTDC를 사용하여 LCD를 제어하며, LTDC 모듈을 선택하면 사용하는 핀이 설정되지만, 위 블로그에서 언급한 것처럼 잘못된 핀으로 설정되기 때문에 아래 회로를 참고 수정하도록 한다.

STM32F429I-DISC1 회로는 아래 파일을 참조하도록 한다. 위 이미지는 아래 회로도에서 LTDC와 관련된 부분만 캡쳐한 것이다.

en.MB1075-F429I-B01_Schematic.pdf
1.60MB

위 블로그를 참고하여, CubeIDE에서 LCD가 사용하는 핀설정 및 필요한 모듈을 활성화 시키고, 클럭을 설정하도록 한다.

이 포스트를 작성하는 이유 중 하나가 바로 클럭 설정에서 LCD 클럭을 어떻게 설정하는지 정리하기 위해 이 글을 작성하는 것이지만, 현재 LCD 클럭을 설정하는 기준은 아직 이해가 되지 않는 상태이다. 위 블로그에서는 6Mhz로 설정했지만, 12Mhz로 설정해도 동작상 문제는 없는 것 같다. 하지만 이것은 20Mhz로 설정할 경우 이미지가 제대로 출력되지 않는다. 이 부분은 이해가 되면 다시 정리할 예정이다.

 

STM32F429I 데모보드의 LCD는 ili9341 모델이며, 데이터시트는 아래 파일을 참고하도록 한다.

ILI9341.pdf
3.50MB

위 데이터시트를 참고하여, STM32와 연결할 핀설정 및 통신 프로토콜을 확인하도록 한다. 이 글에서는 TE는 설정하지 않는 상태이며, 아래 이미지 값으로 CubeIDE에서 LTDC 파라미터를 설정하였다.

LTDC 파라미터 설정에서 데이터시트를 참고하여 HSYNC / HBP / HFP / Width 및  VSYNC / VBP / VFP / Heigth를 설정하면 자동으로 Accumulate 값이 설정된다. 참고로 각 Accumulate 값은 아래와 같은 공식으로 계산된다.

HorizontalSync     = HSYNC - 1
VerticalSync       = VSYNC - 1
AccumulatedHBP     = HSYNC + HBP - 1
AccumulatedVBP     = VSYNC + VBP - 1
AccumulatedActiveW = HSYNC + HBP + Width - 1
AccumulatedActiveH = VSYNC + VBP + Height - 1
TotalWidth         = HSYNC + HBP + HFP - 1
TotalHeigh         = VSYNC + VBP + VFP - 1

위 블로그에서 제공하는 BSP.zip 파일에서 CubeIDE에서 생성한 I2C, SPI 코드를 사용하기 때문에 STM32F429I-Discovery 디렉토리는 제거하고 LCD IC를 초기화하는 코드 및 ST logo 이미지를 출력하는 코드만 사용하였다. 수정된 코드는 아래 GitHub의 LCDTest1에서 확인할 수 있다.

 

highgon2/STM32

STM32 TestCode. Contribute to highgon2/STM32 development by creating an account on GitHub.

github.com

위 테스트 코드는 매우 간단하며 실행시키면 아래 이미지와 같은 결과를 확인할 수 있다.

LTDC 설정이 LCD 스펙과 관련된 사항이고, 생소한 용어들이 많이 나와서 복잡하게 느껴지며, 여전히 LCD 클럭 설정은 어떻게 하는지 모르겠다. 이 부분은 제대로 알고 넘어가야 나중에 다른 LCD를 연결하더라도 쉽게 포팅할 수 있을 것 같은데...