지난 포스트에서 LVGL이 동작하는 것을 확인하였다. 하지만 색상이 이상하게 출력되는 문제가 있어 그것을 수정한 것을 정리한다. STM32G474 + ST7789 + LVGL 포팅 신규 프로젝트가 LCD 패널이 추가되면서, UI 출력이 필요한 상황이라 예전에 STM32F429에 LVGL 라이브러리를 포팅한 경험이 있어 이것을 사용하려고 한다. LVGL 라이브러리는 MIT 라이센서로 상용으로 memories.tistory.com LVGL RGB 순서가 ST7789 IC의 맵핑이 BRG되어 있어 아래 이미지와 같은 현상이 발생한다. 이것은 그래픽 라이브러리 포팅할 때 빈번하게 일어나는 문제이며, 셋톱박스 개발할 때도 이런 문제 때문에 스왑함수를 만들어 해결하기도 하였다. 그런데, 여기서 약간 헷갈린 상황이 ..
신규 프로젝트가 LCD 패널이 추가되면서, UI 출력이 필요한 상황이라 예전에 STM32F429에 LVGL 라이브러리를 포팅한 경험이 있어 이것을 사용하려고 한다. LVGL 라이브러리는 MIT 라이센서로 상용으로 이용해도 문제가 없기 때문에 신규 프로젝트에 사용하여도 문제가 없을 것으로 판단된다. 20년도 말에 접한 LVGL 라이브러리 버전은 7.x ~ 8.1.0 버전을 사용하였는데, 24년도 현재 v9.1.0 버전까지 릴리즈되어 최신 버전을 사용하려고 한다. 최신 버전을 사용하려는 이유는 LVGL 라이브러리가 ST7789 IC를 포팅 가이드를 제공하고 있어, 최신 버전을 사용하는 것이 정신 건강에 이로울 것이다. 포팅 가이드는 아래 사이트를 참고하면 된다. Step-by-step Guide: How t..
RPM, 오일 그리고 냉각수 게이지를 디지털 판넬에 표시하기 위해 LVGL 라이브러리의 arc 관련 함수를 사용하면 쉽게 그릴 수 있는데, 기존 소스에서 게이지바와 눈금 바늘 사이에 약간에 오차가 있어 계산을 수정하면서 LVGL arc 함수를 정리하였다. 아래 이미지는 게이지바와 눈금 바늘을 표시하는 간단한 예제이다. 위 예제처럼 게이지바는 특정 범위에 들어오면 경고를 표시하기 위해 빨간 색으로 표시하는 구간이 있으며, 눈금 바늘은 게이지바의 끝에 위치해야 한다. LVGL 라이브러리를 사용하여 호를 그리기 위해 lv_arc_create() 함수로 arc 인스턴스를 생성하도록 하고, 호의 위치와 크기를 지정하도록 한다. *arc = lv_arc_create(lv_scr_act()); lv_obj_set_p..
LVGL 8.0.2 버전을 사용하여 대시보드는 기존과 동일하게 구성하고 메뉴는 기존과 다르게 LVGL 위젯을 사용하였다. 시간에 쫓겨 메뉴 하나, 하나를 직접 그리고 GPIO input을 press / release를 직접 구현하였는데, 이번에는 LVGL 라이브러리에서 위젯을 사용하여 메뉴를 구성하였다. LVGL 에뮬레이터를 사용하여 PC에서 작업한 UI 및 메뉴는 아래 이미지와 같이 구성하였다. 기존 코드와 다르게 menu depth 기능을 추가하여 서브 메뉴를 갖을 수 있으며, 하위 메뉴를 갖는 상위 메뉴는 LVGL 8.0 버전부터 지원하는 Grid Layout을 사용하였다. 참고로, Main Menu와 Factory Setup은 하위 메뉴를 갖는 메뉴이다. 위 이미지처럼 LVGL 위젯을 사용하여 메..
LVGL은 key_read_cb에서 정상적으로 키를 올려준다면 자동으로 모든 키에 대해 repeat key 처리가 된다. 특정 키에 대해선 repeat key를 처리하지 않으려면 key_read_cb에서 키를 올려주지 않으면 key repeat interval time을 계산하지 않기 때문에 repeat key 처리가 되지 않는다. LVGL에서 repeat key 종류를 등록하는 것이 있는지 모르겠지만, 코드상 분석한 결과 key_read_cb에서 특정 키에 대해 처리하지 않으려면 LVGL 시뮬레이터인 경우 lv_drivers/indev/keyboard.c 파일을 아래와 같이 수정하면 된다. index 0c08685..d2e2a04 100644 --- a/indev/keyboard.c +++ b/inde..
기존 개발 코드는 Input device를 GPIO로 받아서 처리하였는데, LVGL input device와 연결하지 않고 GPIO를 직접 컨트롤하여 key pressed, key released 및 repeat key 처리를 구현하였다. 이렇게 직접 코딩한 이유가 있겠지만, 키처리 코드는 매우 복잡하며 메뉴하고 연결한 부분은 완전 블랙홀에 가까워 LVGL input device에 GPIO를 연결하여 키 처리하는 방법을 찾아 블로그에 정리한다. 우선 개발보드에는 버튼을 위해 아래와 같이 5개의 GPIO input을 할당하였으며, 5개의 GPIO 버튼을 LVGL 키패드로 연결하여 사용하려고 한다. uint8_t gpio_get_key_state(uint8_t key_code) { uint8_t value ..
STM32F429 개발 보드가 도착하여 LVGL 최신 버전인 8.0.2 버전으로 포팅하려고 하며, 아래 LVGL GitHub의 STM32F429 Disc 데모보드에 포팅한 예제를 함께 참고하였다. GitHub - lvgl/lv_port_stm32f429_disco: LVGL ported to STM32F429I-DISC1 using SW4STM32 (Ac6) IDE LVGL ported to STM32F429I-DISC1 using SW4STM32 (Ac6) IDE - GitHub - lvgl/lv_port_stm32f429_disco: LVGL ported to STM32F429I-DISC1 using SW4STM32 (Ac6) IDE github.com LVGL 라이브러리는 STM32 DMA2D를 사..
STM32 프로젝트에 UI 기능을 포함하기 위해 LVGL 라이브러리를 사용하려고 한다. 많은 사용자 층이 있고, 꾸준한 업데이트가 진행되고 있는 오픈소스 프로젝트이며, 결정적으로 UI 결과를 타겟보드에서 올려서 확인하는 것이 아니라 Host PC에서도 기능 확인이 가능하기 때문에 LVGL 라이브러리를 사용하기로 결정하였다. 또한, 다양한 플랫폼에 인식되어 있으며, STM32F429 DISC 데모보드에도 포팅되어 GitHub에서 예제소스를 받아서 확인할 수 있다. STM32 타켓보드에 포팅하는 방법은 다른 포스트에서 작성하기로 하고, 이 포스트에서는 LVGL 시뮬레이터를 사용하여 Host PC에서 어떻게 기능을 검증하고 개발하는 방법을 정리할 것이다. Host PC는 우분투 20.04 버전이며, Visua..
LVGL 그래픽 라이브러리를 사용하고 STM32 개발보드의 UI를 구성하려고 한다. LVGL 라이브러리는 GitHub에서 다운받아 사용할 수 있으며, 이 저장소를 내 작업환경에 서브 모듈로 등록하여 아래의 명령어를 사용하여 등록할 수 있다. $ git submodule add $ git submodule init $ git submodule update 위 명령어를 사용하여 서브모듈을 등록하면 .gitmodules 파일이 생성되며, 추가한 서브 모듈의 저장소 위치 및 로컬 경로를 확인할 수 있다. $ vi .gitmodules [submodule "Core/Src/extlib/graphic/LVGL/lvgl"] path = Core/Src/extlib/graphic/LVGL/lvgl url = git@g..