심화 과정 중 crt0에서 설명하였듯이 Reset 상태에서 main() 함수까지 진입하기 전에 처리해 주어야 하는 과정이 필요하다. 이번 글에서는 어셈블 코드로 작성했던 AVR과는 달리 C코드로 crt0 코드를 작성해 보도록 하겠다.vector.c 파일안에 있는 Reset_handler() 함수를 다음과 같이 수정한다. void Reset_handler(void) { extern int main(int, char **); extern unsigned int _etext, _sdata, _edata, _sbss, _ebss; volatile unsigned int *src, *dst; /* Relocate Data section */ for ( src = &_etext, dst = &_sdata; dst ..
프로그램을 개발할 환경이 모두 갖추어 졌으면 본격적으로 프로젝트를 하나씩 만들어 나가도록 하겠다. 이번 글에서는 최초 보드에 전원이 on 되는 시점에 어디에서 어떻게 프로그램이 동작되는지 알아보고, 실제 프로그램을 만들어서 보드에서 동작 시켜 보도록 하겠다.일반적으로 ARM에서는 memory map을 규정하지 않고, 실제 칩을 만드는 반도체 회사에서 칩의 구조에 맞게 memory map을 설정한다.하지만, Cortex-M에 대해서만은 ARM에서 memory map을 한가지 포맷으로 규정하였다.ARMv7-M Architecture Reference Manual과 ARM Cortex-M3 Processor Technical Reference Manual을 읽어 보면 ARM에서 정의한 자세한 memory ma..
하드웨어도 준비되고 개발 환경 설정도 완료되었으면 다음으로 할일은 타겟보드와 프로그래머 장비를 연결시켜 보는 일이다.STM32F103의 경우 두가지 방법으로 실행파일을 보드에 프로그램할 수 있는데 하나는 이미 앞에서 설명한대로 ST-Link/V2라는 장비를 이용해서 가능하고, 또 다른 하나는 UART를 이용한 프로그램 방법이다.먼저 ST-Link/V2를 이용한 프로그램 방법부터 설명 하도록 하겠다.보드와 ST-Link/v2와는 위의 그림과 같이 20핀 케이블을 이용하여 연결한다. 각각 USB 케이블을 이용하여 컴퓨터와 연결한다. STMicroelectronics 홈페이지에서 STM32 ST-LINK Utility라는 프로그램을 검색하여 컴퓨터에 설치한다.STM32 ST-LINK Utility를 실행하면 ..
Cortex-M 기반의 MCU 프로그램을 개발하기 위한 환경은 셀 수없이 많다.특히, ARM사에서는 CMSIS라는 일종의 device driver와 같은 API를 제공하기 때문에 이를 적용한 개발 툴들도 적지 않다.만약 회사에서나 개인이라도 상용 제품을 빠른 시간내에 개발해야 된다는 조건이 있다면 유료 개발 툴을 도입하거나 무료 제품중에서 적당한 툴을 이용하는것이 좋을것이다.그러나 이 블로그는 가급적이면 datasheet 만을 분석하여 직접 하드웨어를 제어하는 코드를 만들어 보는 것이 목적이므로, 하드웨어도 단순할 뿐 아니라 소프트웨어 개발도 오로지 GCC 컴파일러만 사용해서 진행해 볼 예정이다.개발 OS는 Linux를 이용한다. 별도의 Linux가 설치되어 있는 컴퓨터가 없다면 VirtualBox와 같..
앞의 글에서도 얘기했듯이 Cortex-M에 대한 경험이 없기 때문에 어떤 칩을 선정하는 것이 좋을지 전혀 정보가 없다. 그냥 인터넷에서 검색해 본 결과 STMicroelectronics사 제품이 대세인것 같아 보이고, 그 중에서 Cortex-M3 기반의 STM32F103에 대한 내용이 대부분인것 같아 ebay에서 STM32F103R8T6이라는 칩을 구매했다.컨버터 PCB에 위의 칩을 조립해서 다음과 같이 만들었다. 그러나 안타깝게도 아무리해도 프로그래머 장비와 연동이 되지 않아 어쩔수 없이 상용으로 나오는 개발보드를 다시 구매하게 되었다. 역시 경험도 없고 하드웨어 개발자가 아니라 ㅠㅠ...당연히 컴퓨터에서 만들어진 실행파일을 보드에 내리기 위한 프로그래머 장비도 있어야겠다.위의 그림은 ST-link/v..
임베디드 프로그램 개발을 처음 시작하는 이들에게는 AVR이 적당한 MCU라고 생각한다. 그 중에서도 ATmega 계열의 8비트 MCU는 임베디드 시스템에서 사용되는 기본 기능을 이해하고 동작 시켜 확인해보기 위한 최선의 선택이라고 믿는다.하지만, 8비트 MCU라는 구조는 분명한 한계일 수 있고, 실전에서 사용하기에도 여러가지로 불리한 점이 있다.특히 최근에 ARM의 Cortex-M을 적용한 칩들이 AVR과의 가격 경쟁에서도 우위를 점하고 있어 MCU 시장의 대세는 완전히 ARM으로 기울어 졌다고 볼 수 있다.따라서, 임베디드 시스템 개발자라면 반드시 ARM MCU를 다룰줄 알아야 하겠다.원래는 Cortex-M 전용의 블로그를 따로 만들어서 글들을 작성하려고 하였으나, 생각해 보니 쓸만한 내용들이 그리 많..
앞의 글에서 구성한 회로가 제대로 연결 되었는지 확인해 보기 위하여 nRF24L01 안에 있는 레지스터들의 default 값(reset register value)을 한번 읽어 보기로 하겠다.nRF24L01 모듈은 AVR과 SPI로 연결되어 있으며, 이미 이전에 여러 프로젝트에서 SPI통신을 해보았기 때문에 큰 어려움 없이 nRF24L01의 레지스터 값들을 읽어 올 수 있을것이다. /*============================================================================*/ #define PORTB_REG 0x23 struct port { uint8_t pin; uint8_t ddr; uint8_t port; }; volatile struct port *..
이번에 진행할 프로젝트는 nRF24L01을 이용하여 양방향 무선 통신 시스템을 만들어 보는 것이다.칩 이름에서도 알 수 있듯이 nRF24L01은 2.4GHz 대역의 주파수를 이용하고 있다.당연하지만, 이 칩이 어떤 특징을 가지고 있고, 어떻게 동작되는지 알기 위해서는 제조사의 홈페이지에서 datasheet 문서를 다운받아 자세히 분석하여야 한다.이 프로젝트에 사용할 nRF24L01 모듈은 아래 그림처럼 생겼으며 transmitter, receiver 형식으로 통신할 것이므로 2세트가 필요하다. nRF24L01 칩을 실장한 모듈은 많은 제조사에서 만들어 판매하고 있지만 외부로 나오는 pin 구성은 거의 같다고 보면 되므로 굳이 특정 회사의 제품을 구입할 필요는 없고 가격이나 배송을 고려하여 적당한 제품을 ..
이번 글에서는 mailbox에 대해서 설명하도록 하겠다. 앞의 글에서 설명한 semaphore나 flag는 이벤트가 발생했다는 것만을 알려주는것이었다면, mailbox는 어떤 이벤트가 발생했는지 그 내용을 전달해주는 기능을 제공한다. 자세한 내용은 소스를 구현해 나가면서 설명하도록 하겠다. 역시 mailbox를 구현하기 위하여 os.h에 mailbox를 위한 구조체를 선언하여야 한다. struct os_mbox { uint8_t size; uint8_t base; uint8_t count; struct list get_list; struct list put_list; void **item; }; 위의 구조체에서 item이라는 항목이 이벤트의 내용을 저장하기 위한 포인터 배열이다. size는 mailbox..
앞의 글에서 설명한 Semaphore는 단순히 이벤트가 발생했다는 것만을 알려주기 위하여 사용된다면, 이번 글에서 다룰 flag는 이벤트의 종류를 세분화 하여 알려줄수 있는 기능을 지원한다. 예를 들어 다음과 같은 상황을 상상해 보자. 몇만톤급의 호화유람선의 진수식이 조선소에서 진행되고 있다. 유람선을 구매한 선사에서 사장, 부사장, 선장, 승무원 대표 이렇게 네명과, 배를 만든 조선회사의 사장, 부사장, 공장장, 사원대표 이렇게 네명을 포함하여 모두 여덟명의 주요 인사들 앞에 스위치가 하나씩 설치되어 있다. 이제 사회자의 진행에 따라 배를 바다에 띄우기 위하여 스위치를 누르라는 얘기를 하면 각자 스위치를 누를 것이다. 이러한 상황에서 양쪽 회사의 사장과 부사장들 네명 모두 스위치를 눌렀을 때 비로소 배..