DSP28335 采用定时器的延时函数
//延时函数,鉴于定时器0已经用于产生中断,这里采用定时器1
//但关于定时器1是否可以随意使用的问题Timer程序文件与英文资料的说法不一致
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
Uint32 TT;//延时时间对应计数次数
Uint32 RTT;//当前计数器的值
Uint32 PRD;//当前周期寄存器的值
Uint32 CY;//整循环后的余数
int CCY;//整循环次数
int ii;
void delay(float32 time)
{
//CpuTimer0.RegsAddr= & CpuTimer0Regs;
RTT=CpuTimer1Regs.TIM.all;
CpuTimer1Regs.TCR.bit.TSS=0;//启动定时器
CpuTimer1Regs.TCR.bit.TRB = 1;//重新装载定时器1 后,定时器1 的计数值为周期寄存器值,计算器开始向下计数
if(time<0.0001)
time=0.0001;
else if(time>10)
time=10;
TT=time*150000000;//将中断时间转换为定时器计数个数
PRD=CpuTimer1Regs.PRD.all;
if(RTT>TT) //这说明当前计数器递减计数未减到0就完成延时
{
do{ }
while(CY>=(RTT - CpuTimer1Regs.TIM.all));
}
else //当前计数器递减到0不足以完成延时
{
CY=TT-RTT; //延时所需计数次数减去当前读出的计数器值
CCY=CY/PRD; //循环计数次数
CY=CY-CCY*PRD; //整循环后的剩余计数次数
for(ii=0;ii<CCY;ii++)
{
do{ }
while(CpuTimer1Regs.TIM.all>30);//计数器的值小于30就认为已经归零,这是为了保证已经(或即将)完成的整周循环不会被误判
}
do{ }
while(CY>=(PRD - CpuTimer1Regs.TIM.all));
}
}