打印

TMS320F28335定时器

[复制链接]
754|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Sode|  楼主 | 2017-10-14 11:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
TMS320F28335定时器


CPU有3个32位定时器0/1/2。CPU定时器0和1可以给用户使用,CPU定时器2留给实时操作系统(DSP/BIOS),如果不使用DSP/BIOS,那么CPU定时器2可以在应用程序中使用。
#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
void InitCpuTimers(void);
void ISRCpuTimer0(void);
void ISRCpuTimer1(void);


struct CPUTIMER_VARS CpuTimer0;
struct CPUTIMER_VARS CpuTimer1;
int count_timer0=0;
int count_timer1=0;
void main(void)
{


// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2833x_SysCtrl.c file.
   InitSysCtrl();
   DINT;
   IER=0x0000;
   IFR=0x0000;
   InitPieCtrl();
   InitPieVectTable();
   
   InitCpuTimers();
   //第三个参数指定了定时间 定时时间
   ConfigCpuTimer(&CpuTimer0, 150, 1000000);
   ConfigCpuTimer(&CpuTimer1, 150, 1000000);
   
   EALLOW;
   PieVectTable.TINT0=&ISRCpuTimer0;
   PieVectTable.XINT13=&ISRCpuTimer1;
   EDIS;
   //使能PIE模块
   PieCtrlRegs.PIECTRL.bit.ENPIE=1;
   //PIE通道使能
   PieCtrlRegs.PIEIER1.bit.INTx7=1;
   //CPU级 中断允许位
   IER|=0x0001;
   IER|=0x1000;
   EINT;
   EALLOW;
   //这个寄存器是外设的控制中断寄存器,这里选择定时器1作为输入
   XIntruptRegs.XNMICR.bit.SELECT=0;
   EDIS;
   
//  CpuTimer0Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0
//  CpuTimer1Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0
   
   CpuTimer0Regs.TCR.bit.TSS = 0; // Use write-only instruction to set TSS bit = 0
   CpuTimer1Regs.TCR.bit.TSS = 0; // Use write-only instruction to set TSS bit = 0



   while(1);


}


interrupt void ISRCpuTimer0(void)
{
count_timer0++;
PieCtrlRegs.PIEACK.bit.ACK1=1;
}


interrupt void ISRCpuTimer1(void)
{
count_timer1++;
}


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;


// CPU Timer 1
// Initialize address pointers to respective timer registers:
CpuTimer1.RegsAddr = &CpuTimer1Regs;
// Initialize timer period to maximum:
CpuTimer1Regs.PRD.all  = 0xFFFFFFFF;
// Initialize pre-scale counter to divide by 1 (SYSCLKOUT):
CpuTimer1Regs.TPR.all  = 0;
CpuTimer1Regs.TPRH.all = 0;
// Make sure timer is stopped:
CpuTimer1Regs.TCR.bit.TSS = 1;
// Reload all counter register with period value:
CpuTimer1Regs.TCR.bit.TRB = 1;
// Reset interrupt counters:
CpuTimer1.InterruptCount = 0;
}


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 = 0;
Timer->RegsAddr->TCR.bit.FREE = 0;     // Timer Free Run Disabled
//开启时钟 中断使能
Timer->RegsAddr->TCR.bit.TIE = 1;      // 0 = Disable/ 1 = Enable Timer Interrupt


// Reset interrupt counter:
Timer->InterruptCount = 0;
}


//===========================================================================
// No more.
//===========================================================================

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1049

主题

1522

帖子

8

粉丝