F429 discovery 보드에는 2.4인치 (240 x 320) LCD 디스플레이가 제공된다. 이번 프로젝트에서는 이 LCD에 3차원 구의 효과를 표현해보는 기능을 구현해 볼것이다. LCD에 원하는 그림을 그려보기 위해서는 이것 저것 설정해 주어야 할것이 있다. 그래픽 데이터를 저장하기 위하여 SDRAM 초기화를 해 주어야 하고, LCD 모듈을 설정하기 위하여 SPI5를 통하여 ILI9341를 구동시켜주어야 한다. 또한 stm32f429 칩 내부에 있는 LTDC 블럭도 설정해 주어야 한다.
이번 프로젝트는 SPI interface를 동작시키기 위하여 nrf24l01 모듈을 SPI1에 연결시키고 SPI6에는 OLED display 모듈을 연결하여 두개의 SPI가 동시에 동작되는지 확인해 보는 것이다. 먼저 nrf24l01에 있는 레지스터의 기본 값이 제대로 읽히는지 확인하기 위하여 UART 콘솔에 표시해 본다. 데이터 쉬트 문서에 나오는대로 초기값을 제대로 읽어 오는것을 확인한 다음 SPI interface로 동작되는 OLED 모듈에서 같은 값을 출력해 보기로 한다. OLED에서도 같은 값이 출력되는 것을 볼 수 있다. 따라서 두개의 SPI path에 연결된 모듈과의 통신이 제대로 되는것을 알수 있다.
이번에는 I2C에 연결된 디바이스와의 통신을 위한 코드를 만들어 보기로 했다. 프로젝트는 I2C1에 OLED 디스플레이 모듈을 연결하고, I2C3에는 AK8975, BMA150, ITG3200을 연결하여 I2C3에서 읽은 X, Y, Z 축 데이터를 OLED에 출력해 보는 것이다. 이번 프로젝트에서는 단순히 I2C 연결을 확인하는 차원에서 각종 센서 모듈에서 raw data를 출력하는 기능만 수행하도록 하였다. 시간이 되면 세가지 센서를 연동하여 나침반과 자세를 표시해보는 기능을 구현해 볼 예정이다.
임베디드 시스템 개발에서 가급적 가장 먼저 해야 할 일은 디버깅을 위한 UART 설정일 것이다. 따라서 이번에는 두 개의 UART 를 설정하여 제대로 동작되는지 알아 볼 것이다. UART1은 디버깅을 위하여 115200 bps 로 설정하여 PC와 연결하고 UART5은 GPS 모듈과 9600bps로 연결한다. GPS 모듈에서 보내주는 데이터를 곧바로 디버거 UART로 보내어 PC에서 확인하는 방법을 통하여 두개의 UART 모듈이 각각 독립적으로 잘 동작되는지 확인해 보는 것이다. 이번 프로젝트에서 사용하는 GPS 모듈은 아래 그림에서 보여지는 것을 이용하였다. 두 UART를 설정하는 코드는 다음과 같이 만든다. Uart cons{Uart::UART1}; Uart gps{Uart::UART5}; static..
본격적인 프로젝트를 시작하려면 시스템 클럭을 설정해 주어야 한다. 시스템 클럭 설정을 위해서 별도의 객체는 생성하지 않고 static 함수를 제공하는 방법을 선택하였다. #define REF_CLK 8000000 static void setup() { Flash::Flash_init(5); Rcc::Rcc_init(REF_CLK, 4, 180, Rcc::PLLP_2); Rcc::Set_bus_clock(Rcc::HPRE_1, Rcc::PPRE_4, Rcc::PPRE_2); led = new Gpio_out{Gpio::PORTG, LED_GRN|LED_RED}; led->Set_pin(LED_GRN); } 위의 설정대로 하면 180MHz로 동작하게 된다. 이렇게 빠른 속도로 동작시키기 위해서는 Flash ..
strm32f429 disovery 보드에는 파란 색의 푸쉬버튼 하나가 제공된다. 버튼 값은 GPIO port A의 0번 핀에서 읽어 볼 수 있다. 버튼을 누르게 되면 PA0의 값이 high가 된다. 이 값을 읽어 LED를 켜 보도록 하겠다. class Gpio_in : public Gpio { public: Gpio_in(PORT port, uint32_t pin, PUPD pupd=PULL_DN) : Gpio{port, pin, MODE_IN, OPEN_DRAIN, HIGH, pupd} {} uint32_t Get(uint32_t pins); bool Get_pin(uint32_t pin); }; inline bool Gpio_in::Get_pin(uint32_t pin) { if (pin & io_..
객체 지향 언어로 임베디드 시스템 프로그램 개발이 가능한 지 시험하기 위하여 가장 간단한 프로젝트를 하나 만들어 보기로 하였다. 보드에 있는 2개의 LED(Green, Red)를 제어하는 코드를 구동 시켜 봄으로써 C++로 객체를 생성하여 원하는 동작이 되는지 확인해 보겠다. 회로도에 보면 Green LED는 Port G 13번 pin에 연결되어 있고 Red LED는 같은 포트 14번 pin에 연결되어 있는것으로 표시되어 있다. 따라서 Port G 13, 14 핀을 GPIO out mode로 설정하여 LED를 켜고 끄도록 하겠다. LED가 GND에 연결되어 있으므로 Out level를 high 로 설정하면 LED가 켜지게 된다는 것을 알 수 있다. class Gpio { protected: struct ..
지금까지 여러번 C++로 객체 지향 프로그램 개발을 시도 하였으나 번번이 조금하다 말고는 포기하게 되었다. 워낙 C프로그램 개발이 익숙하다보니 C++의 새로운 개념을 받아 들이기가 쉽지 않았고, C로 안되는게 없는데 굳이 C++로 개발할 필요성을 못느끼게 되었기 때문이다. 그러다가 자바와 파이썬으로 객체 지향 프로그램을 할 기회가 있어서 몇개의 프로젝트를 진행하였고 자연히 객체 지향 프로그램의 특징과 장점을 알게되었다. 그래서 다시한번 C++ 프로그램에 도전하게 되었고, 그냥 목적없이 배우다보면 또다시 중간에 그만둘것 같아 임베디드 시스템 개발을 C++로 해보자는 확실한 목표를 세우고 진행해 보기로 하였다. 하드웨어 성능과 메모리 자원이 극히 제한적인 시절에는 어셈블리 언어 외에는 선택의 여지가 없었지만..