LM3S8962의 Timer에 대해서 알아본다.

우선 예제코드를 다운 받는다.
Link  : http://www.zlgmcu.com/luminary/exploitation_guide.asp


위의 링크된 사이트에서 timer 관련 파일을 모두 다운 받는다.
timer 관련 문서
LM3SLib_Timer.pdf

timer 관련 예제 코드
LM3SLib_Timer_16_CapCount.zip
LM3SLib_Timer_16_CapTime.zip
LM3SLib_Timer_16_OneShot.zip
LM3SLib_Timer_16_Periodic.zip
LM3SLib_Timer_16_PWM.zip
LM3SLib_Timer_32_OneShot.zip
LM3SLib_Timer_32_Periodic.zip
LM3SLib_Timer_32_RTC.zip
LM3SLib_Timer_APP_Buzzer.zip
LM3SLib_Timer_APP_Music.zip

제1장 General-Purpose Timers



1.1 Timer의 일반적인 특성
 Programmable timers는 Timer input pins으로 drive 하는 외부 이베트를 count하고 시간을 재기위해 사용할 수 있다. Stellaris General-Purpose Timer Module(GPTM)은 4개의 GPTM Block(Timer0, Timer1, Timer2, Timer3)을 가지고 있다. 각 GPTM block은 독립적으로 타이머와 이벤트 카운터로 동작하도록 설정하거나,  하나의 32비트 타이머와 하나의 32비트 Real-Time Clock(RTC)로 동작하도록 설정할 수  있는 2개의 16비트 타이머/카운터(TimerA, TimerB)를 제공한다. 

게다가 타이머는 analog-to-digital conversion(ADC)로 사용할 수 있다. 

GPT Module은 Stellaris microcontroller에서 하나의 timing resource 를 사용할 수 있다. 다른 timer resource는 System Timer(SysTick)과 PWM Module에서 PWM timer를 가지고 있다.

GPTM은 다음과 같은 특징을 가지고 있다.

4개의 GPTM은 두개의 16비트 타이머를 제공한다. 각각은 독립적으로 동작을 설정할 수 있다.
    – As a single 32-bit timer
    – As one 32-bit Real-Time Clock (RTC) to event capture
    – For Pulse Width Modulation (PWM)
    – To trigger analog-to-digital conversions

32비트 타이머 모드
    – Programmable one-shot timer
    – Programmable periodic timer
    – Real-Time Clock when using an external 32.768-KHz clock as the input
    – Software-controlled event stalling (excluding RTC mode)
    – ADC event trigger

16비트 타이머 모드
    – General-purpose timer function with an 8-bit prescaler (for one-shot and periodic modes only)
    – Programmable one-shot timer
    – Programmable periodic timer
    – User-enabled stalling when the controller asserts CPU Halt flag during debug
    – ADC event trigger

16비트 입력 캡쳐 모드
    – Input edge count capture
    – Input edge time capture

16비트 PWM 모드
    – Simple PWM mode with software-programmable output inversion of the PWM signal


Block Diagram
Note : 사용가능한 CCP 핀은 Stellaris device에 의존적이다.


사용가능한 CCP 핀은 다음과 같다.



1.2 Timer 기능 설명
각 GPTM block의 main component는 두개의 free-running 16비트 up/down 카운터, 두개의 16비트 match 레지스터, 두개의 prescaler match 레지스터, 두개의 16비트 load/initialization 레지스터, 그리고 관련 control function이다. 각 GPTM의 정확한 기능은 소프트웨어로 제어되고 레지스터 인터페이스를 통해 설정된다.

소프트웨어는 GPTM Configuration (GPTMCFG) register, GPTM TimerA Mode (GPTMTAMR) register, GPTM TimerB Mode (GPTMTBMR)를 사용하여 GPTM을 설정한다. 32비트 모드에서, 타이머는 오로지 32비트 타이머로만 동작할 수 있다. 하지만 16비트 모드에서는, GPTM은 16비트 모드의 조합을 통해 설정된 두개의 16비트 타이머로 동작할 수 있다. 

GPTM Reset Conditions
GPTM 모듈이 reset 된 후에, 모듈은 inactive 상태이고 모든 control 레지스터는 cleared 되거나 그들의 default 상태가 된다. 
Counters TimerA and TimerB는 0xFFFF로 초괴화 된다. 
    the GPTM TimerA Interval Load (GPTMTAILR) register 
    the GPTM TimerB Interval Load (GPTMTBILR) register
prescale  counter는 0x00으로 초괴화된다.
    the GPTM TimerA Prescale (GPTMTAPR) register
    the GPTM TimerB Prescale (GPTMTBPR) register

32-Bit Timer Operating Modes
GPTM은 GPTM Configuration(GPTMCFG) 레지스터에 0(One-Shot/Periodic 32-bit timer mode) 또는 1(RTC mode)을 Writing 함으로써 동작한다. 어느쪽 설정이든 정확한 GPTM 레지스터들은 pseudo 32-bit 레지스터를 형성하기 위해 연결된다. 이 레지스터드들은 다음과 같다.

    ■ GPTM TimerA Interval Load (GPTMTAILR) register [15:0]
    ■ GPTM TimerB Interval Load (GPTMTBILR) register [15:0]
    ■ GPTM TimerA (GPTMTAR) register [15:0]
    ■ GPTM TimerB (GPTMTBR) register [15:0]

32비트 모드에서, GPTM은 GPTMTAILR에 32비트 wrtie access 하는 것은  GPTMTAILR과 GPTMTBILR 양쪽으로 write access하는 것으로 바뀌게 된다. 이러한 write 동작을 위한 결과적인 word ordering 은 다음과 같다.
    GPTMTBILR[15:0]:GPTMTAILR[15:0]
GPTMTAR에 read access 하는 것도 유사하다, 리턴 값은 다음과 같다.
    GPTMTBR[15:0]:GPTMTAR[15:0]


[32-Bit One-Shot/Periodic Timer Mode]
  - TimerA와 TimerB 레지스터에 연결된 버전은 32비트 down-counter로서 설정된다. 
  - one-shot과 periodic 모드의 선택은 GPTM TimerA Mode(GPTMTAMR) 레지스터의 TAMR field에 쓰여지는
     값으로 결정된다.
  - GPTM TimerB Mode (GPTMTBMR) register에 wrtie 할 필요는 없다.
  - 소프트웨어에서 GPTM Control(GPTMCTL) 레지스터의 TAEN 비트를 write할때, 타이머는 preloaded value로부터
     counting down 한다. 
  - 0x0000.0000 상태가 되었을때, 타이머는 다음 cycle에 연결된 GPTMTAILR로부터 start value를 reload 한다.
  - One-shot 타이머로 설정되어 있다면, 타이머는 counting을 멈추고 GPTMCTL레지스터의 TAEN 비트를 clear한다.
  - periodic 타이머고 설정되어 있다면, counting을 계속한다.

  - 카운트 값을 reloading 하는 것 외에 GPTM은 0x0000.0000 상태가 되었을 때 interrupt와 trigger를 발생한다. 
  - GPTM은 GPTM Raw Interrupt Status(GPTMRIS) 레지스터의 TATORIS bit를 set하고 GPTM Interrupt Clear
    (GPTMICR) 레지스터를 writing함으로써 clear 할때까지 hold 한다.
  - GPTM Interrupt Mask(GPTIMR)레지스터에서 time-out interrupt가 enable되면 GPTM은GPTM Masked Interrupt
    Status(GPTMMIS)레지스터에서 TATOMIS비트를 set 한다.
  - ADC trigger는 GPTMCTL에서 TAOTE 비트를 setting 함으로써 enable 된다.

  - counter가 running 하는 동안 소프트웨어가 GPTMTAILR 레지스터를 reload 하면, counter는 다음 clock cycle에
    새로운 value을 load 한고 새로운 value로부터 conuting을 계속한다.

  - GPTMCTL 레지스터의  TASTALL비트가 asserted 되면 타이머는 signal이 deasserted 될때까지 freeze 된다.

[32-Bit Real-Time Clock Timer Mode]
  - RTC 모드에서 TimerA와 TimerB  레지스터에 연결된 버전은 32-bit up-counter로서 설정된다.
  - RTC 모드가 처음으로 선택되었을 때, 카운터는 0x0000.0001 값으로 load된다. 이후의 load value는 controller에
    의해 GPTM TimerA Match(GPTMTAMATCHR) 레지스터에 write 되어야만 한다. 
 
  - CCP0, CCP2, CCP4 핀의 input clock은 RTC  모드에서 32.768KHz가 요구된다.
  - clock signal은 1Hz 아래로 나누어지며 32비트 counter의 입력으로 전달된다.

  - 소프트웨어가 GPTMCTL 레지스터의 TAEN 비트를  write 할 때, counter는 0x0000.0001의 preload 값으로부터
    counting up을 시작한다.
  - 현재 count value가 GPTMMATCHR 레지스터에서 preloaded value로 match 되었을 때 , 0x0000.0000으로 
    roll over 히고 hardware reset이 되거나 소프트웨어에 의해 clear 될때까지 counting을 계속한다.
  - match 되었을 때 GPTM은 GPTMRIS의 RTCIS 비트를 assert 한다. GPTIMR에서 RTC  인터럽트가 enable 되었을
   때, GPTMISR의 RTCMIS 비트를 set하고 controller interrupt가 발생한다.
  - 상태 플래그는 GPTMICR에서 RTCCINT 비트를 writing 함으로써 clear 된다.
 


16-Bit Timer Operating Modes
GPTM은 GPTM Configuration(GPTMCFG) 레지스터에 0x4를 writing 함으로써 global 16-bit 모드가 된다.  TimerA와 TimerB는 동일하게 동작한다.

[16-Bit One-Shot/Periodic Timer Mode]
  - 16비트 one-shot와 periodic timer 모드에서, 타이머는 24비트로 카운트 범위를 확장하기 위한 선택적인 8비트
    prescaler를 갖는 16비트 down-counter로 설정된다.  
  - one-shot과 periodic 모드의 선택은 GPTMTnMR 레지스터의 TnMR field에 written 하므로서 결정된다. 
  - 선택가능한 prescaler는 GPTM Timern Prescale(GPTMTnPR) 레지스터로 load된다.
  
  - 아래 Table은 prescaler를 사용할 때, 16비트 free-running 타이머를 위한 여러 설정을 보여준다. 모든 값은
    Tc=20ns의 clock period를 갖는 50MHz에서 동작한다고 가정한다.


[16-Bit Input Edge Count Mode]
Note
: rising-edge detection을 위해, input signal은 rising-edge가 발생한 다음 적어도 두개의 systel clock periods
         동안 High 상태를 유지해야 만 한다. 유사하게 falling-edge detection을 위해, input signal은 falling-edge
         으로 적어도 두개의 system clock periods 동안 Low 상태를 유지해야 한다. 이런 이유로 edeg-detection을 위한
          maximum input frequencysms system frequency의 1/4 이 된다.

Note : Prescaler는 16-Bit Input Edge Count 모드에서 사용할 수 없다.
 
  - Edge Count 모드에서 타이머는 riding edge, falling edge, both 이렇게 3개의 이벤트 type을 captureing 할 수 있는 
    down-counter로서 설정된다.
  - Edge count 모드에서 타이머를 사용하기 위해, GPTMRnMR 레지스터의 TnCMR비트는 0으로 set 되어야 한다.
  - 타이머 카운터의 edge type은 GPTMCTL 레지스터의 TnEVENT fields에 의해 결정된다.
  - 초기화 동안, GPTM Timern Match(GPTMTnMATCHR) 레지스터는 GPTMTnILR 레지스터의 값과
    GPTMTnMATCHR 레지스터의 차이가 카운트 되어야만 edge event의 수가 같아질 수 있게 설정된다. 
 
  - 소프트웨어가 GPTM Control(GPTMCTL) 레지스터의 TnEN 비트를 write 할 때, 타이머는 envent capture로
    enable 된다.
  - CCP 핀에서 각 input event는  event count가 GPTMTnMATCHR과 match 될때까지 1씩 감소한다.
  - count가 match 될 때 GPTM은 GPTMRIS 레지스터의 CnRIS bit를 assert 한다.
  - 카운터는 GPTMTnILR에서 value를 이용해 reload 되고, GPTMCTL 레지스터의 TnEN 비트를 자동으로
    clear 함으로써 stop 한다.
  - event count가 완료되었을 때 모든 event는 TnEN이 소프트웨어적으로 re-enabled 될 때 까지 무시된다.
 



[16-Bit Input Edge Time Mode]
Note : rising-edge detection을 위해, input signal은 rising-edge가 발생한 다음 적어도 두개의 systel clock periods
         동안 High 상태를 유지해야 만 한다. 유사하게 falling-edge detection을 위해, input signal은 falling-edge
         으로 적어도 두개의 system clock periods 동안 Low 상태를 유지해야 한다. 이런 이유로 edeg-detection을 위한
          maximum input frequencysms system frequency의 1/4 이 된다.

Note : Prescaler는 16-Bit Input Edge Time 모드에서 사용할 수 없다.
 
  - Edge Time 모드에서 타이머는 GPTMTnILR 레지스터에서 loaded 된 값은 초기값으로 갖는 free-running
    down-counter로서 설정된다.
  - 이 모드는 rising edge, falling edge event capture 로 동작하지만 both로는 동작하지 않는다.
  - GPTMTnMR 레지스터의 TnCMR 비트를 setting함으로써 Edge Time  모드로 설정되고, event type은
    GPTMCnTL 레지스터의 TnEVENT field에 의해 결정된다.

  - 소프트웨어가 GPTMCTL 레지스터의 TnEN 비트를 write 할 때, 타이머는 event capture로 동작한다.
  - 선택된 input event가 detect되었을 때, 현재 Tn counter 값은 GPTMTnR 레지스터에서 capture 되고, controller에
    의해 read되어 사용할 수 있게 된다.
  - 그때 GPTM은 CnERIS 비트를 assert 한다 

  - event가 capture 된 후에 타이머는 counting을 stop 하지 않는다.
  - TnEN 비트가 clear될때 까지 count를 계속한다.
  - 타이머가 0x0000 상태가 되었을 때, GPTMnILR 레지스터로부터 값을 reloaded 한다.



[16-Bit PWM Mode]
Note
: Prescaler는 16-Bit PWM 모드에서 사용할 수 없다.

  - GPTM은 간단한 PWM generation 모드를 제공한다.
  - PWM 모드에서, 타이머는 GPTMTnILR에 의해 정의돈 start value를 갖는 down-counter로서 설정된다.
  - PWM 모드는 GPTMTnMR 레지스터의 TnAMS bit를 0x01, TnCMR bit를 0x0, TnMR field를 0x2로 setting
    함으로써  enable 된다.
 
  - 소프트웨어가 GPTMCTL 레지스터의 TnEN 비트를 write 할 때, 카운터는 0x0000이 될 때까지 counting down을
     시작한다.
  - 다음 counter cycle에서, 카운터는 GPTMTnILR로부터 start value를 reload하고 GPTMCTL레지스터의 TnEN
    비트를 소프트웨어 clear 함으로써 disable 될때까지 counting을 계속한다.
  - 어떤 인터럽트나 상태 비트도 PWM 모드에서는 assert 될 수 없다.

  - output PWM signal은 카운터가 GPTMTnILR 레지스트의 값일 때 assert 하고, 카운터가 GPTM Timern Match
     Register(GPTMnMATCHR)과 값이 같은 때 deassert 된다.
  - 소프트웨어는 GPTMCTL 레지스터의 TnPWML 비트를 setting 함으로써 output PWN signal을 반전 할 수 있다.




1.3 Timer 라이브러리 함수
Timer 모듈을 사용하기 위해서는 먼저 timer를 Enable 해야 한다. Enable 방법은 다음과 같다.

#define     SysCtlPeriEnable     SysCtlPeripheralEnable

SysCtlPeriEnable(SYSCTL_PERIPH_TIMERn);  
                              // 末尾的n取0、1、2或3

RTC, Input Edge Count, Input Edge Time, PWM 함수를 사용하기 위해서는  CCP의 입력 또는 출력 신호에 해당하는 핀을 사용해야 한다. 따라서 CCP에 해당하는 GPIO  포트를 구성해야 한다.

#define   CCP2_PERIPH   SYSCTL_PERIPH_GPIOD
#define   CCP2_PORT     GPIO_PORTD_BASE
#define   CCP2_PIN        GPIO_PIN_5

SysCtlPeripheralEnable(CCP2_PERIPH);           // 使能CCP2管脚所在的GPIOD
GPIOPinTypeTimer(CCP2_PORT, CCP2_PIN);   // 配置CCP2管脚为Timer功能




Configure & Control

TimerConfigure() - 타이머의 동작 모드를 설정한다.

TimerControlStall( ) - 명시된 timer를 위한 stall response를 제어한다.

TimerControlTrigger( ) - 명시된 타이머를 위한 trigger output을 제어한다.

TimerControlEvent( ) - capture mode일때 타이머를 trigger할 signal edge를 set한다.

TimerControlLevel( ) - 명시된 타이머를 위한  PWM output level을 set 한다.



Load & Value Get

TimerLoadSet( ) - 타이머 load value를 set한다.

TimerLoadGet( ) - 명시된 타이머에서 현재 프로그램된 interval load value 를 가져온다.

TimerValueGet( ) - 명시된 타이머의 현재값을 읽어온다.



Mode Enable/Disable

TimerEnable( ) - timer module의 동작을 enable 한다.

TimerDisable() - timer module의 동작을 disable 한다.

TimerRTCEnable( ) - RTC mode에서 타이머로 하여금 counting을 시작하도록 한다.

TimerRTCDisable( ) - RTC 모드에서 타이머로 하여금 counting을 멈추게 한다.

TimerQuiesce( ) -  타이머를 초기화 상태로 바꾼다


Match &  Prescaler

TimerMatchSet( ) - 타이머를 위한 match value를 set 한다.

TimerMatchGet( ) - 명시된 타이머에서 match value를 가져온다.

TimerPrescaleSet( ) - input clock prescaler의 값을 set 한다.

TimerPrescaleGet( ) - input clock prescaler의 값을 가져온다.




Interrupt Control

TimerIntEnable( ) - 타이머 인터럽트 source를 enable 한다.

TimerIntDisable( ) - 타이머 인터럽트 source를 Disable한다.

TimerIntClear( ) - 명시된 timer interrupt source가 clear 된다.

TimerIntStatus( ) - timer module의 인터럽트 상태를 return한다.

TimerIntRegister( ) - 타이머 인터럽트가 발생했을 때 호출될 handler를 set 한다.

TimerIntUnregister( ) - 타이머 인터럽트가 발생했을 때 호출될 handler를 clear 한다.

Posted by eoseontaek