Tool은 Keil uvision5를 사용했습니다. 기본적인 환경설정을 맞춰주고 컴파일을 하면 ok.
1 2 3 4 5 6 7 | int main(void) { (*(volatile unsigned *)0x40021018) |= 0x8; (*(volatile unsigned *)0x40010C04) |= 0x10; } |
망고보드에서 첫번째 예제파일로 나온 LED on 예제입니다.
3 | (*(volatile unsigned *)0x40021018) |= 0x8; |
먼저 주소 값 0x4002 1018은 Peripheral 중에 RCC(Reset and Clock Control)에 속합니다. 초기값보다 0x18이 더해졌기 때문에 자세한 내용은 Register map을 통해서 살펴볼 수 있습니다.
Register Map으로 찾아가보니 offset 0x18을 더해준 위치가 나오네요. 거기서 16진수 8값을 더해줬으니 1000. 즉 3번째 위치에 1이 들어갑니다. 이 값은 소프트웨어에 의해서 값이 설정될 수 있는데 0이 입력되면 해당 포트는 Disable, 1이 입력되면 해당 포트는 Enable됩니다. 즉 해당 포트에 1이 들어가면 우리가 원하는대로 사용할 수 있다는 말입니다. Register Map에서는 IOPBEN을 Enable해주었으니 앞으로 Port B를 사용할 수 있다는 말이기도 합니다. (IOPBEN : Input/Output Port B Clock Enable)
자, 이제 Port B를 열어주었으니 해당 포트의 핀을 이용해서 LED를 켜주면 됩니다. Port B에 해당하는 레지스터 주소 값을 살펴봅시다.
0x4001 0C00에 0x04를 더해주면 GPIOB_CRH의 레지스터 값이 나옵니다. 총 32비트로 구성된 이 레지스터들은 4비트씩 총 8개가 존재하고 각각은 CNF 2비트, MODE 2비트로 쓰여집니다. CNF는 CoNFiguration, Mode는 말 그대로 모드. 자세한 설명은 해당 레지스터 설명을 읽어보면 됩니다. 예제에서는 0x10 값을 세트시켰으니 MODE8(2비트)에 10이 들어갑니다.
5 | (*(volatile unsigned *)0x40010C04) |= 0x10; |
여기서 GPIOx_CRL과 GPIOx_CRH 레지스터가 있는데 역할은 같습니다. 다만 이렇게 나눠놓은 건 망고보드 M32 기준으로 사용할 수 있는 Port는 총 15개가 있는데 한 레지스터가 이들을 커버할 수 없어서 두 레지스터로 나눠 상위(8~15pin)는 CRH, 하위(0~7pin)는 CRL이 담당합니다
MODE에 10이 들어가면 Output mode, max speed 2 MHz로 구성되어 있습니다. 속도를 좀 더 올리고 싶다면 세트해줬던 0x10값을 0x01이나 0x11로 해주면 됩니다. CNF 같은 경우도 상황에 따라서 값을 세트 시켜서 사용하면 되는데, 여기서는 별도로 세트해주지 않았으니 디폴트 값인 0x04값이 사용됩니다. 10. 즉,input with pull-up / pull-down이 사용됩니다.
'개인자료 > 프로그래밍' 카테고리의 다른 글
[150615] ARM Crash Course (0) | 2015.06.21 |
---|---|
[STM32F103x] PWM (0) | 2015.06.20 |
[STM32F103x] 외부 인터럽트(TIMx_EXTI) (0) | 2015.06.20 |
[STM32F103x] 타이머(Timer) (1) | 2015.06.13 |
[150609] Crosstool-ng를 이용한 Toolchain 만들기 (0) | 2015.06.09 |
망고보드(M32) 시리얼 케이블 만들기_Serial to 3Pin (0) | 2015.06.02 |
Embedded Reference (0) | 2015.06.02 |
ARM에 사용되는 Register (0) | 2015.06.01 |
임베디드 레시피 및 망고보드(Cortex M-3) 구입 (0) | 2015.05.29 |
[임베디드 C] 비트 연산 매크로 (0) | 2015.05.17 |