详解DSP F28069的 CPU Timer定时器模块,及代码讲解
32-Bit CPU Timers 0/1/2
代码讲解
- timer.h
/*
* Timer.h
*
* Created on: 2022年6月15日
* Author: chends
*/
#ifndef TIMER_H_
#define TIMER_H_
#include "DSP28x_Project.h"
void CpuTimer0_Init(Uint32 Freq, Uint32 Period);
interrupt void dasen_TIM0IRQn(void);
void CpuTimer1_Init(Uint32 Freq, Uint32 Period);
interrupt void dasen_TIM1IRQn(void);
#endif /* TIMER_H_ */
- timer.c
/*
* Timer.c
*
* Created on: 2022年6月15日
* Author: chends
*/
#include "Timer.h"
#include "Usart.h"
//系统时钟90MHz
//定时器频率f = 90MHz/((TDDR+1)*Period)
void CpuTimer0_Init(Uint32 TDDR, Uint32 Period)
{
EALLOW;
SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK=1; //开定时器0时钟
PieVectTable.TINT0= &dasen_TIM0IRQn;//自定义中断服务函数
EDIS;
// CPU Timer 0
CpuTimer0Regs.TIM.all=0; // Timer counter register
CpuTimer0Regs.PRD.all=Period;// Period register
CpuTimer0Regs.TCR.bit.TIF=1;//CPU-Timer溢出标志,当cpu定时器递减到0时,该标志将被设置。对该位写入1将清除标志。
CpuTimer0Regs.TCR.bit.TIE=1;//CPU-Timer中断使能。如果计时器递减到零,并且TIE被设置,计时器产生断言它的中断请求。
/*cpu定时器仿真模式
* 这些位是特殊的模拟位,用于在高级语言调试器中遇到断点时确定计时器的状态。
* 如果FREE位被设置为1,那么在软件断点时,计时器将继续运行(即自由运行)。
* FREE=0 & SOFT=0 -> 在TIMH:TIM的下一次递减后停止(硬停止)
*/
CpuTimer0Regs.TCR.bit.FREE=0;
CpuTimer0Regs.TCR.bit.SOFT=0;
//CPU-Timer重载位。0-TRB位总是读取为零。0的写操作将被忽略。
//1-当你写一个1到TRB时,TIMH:TIM被装入PRDH:PRD中的值,而预标器计数器(PSCH:PSC)被装入定时器分割寄存器(TDDRH:TDDR)中的值。
CpuTimer0Regs.TCR.bit.TRB=1;
/*
* cpu -定时器停止状态位。TSS是一个1位标志,用于停止或启动cpu计时器。
* 0-读取0表示CPU-timer正在运行。若要启动或重启CPU-timer,可将TSS设置为0。在重置时,TSS被清除为0cpu定时器立即启动。
* 1-读取1表示CPU-timer停止。如果需要停止cpu定时器,可将TSS设置为1。
*/CpuTimer0Regs.TCR.bit.TSS=0;
//CpuTimer0Regs.TPR.bit.PSC:cpu定时器预分频计数器,只读。通过TDDR装载进PSC
/*
* 每(TDDRH:TDDR + 1)个定时器时钟源周期,对定时器计数器进行寄存器(TIMH:TIM)减1。
复位时,TDDRH:TDDR位清除为0。
要将整个计时器计数增加一个整数因子,请将这个因子减去1写入TDDRH:TDDR位。
当预分频计数器(PSCH:PSC)值为0时,一个定时器时钟源周期后,TDDRH:TDDR中的内容重新加载PSCH:PSC, TIMH:TIM减1。
TDDRH:TDDR也重新加载PSCH:PSC当定时器重新加载位(TRB)是由软件设置。
*/
CpuTimer0Regs.TPR.bit.TDDR=(TDDR & 0XFF);
CpuTimer0Regs.TPRH.bit.TDDRH=(TDDR >> 8);
//开启CPU 第一组中断并使能第一组中断的第7 个小中断,即定时器0
IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx7=1;
//使能总中断
EINT;
ERTM;
}
void CpuTimer1_Init(Uint32 TDDR, Uint32 Period)
{
EALLOW;
SysCtrlRegs.PCLKCR3.bit.CPUTIMER1ENCLK=1; //开定时器0时钟
PieVectTable.TINT1= &dasen_TIM1IRQn;
EDIS;
// CPU Timer 0
CpuTimer1Regs.TIM.all=0; // Timer counter register
CpuTimer1Regs.PRD.all=Period;// Period register
CpuTimer1Regs.TCR.bit.TIF=1;//CPU-Timer溢出标志,当cpu定时器递减到0时,该标志将被设置。对该位写入1将清除标志。
CpuTimer1Regs.TCR.bit.TIE=1;//CPU-Timer中断使能。如果计时器递减到零,并且TIE被设置,计时器产生断言它的中断请求。
/*cpu定时器仿真模式
* 这些位是特殊的模拟位,用于在高级语言调试器中遇到断点时确定计时器的状态。
* 如果FREE位被设置为1,那么在软件断点时,计时器将继续运行(即自由运行)。
* FREE=0 & SOFT=0 -> 在TIMH:TIM的下一次递减后停止(硬停止)
*/
CpuTimer1Regs.TCR.bit.FREE=0;
CpuTimer1Regs.TCR.bit.SOFT=0;
//CPU-Timer重载位。0-TRB位总是读取为零。0的写操作将被忽略。
//1-当你写一个1到TRB时,TIMH:TIM被装入PRDH:PRD中的值,而预标器计数器(PSCH:PSC)被装入定时器分割寄存器(TDDRH:TDDR)中的值。
CpuTimer1Regs.TCR.bit.TRB=1;
/*
* cpu -定时器停止状态位。TSS是一个1位标志,用于停止或启动cpu计时器。
* 0-读取0表示CPU-timer正在运行。若要启动或重启CPU-timer,可将TSS设置为0。在重置时,TSS被清除为0cpu定时器立即启动。
* 1-读取1表示CPU-timer停止。如果需要停止cpu定时器,可将TSS设置为1。
*/CpuTimer1Regs.TCR.bit.TSS=0;
//CpuTimer0Regs.TPR.bit.PSC:cpu定时器预分频计数器,只读。通过TDDR装载进PSC
/*
* 每(TDDRH:TDDR + 1)个定时器时钟源周期,对定时器计数器进行寄存器(TIMH:TIM)减1。
复位时,TDDRH:TDDR位清除为0。
要将整个计时器计数增加一个整数因子,请将这个因子减去1写入TDDRH:TDDR位。
当预分频计数器(PSCH:PSC)值为0时,一个定时器时钟源周期后,TDDRH:TDDR中的内容重新加载PSCH:PSC, TIMH:TIM减1。
TDDRH:TDDR也重新加载PSCH:PSC当定时器重新加载位(TRB)是由软件设置。
*/
CpuTimer1Regs.TPR.bit.TDDR=(TDDR & 0XFF);
CpuTimer1Regs.TPRH.bit.TDDRH=(TDDR >> 8);
//开启INT13的中断,它不在PIE中
IER |= M_INT13;
//使能总中断
EINT;
ERTM;
}
interrupt void dasen_TIM0IRQn(void)
{
//LED灯翻转
GpioDataRegs.GPBTOGGLE.bit.GPIO39=1;
UARTa_SendString("TIMER 0.\r\n");
CpuTimer0Regs.TCR.bit.TIF=1;//写1清除定时器溢出标志
CpuTimer0Regs.TCR.bit.TRB=1;//CPU-Timer重载
PieCtrlRegs.PIEACK.bit.ACK1=1;//清除相应组的中断应答位
}
interrupt void dasen_TIM1IRQn(void)
{
//LED灯翻转
GpioDataRegs.GPBTOGGLE.bit.GPIO39=1;
UARTa_SendString("TIMER 1.\r\n");
CpuTimer1Regs.TCR.bit.TIF=1;//写1清除定时器溢出标志
CpuTimer1Regs.TCR.bit.TRB=1;//CPU-Timer重载
//INT0~12才需要清除相应组的中断应答位,因为它们在PIE模块中。timer1为INT13它是直连CPU的
}