일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Bidirectional Associative Memory
- 삼성전자 소프트웨어멤버십 SSM
- BAM
- 신경회로망
- 패턴 인식
- Python
- Google App Engine
- NarwalFreo
- 갤럭시탭S8울트라
- 고려대학교
- 구글 앱 엔진
- 물걸레자동세척로봇청소기
- Friendship
- 동아리
- 나르왈프레오
- 신경망
- Neural Network
- hopfield network
- 증강현실
- 하이퍼바이저
- 멤버십
- 물걸레로봇청소기추천
- 가상화
- 파이썬
- 삼성소프트웨어멤버십
- 인공지능
- 삼성
- SSM
- 빅데이터
- 패턴인식
- Today
- Total
정보공간_1
[6기 수원 조성찬] Arm cortex-M3 시작해 보기(LED ON/OFF) 1 본문
[6기 수원 조성찬] Arm cortex-M3 시작해 보기(LED ON/OFF) 1
알 수 없는 사용자 2014. 12. 8. 05:53안녕하세요. 엘리트멤버 6기 수원멤버십 23-1기 조성찬입니다.
이전 포스트에서는 arm coretex-M3에 대한 기본적인 소개와 구조를 알아 보았는데, 이번 포스팅에선 arm coretex-M3를 이용해서 LED를 ON/OFF를 해보는 예제와 과정에 대해서 설명해 보려고 합니다.
우선 왜 LED를 키고 끄느냐? 여기엔 프로그래밍 언어를 처음 배울 때 하는 "Hello world!" 출력예제와 비슷한 의미가 있습니다. MCU 컨트롤에서 가장 기초 단위인 GPIO관련 레지스터를 제어해 보면서 기본적으로 소스 코드에서 외부로의 출력을 테스트 해보는 의미가 있죠.
그럼 실제 소스 코드를 보도록 하겠습니다.
굉장히 보기 어려운 코드가 있는데요. 우선 이 코드의 의미는 MCU의 레지스터를 직접 주소값으로 접근을 하는 방식입니다. 보기엔 난해해 보이나 기초적으로 어떤 방식으로 접근이 되는지 알아 보기 위해서 위의 예제를 준비했습니다.
우선 첫 번째 줄인 (*(volatile unsigned *) 0x40021018) |= 0x8; 의 의미는 주소값 0x40021018 부분에 0x8을 or 연산 하라는 뜻이죠. 좀 더 정확한 해석을 위해서 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 에 해당하는 bit를 1로 set 시키는 코드임을 알 수 있습니다.
결국 이 코드는 아래의 블록 다이어그램을 참고해서 보시면 MCU의 클럭 RCC를 통해서 APB2의 수많은 기능중 GPIOB 기능을 Enable 시킨다는 의미입니다.
Arm cortex-M3 는 전력 소모를 줄이기 위해 사용 하려 하는 모듈에 clock을 Enable 하는 과정이 선행 돼야 합니다. 그렇기 때문에 소스코드상 가장 첫번째 코드는 Clock을 Enable 해주는 코드가 된 것이죠. 앞으로 여러분이 Arm cortex-M3를 다룰 때 먼저 Clock Enable을 해 주어야 합니다.
다음 그림은 지금 예제에서 필요한 부분을 표시한 블록 다이어그램입니다. 다른 기능을 사용하시려면 다른 비트를 set 해주면 됩니다. 정리하자면 우선 첫 번째 줄은 GPIOB를 사용하기에 앞서 clock을 Enable 해주는 과정이라고 할 수 있습니다.
자 그러면 두 번째 줄인 (* (volatile unsigned *) 0x40010C04) |= 0x10; 에 대한 해석을 진행하겠습니다.
위와 해석했던 방식으로 똑같이 아래위 그림을 참고해서 보면 0x40010C00 은 GPIO Port B를 제어할 수 있는 레지스터임을 알 수 있습니다. 또한 GPIO 레지스터 위치에서 0x04만큼 이동한 위치는 GPIOx_CRH 임을 알 수 있습니다.
결국 0x40010C04는 GPIOB_CRH 레지스터가 됩니다. 여기서 (* (volatile unsigned *) 0x40010C04) |= 0x10;를 적용시킨다면 아래와 같이 레지스터의 bit가 변하게 되고 이는 결국 GPIOB_pin 9번에 해당하는 부분이 [Output mode, max speed 10MHz] + [General purpose output Open-drain]이 됨을 의미 합니다. 결국 이를 통해서 GPIOB_pin9이 Open-drain 상태가 되어서 LED가 켜짐을 의미합니다.
여기서 GPIOB_pin9를 하용 하는 이유는 이번 예제에서 사용하는 MCU 보드에선 GPIOB_pin9에 LED 회로가 달려 있기 때문입니다.
여기까지 간단하게 Arm cortex-M3에서 LED를 키는 예제를 알아 보았는데요. 기본적으로 MCU를 다룰 때 내부 레지스터 구조와 블록다이어그램 등을 보면서 접근하는 방법을 알아 보았습니다.
다음 시간에는 LED를 끄면서 점멸하는 부분과 delay에 대해서 알아 보도록 하겟습니다.
참고
ARM Cortex-M3 시스템 프로그래밍 완전정복 1
http://cafe.naver.com/embeddedcrazyboys/
'IT 놀이터 > Elite Member Tech & Talk' 카테고리의 다른 글
[6기 수원 조성찬] Arm cortex-M3 가독성있게 코딩합시다. (0) | 2014.12.08 |
---|---|
[6기 수원 조성찬] Arm coretex - M3 시작해보기(LED ON/OFF) 2 (1) | 2014.12.08 |
[6기 강북 전영진] 리눅스 커널 심층 분석 #5 (0) | 2014.12.08 |
[6기 강남 김현호] 대학생의 시점에서 바라본 데이터 마이닝 (0) | 2014.12.04 |
[6기 강북 윤덕진] 리눅스 쉘 스크립트 프로그래밍 #4 (0) | 2014.11.28 |