기존 프로젝트는 None-OS 모델로 개발이 진행되어, OS 없이 개발된 코드는 인수 인계 받아 프로젝트를 진행하였지만, 이번 새로 진행하는 프로젝트는 LCD 모듈이 추가되어 OS 없이 개발이 가능하지만 개발의 효율성을 높이기 위해 STM32에서 제공하는 FreeRTOS를 적용하여 진행하기로 하였다. OS를 사용하면 쓰레드 생성 및 공유자원 접근 그리고 쓰레드간 IPC를 보다 편하게 처리할 수 있으며, tick 타임을 직접 계산하여 타이머처럼 코딩하는 것이 아니라 OS에서 제공하는 SW Timer를 사용하면 보다 편하게 코딩할 수 있다. 그런데, 이번에 FreeRTOS를 처음 접해서 케바케로 다양한 삽질을 진행중에 있다. 우선 FreeRTOS 타이머를 생성하여 500ms 마다 주기적으로 타이머 콜백함수가..
STM32CubeIDE는 다양한 플랫폼을 지원하고 있어, 설치 및 사용에는 큰 문제가 없으나 이클립스 자체가 무겁기 때문에 CLI 환경으로 GDB 및 이미지 다운로드를 하려고 한다. 최신 버전의 STM32CubeIDE(v1.15.x) 버전을 업데이트하고 STM32CubeIDE에 포함된 컴파일러, ST-Link 및 ST GDB 서버를 CLI 환경으로 사용하기 위해 아래 경로에 각 플러그인의 실행경로를 링크 파일로 생성하여 실행 경로를 설정하였다. 기존 nRF가 사용하는 arm-compiler 버전이 있어, STM32CubeIDE에서 사용하는 arm-compiler 버전을 명시하여 링크파일을 생성하였고, 이 경로를 cmake에서 컴파일 경로로 설정하면 된다. 따라서 이번 프로젝트를 진행하는 사람도 가능하면 ..
지난 포스트에서 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..
STM32 NUCLEO-474RE 개발보드에서 2.4인치 LCD 모듈을 검증하여 간단하게 정리해 둔다. 2.4인치 LCD 모듈은 ST7789 IC를 사용하며, LCD 패널은 GST2D4495을 사용한다. 데이터시트는 아래 자료를 참고하도록 한다. LCD 모듈의 터치스크린 기능이 없기 때문에 ST7789 IC는 CS / SCK / MOSI으로 구성된 SPI 3-wrie 방식으로 제공하며, LCD 패널은 RGB565 방식의 16비트 컬러를 지원한다. SPI 3-Wire 방식은 SPI TX 데이터 전송시 모든 바이트에 대해 Command / Data 인지를 판단할 수 있도록 아래 이미지와 같이 MSB에 1비트를 추가해야 한다. 따라서 이 방식을 사용할 경우 SPI 전송 데이터 크기는 8bit가 아닌 9bit로..
SHT3x-DIS 온습도 센서를 포팅할 때 I2C 폴링 방식으로 온습도 raw data를 읽어 처리하였지만, 폴링 방식을 사용할 경우 read 실행 후, 결과를 받는데 일정 시간이 소요된다. STM32 SHT3x 온습도 센서 포팅 이전 포스트에서 포팅한 ads1115 모듈은 16비트의 4채널을 가진 ADC 모듈로 외부 온도센서 등을 연결하여 온도를 측정하는 방식이라면 SHT3x는 모듈에 온습도 센서를 포함하고 있어, 추가적인 온습도 memories.tistory.com 이것은 단일 스레드 환경에서 전체 시스템의 딜레이를 발생할 수 있어 인터럽트 방식으로 하고자 하였으나, 안타깝게도 Read irq Pin은 존재하지 않고, Alert irq Pin밖에 제공하지 않는다. 그래서 기능 검증을 위해 폴링 방식으..
PT1000은 널리 쓰이는 온도센서로 온도가 높아지면 저항 값이 커지는 특성을 가지고 있다. 따라서 저항 값에 따라 온도를 측정할 수 있다. 구글링하여 보면 저항에 대한 온도 테이블이 검색되지만, 이것을 하드코딩하는 것은 매우 단순하지만 노가다라는 생각에 산술식으로 변환하려고 한다.위 표를 참고하면 PT1000은 기준 온도 0℃에서 저항값 1000을 가지며, 온도가 올라가면 저항이 커지고, 온도가 낮아지면 저항값이 작아진다. 참고로 PT100은 저항이 1/10 작은 값을 가지므로, 위 표에서 저항 값을 10으로 나눈 값으로 온도를 환산할 수 있다. 그리고, 아래 수식을 이용하여 PT100 & PT1000의 저항 값에 따른 온도를 측정할 수 있다.위 수식으로 온도를 구하려면 아래 함수를 사용하면 쉽게 구..
이전 포스트에서 포팅한 ads1115 모듈은 16비트의 4채널을 가진 ADC 모듈로 외부 온도센서 등을 연결하여 온도를 측정하는 방식이라면 SHT3x는 모듈에 온습도 센서를 포함하고 있어, 추가적인 온습도 센서를 포팅할 필요가 없다. 따라서, ads1115와 달리 레지스터 세팅도 특별히 없으며, 특정 레지스터에서 온습도 값을 읽으면 된다. 하지만 읽은 데이터의 무결성 검사를 위해 CRC8 구현해야 한다. 이것도 로직을 제공하고 있어 큰 어려움은 없다. 온습도 값은 STH3x_MEASURE_HIGHREP_STRETCH 레지스터 값을 읽으면 얻을 수 있는데, I2C read timeout 값을 최소 20ms 이상으로 설정해야 한다. uint32_t sht3x_read_temperature_humidity(f..
STM32 ADC는 12비트 resolution을 제공하지만, ads1115 IC는 16비트 ADC 4개 채널을 제공하여 STM32 ADC보다 정밀도 높기 때문에 이것을 사용하는 경우가 종종 있다. 뭐... STM32의 포트 부족으로 사용할 가능성도 있고... ads1115 IC 포팅한 소스는 구글에서 쉽게 찾을 수 있으며, 필요하다면 아래 GitHub의 F407/Sensor 디렉토리를 참고하도록 한다. 아래 코드는 ads1115 포팅뿐 만 아니라 NTC10K 3435 온도센스의 온도 변환식도 포함하고 있다. GitHub - highgon2/STM32: STM32 TestCode STM32 TestCode. Contribute to highgon2/STM32 development by creating a..
STM32F4 CAN 필터 설정을 정리한 포스트가 있는데, 이 글에서는 FDCAN 필터 설정이 기존 CAN과 약간 차이가 있어 정리해둔다. STM32 CAN 32비트 멀티 필터 설정 J1939 프로토콜의 CAN 데이터를 수신하여 처리하려면 CAN 통신속도 250kbps, 샘플포인트 87%로 설정해야 한다. 내부클럭(HSI)을 사용할 경우 MCU의 상태에 따라 클럭이 틀어져서 CAN 데이터를 수신 못하는 memories.tistory.com CAN FD 설명은 아래 포스트를 참고하면 기존 CAN과 차이점을 자세히 알 수 있다. 간단히 설명하면 CAN 버스 네트워크에 높은 부하을 줄이기 위해 Bosch에서 새롭게 발표한 CAN 프로토콜이며, 데이터 길이를 8바이트에서 64바이트로 확장하고, 최대 전송 속도를..
STM32 개발보드로 디버그문은 항상 UART 포트를 할당하여 USB2Serail을 연결하여 사용하였는데, 몇일전 자료를 찾다가 개발보드의 ST-Link USB 포트로 UART 출력이 가능하다는 글을 보게 되어 바로 테스트 해보았다. [STM32] USB를 통한 printf 사용법 USB를 사용하여 printf를 사용하는 법입니다. velog.io ST-Link USB 포트로 UART 출력하기 위해 아래 이미지와 같은 설정이 필요하다. System Core의 Sys 항목에서 Debug 모드를 Trace Asynchronous SW로 설정하고 STM32L432KC 개발보드의 Virtual COM Port가 설정되며, 이것은 UART2으로 연결된 것을 확인할 수 있다. UART2 기본 핀(PA2:Tx, PA..
STM32CubdeIDE를 최신버전을 설치한 후, 구 버전으로 작업한 프로젝트를 빌드하니 아래와 같은 에러가 발생한다. 컴파일러 버전도 함께 업데이트 되면서 발생한 문제로 생각되며, 이렇게 코딩하면 안되는데 임베디드 개발자의 습관이 무서운지라, constant로 여러 파일에 동일 이름으로 변수를 선언해서 발생한 문제인 것 같다. 이걸 어떻게 해야 하나, 검색해보니 스택오버플로우에서 -fcommon 옵션을 추가하면 이런 문제를 피할 수 있다고 한다. 그래서 아래와 같이 컴파일 옵션에 -fcommon을 추가하여 이 문제를 회피할 수 있었다. 컴파일러 버전이 올라가면서 잘못된 코딩 방법으로 작성된 코드를 에러로 처리하는 경우가 점점 늘어나는 것 같은데, 예전 프로젝트를 가끔 빌드할 때마다 이런 문제가 발생하면..
부팅 속도를 개선하기 위해 대시보드 이미지 파일인 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 데모보드 그렇고 개발보드 역시 내부 파이를 사용하기 때..