앞의 글들에서 설명한 DMA의 개념과 기본 동작, 그리고 주변장치와 데이터 송수신에 DMA를 사용할 수 있다는 내용을 통해서 DMA의 유용성에 대하여 충분히 이해했을것이다.이번 글에서 설명하려고 하는 DMA를 이용한 ADC 기능은 특히 DMA를 이용하는것이 얼마나 프로그램을 쉽게 할 수 있는지 보여줄 것이다.stm32f103에 있는 ADC는 최대 16개의 채널에서 데이터를 읽어 올 수 있는데, 각각의 채널에서 데이터를 읽어 오려면 상당히 귀찮은 작업을 해주어야 한다.그러나, DMA를 이용하면 CPU는 미리 설정된 주소의 메모리만 읽으면 DMA가 전달해준 새로운 값을 가져올 수 있게 된다. 이번 글에서는 ADC input 3개로부터 데이터를 읽어 오는 프로젝트를 만들어 보는것으로 하겠다.역시 ADC를 사용..
이번글에서는 SPI의 송신과 수신 기능을 DMA를 이용하여 구현해보는 방법에 대해서 설명하도록 하겠다.이미 앞의 글에서 설명한 DMA를 이용한 UART 송신 기능을 이해하였다면 이번 글에서 설명할 SPI 송수신 기능은 UART와 별다를것이 없음을 알게 될 것이다.DMA를 이용한 SPI 송수신 기능을 확인하기 위한 회로는 SPI와 같은 회로를 사용하겠다.STM32F reference manual의 DMA 챕터에서 SPI 송수신을 위한 DMA 채널 번호를 확인한다.위의 표에서와 같이 SPI 송수신을 위한 DMA 채널은 2번과 3번임을 알 수 있다.그리고, SPI에서 DMA를 이용한 송수신과 관련된 신호와 타이밍정보는 다음과 같은 그림을 보고 분석해 본다.Manual 문서를 반복해서 읽고 난 후 DMA를 이용..
이전 글에서는 memory to memory 방식의 간단한 예제를 만들어서, DMA가 무엇인지, 어떻게 동작되는지 설명하였다. 그러나, MCU에서는 memory to memory 방식보다는, 주로 주변장치를 통한 데이터 송수신을 위하여 DMA를 사용하므로, 이번 글에서는 UART 송신 기능을 DMA를 이용하여 구현하는 방법을 설명하도록 하겠다.Memory to memory DMA의 경우에는 임의의 DMA 채널을 마음대로 지정해서 사용할 수 있으나, 주변 장치와의 통신을 위하여 DMA를 사용할 경우에는 지정된 DMA 채널을 사용하여야 한다.이러한 내용은 reference manual을 보면 자세히 알 수 있다.위의 그림과 표를 보면 DMA의 각 채널별로 연결된 주변 장치가 어떤 것들이 있는지 알 수 있다...
DMA(Direct Memory Access)는 "직접 메모리 접근"이라고 번역이 된다.그렇다면 누가 메모리에 직접 접근한다는 뜻일까?답부터 바로 얘기하자면, DMA controller라는 주변 장치가 메모리에 직접 접근하여 값을 읽거나 쓸수 있다는 것이다.그럼, 왜 DMA controller라는 주변장치를 이용하여 메모리에 접근하도록 하는 것일까?C 표준 라이브러리 함수 중에 memcpy()라는 것이 있다. 이 함수는 source address가 가리키는 주소에서 데이터를 읽어 destination address 주소가 가리키는 곳에 주어진 크기만큼 데이터를 복사해주는 동작을 수행한다. 매우 단순한 동작인데, 복사하고자 하는 크기가 작을 때는 별 문제가 없지만, 만약 그 크기가 커지게 되면 그만큼 많은..
이번글에서는 stm32f103의 SPI 통신에 대해서 설명하도록 하겠다.위의 블럭도에 나오는것처럼 stm32f103에는 두개의 SPI가 있다. APB2버스에 SPI1이 있고, APB1버스에 SPI2가 하나 더 연결되어 있다.이번 글에서는 SPI1을 이용한 SPI 통신을 구현해 보는것을 설명하도록 하겠다.먼저 SPI블럭이 어떻게 구성되어 있는지 알아보기 위하여 블럭도부터 분석해본다.다른 기능들과 마찬가지로 SPI에도 다양한 설정을 이용하여 다양한 동작을 수행할 수 있으나, 가장 기본적인 동작은 CR1레지스터와 SR레지스터만 이용하여 동작 시킬 수 있다. 각 레지스터에 있는 비트필드에 대한 설명은 reference manual에 자세히 나와 있으므로 여기에서는 생략하기로 하겠다. SPI 통신 기능 확인을 위..
이번 글에서는 stm32f103에 있는 I2C를 동작시키는 방법에 대해서 설명하겠다.I2C는 TWI 혹은 TWSI라고 불리기도 하는데 AVR 입문과정중 TWI(I2C)에서 I2C에 대한 동작 원리는 이미 설명하였으므로 이번 글에서는 stm32f103에 있는 I2C를 통해서 데이터를 송수신하는 방법에 대해서만 설명할 예정이다.stm32f103 reference manual과 AN2824 STM32F10xxx I2C optimized examples라는 문서를 참고하면 I2C가 어떻게 동작되는지 자세한 내용을 살펴 볼 수 있다.먼저 블럭도를 보고 i2c 블럭에는 어떤것들이 어떻게 연결되어 있는지 전체적으로 분석해 본다.stm32f103의 i2c는 크게 세 부분으로 구성되어 있다고 볼 수 있다.데이터 송수신을..
Clock 설정 글에서 최대로 동작 가능한 시스템 클럭이 56MHz라고 설명하였다. 그리고 이후에 구현되는 기능에서는 최대 48MHz까지만 동작 가능한것을 알게 되었다. 분명히 문서에는 최대 동작 속도가 72MHz라고 되어 있고, 클럭 설정도 문서에 나와 있는대로 해주었음에도 불구하고 48MHz 이상에서는 제대로 동작되지 않아 이상하다고 생각했었는데, 왜 그런지 그 이유를 알게 되었다.Reference manual을 보면 다음과 같은 내용이 나온다.풀어서 설명하자면 다음과 같은 내용이다.프로그램이 동작하는데 필요한 명령어들은 flash 메모리 안에 저장 되어 있다. CPU core에서는 프로그램을 실행하기 위하여 명령어들을 flash 메모리로부터 읽어 오는데 CPU의 동작 속도에 비해서 flash 메모리..
이번 글에서는 stm32f103에서 제공하는 ADC에 대해서 설명하도록 하겠다.먼저 reference manual에서 ADC 블럭도를 찾아서 stm32f103에 있는 ADC가 어떻게 생겼는지 대충 살펴본다.AVR에 있는 ADC에 비해서 많이 복잡하다는 것을 알 수 있을 것이다.그만큼 제공하는 채널수도 많고 해상도도 높고 기능도 다양하다. 그러나 위의 그림처럼 몇개의 세부 블럭으로 나누어 보면 이해하기가 좀 더 쉬워지게 된다.ADC 기능의 핵심이라고 할 수 있는 빨간색 박스로 표시된 converter가 있다. Converter에는 regular channel이 있고 injected channel이 있다. stm32f103의 ADC는 설정에 따라 여러 채널에 대해서 자동으로 ADC값을 읽을수 있는데, reg..
하드웨어 준비 글에서 위에 보이는 그림처럼 보드를 만들었지만 디버거 장비와 연결이 안되어서 사용할 수 없다고 했는데, 그 이유를 알게 되었다. 결론은 VDDA와 VSSA 핀을 반드시 전원과 GND에 연결했어야 했는데 그 부분을 연결하지 않아서 디버거/프로그래머 장비에서 칩을 인식할 수 없었던 것이었다. STM32F103 datasheet에 보면 다음과 같은 내용이 나온다. 반드시 VDDA와 VSSA를 VDD와 VSS에 연결시켜야 된다라고 설명되어 있다. 또한 다음과 같은 내용도 있다. AVR에서는 VDDA 전원은 ADC를 사용할때만 연결시켜도 문제 없었는데, STM32F103의 경우 ADC뿐만 아니라 RC나 PLL도 VDDA를 이용해서 동작되고 있는것이다. 위의 그림을 보면 알수 있지만 digital 영..
이번에는 타이머 기능중 많이 사용하는 PWM 기능을 구현해 보기로 하겠다.STM32F103에 들어 있는 타이머는 AVR에 비해서 다소 복잡한 면이 있다. 일일이 그 차이점과 특징에 대해서 분석을 완료하지 못한 상태라 현재로서는 설명할 능력이 안된다.다만, 최소한의 코드를 작성하여 PWM이 동작되는지만 확인해 보는것으로 진행하도록 하겠다.시험을 위하여 PA0 핀으로 PWM 신호를 내 보내도록 하겠다. PA0 핀은 TIM2의 CH1을 설정하여 PWM으로 사용하도록 되어 있다. 동작 확인을 위하여 PA0핀에 또다른 LED 하나를 연결시키도록 한다. int main(int argc, char *argv[]) { uint32_t tim1clk, timxclk; uint32_t count = 0; sysclock_..