정보공간_1

[2기 전주 심경원] Cortex - M3 동작 원리 및 개발 TIP 본문

IT 놀이터/Elite Member Tech & Talk

[2기 전주 심경원] Cortex - M3 동작 원리 및 개발 TIP

알 수 없는 사용자 2012. 10. 18. 12:32

Cortex - M3 동작 원리 및 개발 TIP

 

1. 소개

 32비트 RISC 마이크로프로세서의 엔진이 해당하는 Cortex-M3 동작 원리와 구조 등 에 대해 다룬다. TI 사의 Cortex 가 탑재된 LM 시리즈를 효율적으로 활용 초기화 하고 펌웨어 설계에 손쉽게 적용하기 위해 익혀야 하는 실제 기술에 대해 설명하려 한다.  실제 Cortex LM3S808 모델을 사용하여  StellarisWare 를 설치하여 API를 사용하여 설정하는 방법과 실제 구조에서 지원하는 다양한 모드 등에 대해 설명 하고 쉽게 설정할 수 있는 방법에 대해 다룬다.

2. LM3S808

2.1 System

먼제 시스템 내부를 살펴 보면 Flash메모리, JTAG과 인터페이스 하기 위해 Dcode 와 ICode 버스가 존대한다. 또한 APB Bridge 를 통해 상대적으로 저속의 장치들과 인터페이스 한다. 인터럽트 처리는 NVIC(Nested Vector Interrupt Controller)가 담당하고 별도로 시스템과 PLL(Phase Lock Loop)과 같은 Clock 제어가 있다.

 

LM3S808 Block Diagram

I/O 장치는 GPIO, Timer와 Watch Dog Timer가 있다. UART는 2개 있으며 비슷한 엔진으로 되어 있는 I2C, SSI가 하나씩 있다. 또한 비교적 고성능인 ADC 채널 8개와 비교기가 있고 PWM 또한 구성 되어 있다. 그럼 본격적으로 각 기능별에 대해서 설명한다.

 

2.2 GPIO

Port의 핀은 일반적으로 한 가지 기능만 있는 것이 아니고 보통 2가지 이상의 Multi-Function 기능이 있어 설정에 의해 하는 일을 변경 할 수 있다. 예를 들면 PA0, PA1은 레지스터 설정에 의해 각각 UART0의 Receiver, Transmitter의 기능을 할 수 있다.

 

GPIO Module Block Diagram


다음은 각각 GPIO 기능 설정에 대한 예를 들어 보겠다.

Port A 의 GPIO 설정

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

2개의 PWM 설정

GPIOPinTypePWM(GPIO_PORTB_BASE,GPIO_PIN_0 | GPIO_PIN_1);

UART1 설정

GPIOPinTypeUART(GPIO_PORTD_BASE, GPIO_PIN_2 | GPIO_PIN_3);

 

 

I2C 설정

 

 

SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);

 

GPIOPinTypeI2C(GPIO_PORTB_BASE,GPIO_PIN_2 | GPIO_PIN_3);

 

만약 API 사용을 하지 않는 다면 직접 접근하여

GPIO_PORTA_GPIODIR= 0XFF   //포트A 모두 출력

 

GPIO_PORTA_GPIODATA=0XF0 //RTA 4~7 high 0~3 low 출력

 

과같이 직접 레지스터를 설정 해줘야 한다. 사람마다 편한 차이는 있겠지만 API를 사용 할 경우 좀 더 간

 

 

편하다.

 

API 사용에 대해 좀 더 언급해 보자면

 

#define GPIO_PIN_0    0x00000001

 

#define GPIO_PIN_1    0x00000002

 

#define GPIO_PIN_2    0x00000004

 

#define GPIO_PIN_3    0x00000008

 

(이하 생략) 과 같이 define 되어 있는 GPIO pin의 값이 define 되어 있고

 

GPIODirModeSet(GPIO_PORTA_BASE,0Xff,GPIO_DIR_MODE_OUT);

 

GPIOPinWrite(GPIO_PORTA_BASE,0Xf0, GPIO_PIN_7 | GPIO_PIN_6 | GPIO_PIN_5 | GPIO_PIN_4);

 

위와 같은 방법으로 위와 동일한 효과를 볼 수 있다.

 

 

 

GPIO Port Block Diagram

 

 

각각의 GPIO 포트는 실제 입 출력이 이루어지는 디지털 입 출력 패드부와 모드의 동작을 제어하는 모

 

드 제어부, 데이터 제어부, 인터럽트 제어부, 패드 제어부와 리셋시 포트의 인식을 위한 인식 레지스터

 

로 구성되어 있다.

 

 

 

2.3 Timer

 

 

타이머는 외부 이벤트를 카운터 하거나 걸리 시간을 재는데 사용할 수 있는데 범용 타이머 모듈은 세

 

개의 GPTM 블록(Timer0, Timer1, Timer2) 로 구성되어 있으며 각각 타이머나 이벤트 카운터로 동작하

 

도록 설정할 수 있는 두개 의 16비트 타이머/카운터 (TimerA, TimerB)를 제공한다. 또 한개 의 32비트

 

타이머나 32비트 리얼타임 클록(RTC) 로 동작 하돌고 설정 할 수 도 있다.

 

 

-32비트 타이머 모드

 

*프로그램 가능한 원샷 타이머(one shot)

 

*프로그램 가능한 주기 타이머(periodic)

 

*외부 32.768KHz clock 입력 사용시 리얼타임 clock (RTC) 동작

 

*AD 변환 이벤트 트리거

 

-16비트 타이머 모드

 

*8비트 프리스케일러를 가지는 범용 타이머(general purpose)

 

*프로그램 가능한 원샷 타이머

 

*프로그램 가능한 원샷 타이머(one shot)

 

*프로그램 가능한 주기 타이머(periodic)

 

*사용자가 활성화 할 수 있는 디버그 도중의 CPU 정지 플래그가 제어기에 발생할 때의 시간지연

 

*AD 변환 이벤트 트리거

 

-16비트 입력 캡쳐 모드

 

*입력 엣지 카운터 캡쳐

 

*입력 에지 시간 캡쳐

 

-16비트 PWM모드

 

*PWM 소프트웨어로 프로그램 할 수 있는 PWM 모드

 

 

LM3S808은 타이머 블록 3개를 가진다. 각 타이머 블록별로 타이머A 는 짝수 번호의 CCP핀을 가지며 타이

 

머B 는 홀수 번호의 CCP핀을 가지는데 3개의 타이머 블록이 각각 16비트 타이머A와  B 가지고 있으므로

 

CCP핀은 총 6개가 된다.

 

Timer Block Diagram

 

 

 

SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);           //timer0 using

 

TimerConfigure(TIMER0_BASE,TIMER_CFG_32_BIT_PER);  //32-BIT PERIODIC TIMER  

 

TimerLoadSet(TIMER0_BASE,TIMER_A,SysCtlClockGet());  // 10us에 한번 값을 클럭을 주게 설정 

 

TimerIntEnable(TIMER0_BASE,TIMER_TIMA_TIMEOUT);  //timerA interrupt using

 

TimerIntRegister(TIMER0_BASE,TIMER_A,myTimer0);     //interrupt 발생시 myTimer 라는 함수의 이벤트

 

TimerEnable(TIMER0_BASE,TIMER_A);                      //timer 시작

 

 

위와 같은 방법으로 설정을 해 줄 수 있다. 여기서 한가지 알아둘 점은 TimerLoadSet 함수를 사용하여

 

Time을 Load 할 수 있는데 이때 SysCtlClockGet() 함수를 사용하여 타임을 얻어 시간을 설정 할 수 있다.

 

예를들면 SysCtlClockGet() / 1000 은 1ms 로 손쉽게 설정 할 수 있다.

 

 

 

3. 결론

 

지금까지 Cortex - M3 기반의 보드인 LM3S808의 SYSTEM, GPIO, TIMER에 대한 기능들의 구조와 사용방법

 

에 대해 알아 보았다. Datasheet를 빠르게 읽고 분석 하는 사람이라면 쉽게 이해 할수 있을 것이다.

 

다음에는 UART, ADC, Interrupt 에 대해 설명 할 것 이다.