TMS320/F283352014. 8. 19. 17:53

DSP2833x_CpuTimers.c, h를 분석한다.


1. InitCpuTimers()

타이머 초기화 함수로써, 우리가 이 함수를 사용할 때는 그냥 호출하면 될것이다. 영어를 읽을 수 있을테니 주석을 잘 보도록 하자.


void InitCpuTimers(void)

{

    // CPU Timer 0

    // Initialize address pointers to respective timer registers:

    CpuTimer0.RegsAddr = &CpuTimer0Regs;

    // Initialize timer period to maximum:

    CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;

    // Initialize pre-scale counter to divide by 1 (SYSCLKOUT):

    CpuTimer0Regs.TPR.all  = 0;

    CpuTimer0Regs.TPRH.all = 0;

    // Make sure timer is stopped:

    CpuTimer0Regs.TCR.bit.TSS = 1;

    // Reload all counter register with period value:

    CpuTimer0Regs.TCR.bit.TRB = 1;

    // Reset interrupt counters:

    CpuTimer0.InterruptCount = 0;



// CpuTimer2 is reserved for DSP BIOS & other RTOS

// Do not use this timer if you ever plan on integrating

// DSP-BIOS or another realtime OS.


    // Initialize address pointers to respective timer registers:

    CpuTimer1.RegsAddr = &CpuTimer1Regs;

    CpuTimer2.RegsAddr = &CpuTimer2Regs;

    // Initialize timer period to maximum:

    CpuTimer1Regs.PRD.all  = 0xFFFFFFFF;

    CpuTimer2Regs.PRD.all  = 0xFFFFFFFF;

    // Make sure timers are stopped:

    CpuTimer1Regs.TCR.bit.TSS = 1;

    CpuTimer2Regs.TCR.bit.TSS = 1;

    // Reload all counter register with period value:

    CpuTimer1Regs.TCR.bit.TRB = 1;

    CpuTimer2Regs.TCR.bit.TRB = 1;

    // Reset interrupt counters:

    CpuTimer1.InterruptCount = 0;

    CpuTimer2.InterruptCount = 0;

}


Timer2에 대한 경고사항이 나와있다. BIOS, RTOS일 때는 Timer2를 사용하지 말라고 한다.

===============================================================================================

void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)

{

    Uint32  temp;


    // Initialize timer period:

    Timer->CPUFreqInMHz = Freq;

    Timer->PeriodInUSec = Period;

    temp = (long) (Freq * Period);

    Timer->RegsAddr->PRD.all = temp;


    // Set pre-scale counter to divide by 1 (SYSCLKOUT):

    Timer->RegsAddr->TPR.all  = 0;

    Timer->RegsAddr->TPRH.all  = 0;


    // Initialize timer control register:

    Timer->RegsAddr->TCR.bit.TSS = 1;      // 1 = Stop timer, 0 = Start/Restart Timer

    Timer->RegsAddr->TCR.bit.TRB = 1;      // 1 = reload timer

    Timer->RegsAddr->TCR.bit.SOFT = 1;

    Timer->RegsAddr->TCR.bit.FREE = 1;     // Timer Free Run

    Timer->RegsAddr->TCR.bit.TIE = 1;      // 0 = Disable/ 1 = Enable Timer Interrupt


    // Reset interrupt counter:

    Timer->InterruptCount = 0;

}

===============================================================================================

ConfigCpuTimer(&CpuTimer0, 150, 1000);


인수는 설정할 CpuTimer의 주소, 주파수(MHz), 주기(uSeconds)이다. 인수에 따른 설정 후 각종 레지스터를 초기화 시켜준다.

위의 경우는 초당 150*10^6회, 인터럽트는 1000us:0.001초당 한번씩 발생하도록 하였다.

두 수를 곱하면 150000으로 초당 150000회의 인터럽트가 발생하는 것이다.


주파수 부분에 아무 값이나 넣으면 안된다. 현재 설정한 SYSCLKOUT의 값을 넣어주도록 하자. 기본적으로 150MHz로 잡혀있다.

===============================================================================================

DSP2833x_CpuTimer.h를 보면 레지스터 및 명령 정의가 나와있다. 예를들어 아래와 같다.


// Start Timer:

#define StartCpuTimer0()   CpuTimer0Regs.TCR.bit.TSS = 0


// Stop Timer:

#define StopCpuTimer0()   CpuTimer0Regs.TCR.bit.TSS = 1


// Reload Timer With period Value:

#define ReloadCpuTimer0() CpuTimer0Regs.TCR.bit.TRB = 1


// Read 32-Bit Timer Value:

#define ReadCpuTimer0Counter() CpuTimer0Regs.TIM.all


// Read 32-Bit Period Value:

#define ReadCpuTimer0Period() CpuTimer0Regs.PRD.all


친절하게 설명이 나와있으니 사용하는데는 문제가 없다고 본다.

'TMS320 > F28335' 카테고리의 다른 글

2812와 달라진 28335의 주변회로  (0) 2014.08.20
SCI  (0) 2014.08.19
Cpu Timer(1)  (1) 2014.08.19
ADC(2)  (0) 2014.08.18
ADC(1)  (0) 2014.08.18
Posted by 십자성군
TMS320/F283352014. 8. 19. 17:47

CPU Timer에 대하여 소스 및 구조차원에서 접근한다.


출처 : http://blog.naver.com/zeratool2/80106355498


위의 내용과 함께 보충하여 설명한다.




28335는 CPU Timer 0/1/2 세 개의 모듈을 가지고 있다. 내부 구조는 모두 동일하다.

DSP에 OS를 포팅 시켜서 RTOS로 사용할 경우, CPU Timer2는 BIOS스케쥴링에 사용하게 되어 Timer0과 Timer1만을 사용할 수 있다.


CPU타이머는 PLL을 거친 SYSCLKOUT을 공급받아 돌아가게 된다. 이와 관련된 소스차원의 간략한 글을 올려놓았으니 참고하자.

동작원리를 설명한다


-TDDRH:TDDR(16bit:16bit)와 PSCH:PSC는 AVR의 프리스케일러와 같다.

-타이머가 가동되면 PSCH:PSC는 TDDRH:TDDR의 값을 그대로 복사해오고, SYSCLKOUT 한 클럭당 1씩 Down-Counting을 한다.

-Down-Counting으로 1씩 빼다가 0이 넘어가면 TIMH:TIM에 1클럭의 신호를 보낸다.

-TIMH:TIM 또한 타이머가 가동되면서 PRDH:PRD의 값을 복사해오고, 대기중에 PSCH:PSC로부터 넘어오는 한 클럭당 1씩 DOWN-Counting을 한다.

-Down-Counting에 의해 0이 넘어가는 순간 TINT에 신호를 보내고 인터럽트가 발생한다.


위를 종합하여 인터럽트 주기는

(1/SYSCLKOUT)*(TDDRH:TDDR+1)*(PRDH:PRD+1)

이 된다. (1/SYSCLKOUT)은 1클럭당 주기임을 알아두자.



레지스터 표이다.





TIMERxTCR 레지스터이다.



15 

인터럽트가 요청 됐는지의 유무를 표시해준다.

1이면 인터럽트가 요청된 것이다. 

여기에 1을 써주어 강제 클리어 할 수 있다.

14 

1을 입력하면 타이머 인터럽트를 사용할 수 있다. 

 11-10

JTAG와 같은 에뮬레이터를 사용할 때 쓰는 옵션이다.

컴파일러에서 브레이크 포인트를 걸고 실행했을 때, 브레이크 포인트를 만나면 아래와 같이 작동한다.


00 일 때 : TIMH:TIM의 바로 다음 카운팅에서 타이머가 멈춘다.

01 일 때 : TIMH:TIM이 0까지 감소한 후 타이머가 멈춘다

10or11 : 브레이크 포인트를 만나더라도 타이머는 계속 카운팅을 한다. 

 5

1만 쓸 수 있으며 1을 쓸 경우, TIM이 PRD의 값을 다시 복사해 온다. 0밖에 읽히지 않는다.

 

이게 무슨 의미를 가질까? TIM단계의 카운팅을 새로 한다는 뜻이겠지만 어떤 때 쓰이는지 모르겟다.

1을 쓰면 타이머가 멈춘다. 0을 써주면 즉시 타이머가 카운팅을 시작한다. 


다음 글에서는 소스코드 분석


'TMS320 > F28335' 카테고리의 다른 글

SCI  (0) 2014.08.19
Cpu Timer(2)  (0) 2014.08.19
ADC(2)  (0) 2014.08.18
ADC(1)  (0) 2014.08.18
Gpio  (0) 2014.08.18
Posted by 십자성군
Project/Balancing 283352014. 8. 19. 16:06


#include "DSP2833x_device.h"

#include "DSP2833x_GlobalPrototypes.h"

#include "GlobalProtoypesLee.h"


void Init_Timer0()

{

// 정풩프?않은 타머 콘트롤 레지스터를 초기화

InitCpuTimers();

// 타이머 주와 타이머?reload 설정

ConfigCpuTimer(&CpuTimer0, 150, 1000);

// 150MHz CPU Freq, 5 msec Period (in uSeconds)

// 1 msec

StartCpuTimer0();

// Interrupt Enable Register

}


1. InitCpuTimers()


2. ConfigCpuTimer()


3. StartCpuTimer0()

'Project > Balancing 28335' 카테고리의 다른 글

Init_ADC  (0) 2014.08.19
GpioInit  (0) 2014.08.18
Posted by 십자성군