부팅 속도를 개선하기 위해 대시보드 이미지 파일인 PNG를 디코딩하여 플래시에 저장하여 PNG 디코딩 과정에서 발생하는 시간을 없애 부팅 속도를 개선하려고 한다. 외부 플래시에 데이터를 저장하기 때문에 저장된 데이터의 무결성 검사를 해야하며, 일반적으로 MD5, SHA1, SHA256을 많이 사용하지만, STM32F4는 H/W CRC32만 제공하여 CRC로 데이터 무결성을 하려고 한다. STM32F4에서 H/W CRC를 사용하기 위해 아래 이미지와 같이 CubeIDE의 CRC 연산을 활성화 시키도록 한다. CubeIDE에서 CRC가 활성화되면 아래 코드가 자동으로 생성되며, 아래 생성된 CRC 핸들를 사용하여 H/W CRC 연산을 할 수 있다. static void MX_CRC_Init(void) { h..
RPM, 오일 그리고 냉각수 게이지를 디지털 판넬에 표시하기 위해 LVGL 라이브러리의 arc 관련 함수를 사용하면 쉽게 그릴 수 있는데, 기존 소스에서 게이지바와 눈금 바늘 사이에 약간에 오차가 있어 계산을 수정하면서 LVGL arc 함수를 정리하였다. 아래 이미지는 게이지바와 눈금 바늘을 표시하는 간단한 예제이다. 위 예제처럼 게이지바는 특정 범위에 들어오면 경고를 표시하기 위해 빨간 색으로 표시하는 구간이 있으며, 눈금 바늘은 게이지바의 끝에 위치해야 한다. LVGL 라이브러리를 사용하여 호를 그리기 위해 lv_arc_create() 함수로 arc 인스턴스를 생성하도록 하고, 호의 위치와 크기를 지정하도록 한다. *arc = lv_arc_create(lv_scr_act()); lv_obj_set_p..
LVGL v8.0.02 포팅 과정을 진행하면서 이전 펌웨어의 기능을 개선하고 있으며, 그 중 하나가 부팅 로고를 USB로 바꾸는 기능을 추가하려고 하는데, 개발보드에서 USB 인식이 되지 않아 STM32F429 Disc보드에서 USB OTG를 검증하였다. 디스커버리보드는 아래 이미지와 같이 Micro USB 포트를 제공하고 있어 따로 와이어 연결을 할 필요가 없다. 기본 USB 포트를 사용하려면 아래 회로도를 참조하여 CubeIDE 핀설정을 하도록 한다. PB13 / PB USB OTG 모드를 HS로 설정하여도 내부 파이 사용시에는 최대 12Mbit/s 속도로 제공되며, 외부 파이를 사용할 경우에는60Mbit/s 속도를 제공하나 아래와 같이 Disc 데모보드 그렇고 개발보드 역시 내부 파이를 사용하기 때..
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를 사..
InSync가 드디어 드롭박스를 지원하는 버전을 릴리즈 하였다. Dropbox가 연결기기 제한으로 InSyn를 설치하여 구글 드라이버와 드롭박스롤 싱크하여 드롭박스를 설치할 수 없는 PC는 InSync를 사용하는 방법 클라우드 파일을 관리하였다. 최대한 두 클라우드를 동기화 신경쓰지 않게 구성 하였지만, 그래도 여전히 하나의 클라우드를 사용할 때 보다는 신경을 써야 한다. InSync - 우분투 Google Drive 클라우드 서비스로 Dropbox를 매우 만족하며 사용하였지만, 요금 정책 개편으로 인해 무료 사용자의 연결기기 제한으로 더 이상 사용에 불편함이 있어 Google Drive로 변경하려고 한다. Google Drive App memories.tistory.com 어제 InSync에서 드롭박스..
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..
STM32 내장 FLASH가 아닌 외부 FLASH에 데이터를 읽고 쓰는 것이 가능하지만, DMA를 사용하지 않는다면 상당히 느린 속도로 데이터를 읽고 쓰게 될 것이다. FLASH는 같은 영역에 데이터를 overwrite 할 수 없기 때문에, 같은 영역에 데이터를 쓰려면 블럭 또는 섹터 단위로 기록할 영역을 지우고 써야하기 한다. 따라서, 쓰기 속도는 DMA를 사용하여도 괄목할만한 속도 개선이 되지 않지만 읽기 속도는 엄청난 향상을 볼 수 있다. 위 이미지는 1MB 데이터를 읽고 쓰는데 걸린 시간을 ms 단위로 출력한 것이며, DMA 사용 유무에 따라 읽기 속도가 확연히 차이가 나는 것을 확인할 수 있다. STM32F429에서 180MHz 시스템 클럭을 사용하고 있으며, SPI는 아래와 같이 설정하였다. ..
RDK 2021q1 릴리즈 버전은 DTVKit이 포함된 것을 확인하고, 아래 글을 참고하여 Raspberry Pi3에 RDK을 올려서 DTVKit기반으로 개발된 동작하는 DVBApp을 확인하였다. rpidtv [DTVKit Wiki] dtvkit.org DTVKit은 DVB TS를 수신하기 위한 Tuner driver가 필요하며, 이것은 LinuxTV에서 찾아 펌웨어를 설치하도록 한다. TV 수신카드도 없고, USB Tuner driver가 없는 관계로 DVB 기능은 검증할 수 없으므로, 이 기능을 제외하고 기본 DTVKit 라이브러리 구조와 DVB App이 어떻게 작성되었는지 확인하려고 한다. Yocto 기반으로 개발환경을 구성한 RDK를 매번 빌드하고 이미지를 쓰는 것은 매우 번거로운 일이며, 단순히..
Tiny Project로 CAN 송수신 모듈을 만들고 있는데, 실시간 처리가 필요없는 것은 CLI를 사용하여 하였으나 엔진 RPM 같은 경우는 J1939 스펙상 10ms 단위로 지속적으로 보내야 하며, Engine RPM 값이 가변적으로 변해야 하므로 ADC로 입력 받은 값을 Engine RPM으로 설정하여 간단한 테스트 코드를 작성하였다. STM32 핀 설정은 위와 같이 하였으며, 기존 GitHub의 CANTest2 설정에서 ADC IN7을 추가하였다. ADC 관련 부연 설명 및 관련 설정은 아래 블로그 자세히 다루고 있다. 잘 이해가 되지 않는다면 아래 동영상을 참고하면 더 좋을 것이다. [STM32 HAL] ADC#Single Conversion Reference: Mastering STM32 by..
이 블로그를 시작한지 6개월만에 방문자 수가 10,000명이 넘었다. 정확히 10,000명 되었을 때를 캡쳐하려고 했는데, 안타깝게도 그것은 실패하였다. 누구에게는 10,000명의 방문자가 블로그 개설한지 1-2개월만에 도달하는 수치이지만, 이 블로그는 꽃삽질을 방지하기 위한 블로그로 방문자가 극히 제한적일 것이라고 생각하였고, 네이버 노출이 거의 되지 않아 큰 기대없이 블로그에 글을 작성하였을 뿐이데, 생각보다 빠르게 방문자 수 10,000명에 도달한 것 같다. 위 통계 자료만 보아도 평일 방문자 수는 100명 내외이며, 주말은 60명 내외이다. 그리고 네이버나 다음에서 유입되는 수치는 1-2% 내외인 것을 확인할 수 있다. 구글이 없었다면 이 블로그의 외부 유입은 전무했을 것이다. 그리고 생각보다 직..
6월 초에 BG96 LTE&GPS 모듈을 지인에게 빌려 간단한 기능 검증을 하려고 하였지만, 6월은 올해 최악의 컨디션으로 지낸 기간이 아닐까 싶다. 6월 초에는 몸살로 일주일을 앓아 눕고 정말 체력이 떨어진것을 새삼 느끼게 되었고, 이번주는 아스트라제네카 잔여백신 예약에 성공하여 백신 접종에 따른 부작용(?)으로 며칠 몽롱한 상태로 지내다 이제야 정신을 차려 BG96 모듈의 기능을 검증하려고 한다. 지인에게 받은 모듈을 3개의 uart 포트 및 1개의 usb 포트로 구성되며, usb 포트를 연결할 경우 Quectel에서 제공하는 프로그램을 사용하여 AT 커맨드 및 시리얼을 확인할 수 있다. 만약 Quectel에서 제공하는 프로그램을 사용하지 않고 uart 포트를 연결하여 시리얼 데이터를 받고자 한다면,..