정보공간_1

[6기 수원 조성찬] Arm cortex-M3 시작해 보기(LED ON/OFF) 1 본문

IT 놀이터/Elite Member Tech & Talk

[6기 수원 조성찬] Arm cortex-M3 시작해 보기(LED ON/OFF) 1

알 수 없는 사용자 2014. 12. 8. 05:53

안녕하세요. 엘리트멤버 6기 수원멤버십 23-1기 조성찬입니다.

이전 포스트에서는 arm coretex-M3에 대한 기본적인 소개와 구조를 알아 보았는데, 이번 포스팅에선 arm coretex-M3를 이용해서 LEDON/OFF를 해보는 예제와 과정에 대해서 설명해 보려고 합니다.

우선 왜 LED를 키고 끄느냐? 여기엔 프로그래밍 언어를 처음 배울 때 하는 "Hello world!" 출력예제와 비슷한 의미가 있습니다. MCU 컨트롤에서 가장 기초 단위인 GPIO관련 레지스터를 제어해 보면서 기본적으로 소스 코드에서 외부로의 출력을 테스트 해보는 의미가 있죠.

그럼 실제 소스 코드를 보도록 하겠습니다.






굉장히 보기 어려운 코드가 있는데요. 우선 이 코드의 의미는 MCU의 레지스터를 직접 주소값으로 접근을 하는 방식입니다. 보기엔 난해해 보이나 기초적으로 어떤 방식으로 접근이 되는지 알아 보기 위해서 위의 예제를 준비했습니다.

우선 첫 번째 줄인 (*(volatile unsigned *) 0x40021018) |= 0x8; 의 의미는 주소값 0x40021018 부분에 0x8or 연산 하라는 뜻이죠. 좀 더 정확한 해석을 위해서 resister map을 참고하겟습니다. 우선 위의 오른쪽 표를 참고하0x40021000 주소 부터는 Reset and clock control RCC의 기능을 담당하는 레지스터임을 알 수 있습니다.

더 자세히 알아 보기 위해서 RCC register map 을 참고해 보겟습니다.


위의 레지스터 맵을 보면 0x40021018 주소는 RCC_APB2ENR를 담당하는 레지스터임을 알 수 있습니다.





위의 그림을 참고하면 (*(volatile unsigned *) 0x40021018) |= 0x8; 이 코드가 

Reset and clock control RCC -> RCC_APB2ENR -> IOPBEN 에 해당하는 bit1set 시키는 코드임을 알 수 있습니다.

결국 이 코드는 아래의 블록 다이어그램을 참고해서 보시면 MCU의 클럭 RCC를 통해서 APB2의 수많은 기능중 GPIOB 기능을 Enable 시킨다는 의미입니다.


Arm cortex-M3 는 전력 소모를 줄이기 위해 사용 하려 하는 모듈에 clockEnable 하는 과정이 선행 돼야 합니다. 그렇기 때문에 소스코드상 가장 첫번째 코드는 ClockEnable 해주는 코드가 된 것이죠앞으로 여러분이 Arm cortex-M3를 다룰 때 먼저 Clock Enable을 해 주어야 합니다

다음 그림은 지금 예제에서 필요한 부분을 표시한 블록 다이어그램입니다. 다른 기능을 사용하시려면 다른 비트를 set 해주면 됩니다. 정리하자면 우선 첫 번째 줄은 GPIOB를 사용하기에 앞서 clockEnable 해주는 과정이라고 할 수 있습니다.


자 그러면 두 번째 줄인 (* (volatile unsigned *) 0x40010C04) |= 0x10; 에 대한 해석을 진행하겠습니다.

위와 해석했던 방식으로 똑같이 아래위 그림을 참고해서 보면 0x40010C00 GPIO Port B를 제어할 수 있는 레지스터임을 알 수 있습니다또한 GPIO 레지스터 위치에서 0x04만큼 이동한 위치는 GPIOx_CRH 임을 알 수 있습니다.

 결국 0x40010C04GPIOB_CRH 레지스터가 됩니다. 여기서 (* (volatile unsigned *) 0x40010C04) |= 0x10;를 적용시킨다면 아래와 같이 레지스터의 bit가 변하게 되고 이는 결국 GPIOB_pin 9번에 해당하는 부분이 [Output mode, max speed 10MHz] + [General purpose output Open-drain]이 됨을 의미 합니다. 결국 이를 통해서 GPIOB_pin9Open-drain 상태가 되어서 LED가 켜짐을 의미합니다.



여기서 GPIOB_pin9하용 하는 이유는 이번 예제에서 사용하는 MCU 보드에선 GPIOB_pin9LED 회로가 달려 있기 때문입니다.

 

여기까지 간단하게 Arm cortex-M3에서 LED를 키는 예제를 알아 보았는데요. 기본적으로 MCU를 다룰 때 내부 레지스터 구조와 블록다이어그램 등을 보면서 접근하는 방법을 알아 보았습니다.

다음 시간에는 LED를 끄면서 점멸하는 부분과 delay에 대해서 알아 보도록 하겟습니다.


참고


ARM Cortex-M3 시스템 프로그래밍 완전정복 1

http://cafe.naver.com/embeddedcrazyboys/