GPIO를 통한 LED 제어 글에서 LED가 일정 시간동안 켜져 있다가 다시 일정 시간이 지난 후 꺼지게 하기 위해서 for loop에 의한 시간 지연 함수를 사용했었다.그러나 그 때에는 어느정도의 시간이 지연되었는지 정확히 알 수 없었고 따라서 정확한 시간을 제어할 수가 없었다.이번 글에서는 타이머 기능을 이용하여 정확한 시간동안 delay를 주는 방법에 대해서 설명하도록 하겠다.AVR 입문 과정에서 이미 설명하였듯이 타이머 기능은 본질적으로 카운터를 이용하는 것이다. 카운터로 들어오는 입력 신호가 아주 정확한 주기로 들어온다면 타이머로도 사용할 수 있다는 설명이었다.System Timer에서 이미 Cortex-M에서 사용할 수 있는 시스템 타이머에 대해서 설명하였지만 이번에는 좀더 많은 기능을 수행할..
ARM Cortex-M 카테고리에서 설명하였던 앞의 글들은 결국은 RTOS를 만들어 가는 각 단계별 과정이라고 볼 수 있다.AVR 심화 과정중 뒷부분에 설명한 RTOS는 8비트 AVR에 맞도록 구현하였다면, 이번에는 32비트 ARM Cortex-M3에 맞도록 만들어 보았다.코드를 보면 알겠지만 Cortex-M은 AVR에 비해서 interrupt(exception) 처리과정이 많이 복잡한 구조를 가지고 있다. 이 부분을 블로그에서 설명하기에는 능력이 모자라므로, ARM Cortex-M architecture 문서와 시중에 나와 있는 책들을 참고하여 그 원리를 공부하기 바란다.이 글은 CPU 동작 원리와 RTOS를 공부하고자 하는 이들에게 참고가 될 수 있도록 하는 의미에서 작성되었으므로 굳이 RTOS에 관..
이번 글에서는 메모리 자원을 효율적으로 사용하기 위한 방법중 하나인 heap 메모리에 대해서 설명하도록 하겠다.이해를 돕기 위하여 다음과 같은 상황을 상상해 보도록 한다.서울역에서 출발하여 부산역까지 가는 기차가 있다. 이 기차에는 앉을수 있는 위치가 미리 정해져 있는 지정좌석제와 기차에 타는 순서대로 차례대로 앉게 되는 자유좌석제가 있다. 지정좌석제에는 기차가 출발하는 서울역에서부터 이용하는 승객도 있고, 중간 경유지에서 이용하는 승객이 있을 수 있다. 어쨋든 어디서부터 타든지 정확한 자기 좌석이 정해져 있으므로 비록 자리가 비어 있더라도 다른 승객이 이용할 수는 없게 된다. 자유좌석제를 이용하는 승객들은 아무자리에 가서 앉을 수 없고 맨 뒤칸 객차의 뒤쪽에서부터 차례대로 앉을 수 있다. 자유좌석제에 ..
C언어를 배울 때 가장 먼저 사용하는 함수는 printf()일것이다. 또한 C프로그램에서 가장 많이 불리워지는 함수도 printf()일것이다. 그러나 이렇게 많이 사용하고 있는 printf() 함수가 실제로 어떻게 생겼는지 그 소스를 찾아본적은 거의 없을 것이다.이번 글에서는 printf() 함수를 라이브러리에서 제공하는 것을 사용하지 않고 직접 만들어 보기로 하겠다.printf() 함수의 소스 코드는 인터넷에서 검색하면 어렵지 않게 찾을 수 있을 것이다. 이 글에서는 BSD-lite 안에 들어 있는 코드를 참조하였다.아직 C언어에 익숙하지 않은 프로그래머가 보기에는 소스코드가 다소 복잡하게 보일것이다. 따라서 이 코드를 바로 임베디드 시스템에 적용하기에 앞서 visual studio나 리눅스 환경에서 ..
앞의 글에서 설명하였던 System timer처럼 ARM core를 내장한 SoC는 인터럽트를 처리하기 위하여 별도의 interrupt controller를 주변장치의 하나로써 제공하였다. 하지만 Cortex core가 들어가 있는 SoC의 경우 ARM에서 만든 interrupt controller가 내장되어 있다.NVIC(Nested Vectored Interrupt Controller)라고하는 interrupt controller가 있는데, nested라는 말은 인터럽트가 발생하여 처리하고 있는 중에 더 높은 우선 순위의 인터럽트가 발생하면 현재 처리하고 있는 동작을 멈추고 높은 우선 순위의 인터럽트를 처리할 수 있게 하는 것이다.Vectored라는 말은 인터럽트가 발생하면 각각의 인터럽트를 처리하는..
STM32F103의 블럭도를 자세히 보면 타이머 블럭이 APB2버스에 하나, APB1버스에 세개, 모두 4개의 타이머가 연결되어 있는것을 볼 수 있다.이렇게 여러개의 타이머 블럭들이 주변장치의 한가지로 버스에 연결되어 있는데, powerPC나 MIPS CPU의 경우 CPU core 안에 OS에서 사용할 수 있도록 시스템 타이머가 기본적으로 들어 있다.ARM의 경우에는 이러한 시스템타이머가 없었는데 Cortex 시리즈가 나오면서 ARM 코어 내에 시스템 타이머가 기본으로 들어가게 되었다.당연히 Cortex-M3 코어가 내장되어 있는 STM32F103에도 시스템 타이머가 들어가 있다.이번 글에서는 이 시스템 타이머를 이용하여 정확한 delay() 함수를 구현해 보도록 하겠다.Datasheet 문서의 클럭체계..
이번글에서는 STM32F103에서의 UART 설정 방법에 대해서 설명하도록 하겠다.UART의 동작 원리에 대해서는 AVR 입문과정 UART - 원리와 연결에서 이미 설명하였기 때문에 여기에서는 UART 설정 부분에 대해서만 설명하도록 하겠다.위의 그림에서 보는바와 같이 STM32F103에는 모두 3개의 UART 블럭이 있다. UART1은 APB2버스에 연결되어 있고, UART2,3은 APB1 버스에 연결되어 있다.이 글에서는 UART1만 고려해서 설명하게 된다. UART2,3에 대해서는 UART1 설정 방법과 동일하고 단지, 버스가 달라짐과 사용하는 핀번호가 다른것만 주의해서 설정하면 큰 어려움 없이 사용가능할 것이다. UART1을 사용하기 위한 핀번호는 PA9와 PA10이다. 특히 TX핀이 PA9에 할..
AVR의 경우 클럭 설정은 fuse bit의 값을 조정함으로써 이루어졌다면, STM32F103은 프로그램으로 설정해 주어야된다는 차이점이 있다.AVR이 H/W 적인 설정에 가깝다면, STM은 S/W 설정이라고 보면 될 것이다.이번 글에서는 STM32F103에서의 클럭 설정 방법에 대해서 설명하도록 하겠다.먼저, clock 체계가 어떻게 되어 있는지 한눈에 알 수 있는 그림을 찾아보도록 한다.위의 그림이 STM32F103의 clock 체계를 일목요연하게 보여주고 있다.처음 보면 다소 복잡해 보일수도 있겠지만, datasheet를 분석해 보면 생각보다 복잡하지 않다는것을 알게 된다.그림의 빨간 박스로 표시된 HSI와 HSE가 클럭 소스이다. 이 두개 중에 하나를 클럭 소스로 선택하여야 한다. 그림에도 표시되..
AVR 입문 과정에서 했던것처럼 이번 글에서도 GPIO를 제어하여 LED를 깜빡이게 하는 방법에 대해서 설명하도록 하겠다.가지고 있는 보드에 LED하나가 PC13핀에 연결되어 있다.회로도에는 다음과 같이 연결되어 있다고 보여준다. LED의 anode핀은 Vcc에 연결되어 있고, cathod 핀은 저항을 통해 칩의 PC13핀에 연결된다. 그렇다는 얘기는 PC13핀의 전압이 0일때 LED에 불이 들어온다는 뜻이다. 코드를 작성하기 전에 STM32F103 칩이 어떻게 생겼는지 전체 블럭도를 한번 훓어보기로 하자.빨간색 박스로 표시되어 있는 부분이 가장 중요한 ARM core 블럭이다. 그림에서처럼 Bus Matrix를 통해서 Flash memory, SRAM, peripheral 블럭들과 연결되는 것을 볼 수..