정보공간_1

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

IT 놀이터/Elite Member Tech & Talk

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

알 수 없는 사용자 2014. 12. 8. 06:11

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

이번 시간엔 전시간에 이어서 LEDOFF하는 과정과 Delay 함수에 대해서 간단히 알아 보도록 합시다.

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



소스코드가 전시간에 비해서는 좀 더 길어지고 딜레이 함수가 추가적으로 구현이 되어서 들어가 있습니다. 여전히 직접 주소 접근 식으로 구성이 되어 있습니다. 구현된 소스코드와 delay 함수에 대해서 알아 봅시다.

우선 이번에 새로 추가된 부분인

 (* (volatile unsigned *) 0x40010C14) |= 0x200;

 (* (volatile unsigned *) 0x40010C10) |= 0x200;

에 대해서 알아 보겠습니다.



레지스터 맵을 자세히 보시면 0x40010C10 0x40010C14는 각각 GPIOB_BSRR, GPIOB_BRR 레지스터 임을 알 수 있습니다. 여기서 GPIOB_BSRR, GPIOB_BRR 레지스터의 기능은 각각 값을 set(1) 하거나 reset(0) 하는 역할을 수행하는 것입니다GPIOB_BSRR, GPIOB_BRR에 대해 좀 더 자세한 레지스터 맵을 참고 해서 설명을 이어 나가겟습니다.



위의 그림을 보면서 각 레지스터에 0x200or 연산을 해준다고 하GPIOB_pin9에 해당하는 bit01로 각각 변하게 되는걸 볼 수 있습니다. 그래서 코드를 실행하면 잠시 LED가 꺼졌다가 다시 켜지게 됩니다.

여기서 흥미로운 점은 GPIOB_BSRR 의 상위 8bit에 값을 Reset하는 부분이 이미 들어있고 GPIOB_BRR의 경우는 상위비트가 없다는 점입니다. 이렇게 레지스터가 편성된 이유는 MCU 및 라이브러리의 버전업 때분입니다. 과거에는 GPIOB_BSRR만으로 set 과 reset 제어를 했지만 나중에 코딩에서의 가독성과 편의를 위해서 따로 구분해서 쓰자는 주장이 나왔습니다. 그래서 GPIOB_BRR레지스터가 새로 생겨나게 되었습니다. 사실 GPIOB_BSRR에서 상위 8bit에 대해서 GPIOB_BRR를 사용하듯 연산을 하면 완전히 같은 결과를 얻을 수 있습니다. 그렇기 때문에 사용자는 두가지 모두 고려해서 취향대로 사용하면 됩니다.


 

이제 기본적인 GPIO 제어에 대해 알아보았습니다. 그럼 위에 있던 코드에서 구현된 Delay에 대해 알아보도록 해 봅시다.

위에서 구현된 Delay 함수는 다음과 같죠. 단순한 구조지만 여기서 눈여겨 볼 부분은 바로 volatile입니다.



그냥 단순히 값을 넘겨받아서 빼기만 하는 함수로 간단히 작성된 함수 이지만, 저기서 volatile을 제거 한다면 딜레이 함수는 정상적으로 작동하지 않게 됩니다. 그 이유는 컴파일러 때문인데, 컴파일러가 빌드를 하는 과정중 컴파일러 입장에서 저 함수를 보면 값을 받아서 연산만 할 뿐 다른 곳에서 그 값을 직접 활용하거나 하지 않습니다. 그렇기 때문에 컴파일러는 저 변수는 없어도 되는 변수 & 함수로 착각을 하게 되고 컴파일 타임에서 저 함수를 삭제해 버림으로서 코드를 최적화 하게 됩니다. 이를 막기 위해서 volatile을 사용하게 됩니다. 뜻은 휘발성의란 뜻을가지고 있지만 코딩에 사용하게 되면 컴파일러에게 이 변수는 사용하지 않는 것 처럼 보여도 따로 사용하는 부분이 있으니 컴파일 타임에 지우지 말고 남겨두라하는 의미입니다. 그렇기 때문에 volatile을 사용해야 delay가 정상 작동 하게 됩니다.


여기까지 기본적으로 LED를 껏다 키는 부분과 간단한 딜레이에 대해서 알아 보았습니다. 다음시간에는 저런 가독성이 나쁜 코딩이 아니라 좀더 실제적으로 어떤식으로 코딩이 될지에 대한 실제 라이브러리 사용법에 대해서 알아 보도록 하겟습니다.



참고


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

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