본문 바로가기

Embedded System

TM4C123GH6PM으로 LED 제어하기!

TM4C123GH6PM은 Texas Instruments사에서 제조한  ARM Cortex-M4 기반 마이크로컨트롤러로, 저전력과 높은 성능이 요구되는 임베디드 시스템에 적합하다. EK-TM4C123GXL보드( 이하 개발보드)는 32bit 프로세서를 탑재하고 80MHz의 속도로 동작한다.

 

32bit 프로세서란 CPU가 한번에 32비트의 정보를 처리한다는 의미이다. 1 BYTE == 8bit 이므로, 한번에 4B의 정보를 처리하는 것이다.

80MHz는 마이크로컨트롤러의 클럭(Clock) 속도를 의미한다. 이는 마이크로 컨트롤러의 심장과도 같은 역할인데, 80MHz의 의미는 초당 8000만개의 명령을 해석한다는 의미 이다. 체감이 안 될 정도로 매우 빠른 속도이다! 

 

또한 256KB의 플래시 메모리와 32KB의 SRAM을 가지고 있다. 아두이노 Uno의 SRAM이 2KB임을 비교하면 더욱 고성능의 작업을 수행하기에 알맞은 보드임을 알 수 있다.

 

메모리나 마이크로 프로세서의 구성은 나중에 따로 자세히 포스팅 하도록 하겠다.

아래 보드의 제조사인 TI사의 웹페이지에 들어가면 EK-TM4C123GXL의 매뉴얼을 다운로드 받을 수 있다.

https://www.ti.com/product/TM4C123GH6PM

 

 

TM4C123GH6PM를 탑재한 EK-TM4C123GXL

 

 

위의 사진이 TM4C123GH6PM를 탑재하고 있는 EK-TM4C123GXL 보드이다. 

 

위의 보드에 내장되어 있는 LED를 제어해 볼 것이다. LED를 제어하기 이전에 보드의 구성도를 보아야 할 필요가 있다.

 

 

 

오른쪽의 회로도는 TI사의 데이터시트에서 필자가 가져온것 인데, 왼쪽 보드 하단의 스위치 SW1, SW2의 연결과 보드 내장 LED의 연결이 어떤 포트에 연결되어 있는지를 보여준다. 따라서 LED를 제어하기 위해 PF1, PF2, PF3을 조정하면 된다. 이를 조정하기 위해서는 개발 보드에 실행 파일을 업로드 해야하는데 개발 환경과 타겟 보드가 다를때 이를 Cross Compile이라고 한다. 

 

따라서 LED를 제어하기 위해서 TI사에서 제공하는 Cross Compiler를 사용할 필요가 있다. 마찬가지로 TI사의 웹페이지에서 무료로 다운로드 받을 수 있다. 

 

이제 개발 보드와 크로스-컴파일러를 USB 케이블로 연결하자.

이때 개발 보드에는 두 개의 USB-A 포트가 존재하는데 어떤 포트에 PC를 연결해야 할까? 그리고 옆에 슬라이드 스위치 또한 보인다.

 

슬라이드 스위치에는 DEBUG와 DEVICE 모드가 있는데,

 

DEBUG모드란, 보드가 디버거에 연결되어 PC로 부터 코드를 다운로드 받거나 디버깅 작업을 수행한다는 의미이다.

반면에 DEVICE모드는 DEBUG를 완료한 이후 보드를 독립적으로 실행할 때 사용된다. 

 

우리는 현재 보드를 개발 중 이므로 좌측 상단의 슬라이드 스위치를 DEBUG쪽으로 옮긴 후 상단의 DEBUG 모드 쪽 USB 포트와 연결을 하면 된다. 

 

 

 

 

GPIO( General Purpose Input / Output )를 사용해서 LED를 제어할 것 인데, GPIO는 일반 목적 입/출력 이라는 의미로,

마이크로컨트롤러의 입/출력을 관여한다. GPIO를 사용하기 위해서는 RCGCGPIO라는 레지스터를 마이크로 컨트롤러의 Clock과 연결해 주어야 한다.

 

이를 관여하는 레지스터는 SYSCTL_RCGCGPIO 인데 레지스터의 주소는 0x400FE608임을 CCS를 통해 알 수 있다.

 

 

 

 

GPIO 포트 F를 활성화 한 모습이다. 레지스터의 값을 0x00000020으로 설정한 이유는 GPIO 포트가 A~F까지 6개의 포트가 존재하는데, 포트F(R5)를 활성화 하려면 6번째 bit를 1로 바꿔주어 100000이 되고, 이를 16진수로 변환하면 0010 (2), 0000 (0)이 되어 레지스터의 값이 0x00000020가 되는 것 이다.

 

 

 

GPIO포트 F에 이제 클럭신호가 인가되었다. LED를 켜기 위해서 DEN, DIR, DATA 레지스터를 조정할 것이다.

DEN은 Digital ENable / DIR은 DIRection 을 의미한다. 위의 회로에서 LED R은 PF1, LED B은 PF2, LED G은 PF3에 연결되어 있다. PF1,2,3은 PORT F의 bit1,2,3을 의미한다. 따라서 각각의 bit를 Enable 시켜주기 위해 DEN은 0x0E로 설정한다.

1110 (2) -> 0x0E (16)

DIR은 방향을 의미하는데 마이크로 컨트롤러 입장에서 LED는 출력이므로 DEN과 같이 0x0E로 설정해주면 된다.

 

 

 

이제 모든 준비는 끝났다. GPIO_DATA만. 조정해주면 개발보드에 내장된 LED를 조정할 수 있다. 위에 bit1,2,3으로 LED를 켜고 끈다고 하였는데, 빨강색은 0010 이므로 0x02, 파란색은 0100 이므로 0x04, 초록색은 1000 이므로 0x08로 GPIO_DATA를 조정하면 LED의 색을 바꿀수 있다.

 

0x02 / 0x04 / 0x08

 

1100 1110 1010 같이 여러개의 LED를 같이 켜면 다른 색 또한 낼 수 있다.

 

 

 

이러한 과정들을 지금 까지는 레지스터의 값을 직접 일일히 바꾸었는데, CCS에서 C언어를 작성하여 C코드로 레지스터를 조정할 수 있다.

 

이번에는 TM4C123GXL로 LED를 제어해보았다.

 

이번에 레지스터를 건드려보면서 기존의 아두이노보다 더 Low-Level의 프로그램을 만들어 보았는데 임베디드 개발자가 되기 위해서 C++개발 능력의 필요성을 느꼈다. 이번 겨울 방학에는 C++를 더 공부해 보아야 겠다.