DSP中CPU定时器的配置程序问题
//ConfigureCPU-Timer0,1,and2tointerrupteverysecond://100MHzCPUFreq,1secondPeriod(inuS...
// Configure CPU-Timer 0, 1, and 2 to interrupt every second:
// 100MHz CPU Freq, 1 second Period (in uSeconds)
ConfigCpuTimer(&CpuTimer0, 100, 1000000);
ConfigCpuTimer(&CpuTimer1, 100, 1000000);
ConfigCpuTimer(&CpuTimer2, 100, 1000000);
#endif
// To ensure precise timing, use write-only instructions to write to the entire register. Therefore, if any
// of the configuration bits are changed in ConfigCpuTimer and InitCpuTimers (in DSP2833x_CpuTimers.h), the
// below settings must also be updated.
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
CpuTimer2Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0
程序中先前已经对TCR寄存器进行了配置
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
{
Uint32 temp;
// 初始化定时器周期:
Timer->CPUFreqInMHz = Freq; // 配置频率值
Timer->PeriodInUSec = Period; // 配置定时周期值
temp = (long) (Freq * Period); // 周期*频率=定时器计数值
Timer->RegsAddr->PRD.all = temp; // 定时器计数值配置到定时器周期寄存器中
// 初始化定时器预定标计数器,即定时器周期为SYSCLKOUT同步:
Timer->RegsAddr->TPR.all = 0;
Timer->RegsAddr->TPRH.all = 0;
// 配置定时器的控制寄存器:
Timer->RegsAddr->TCR.bit.TSS = 1; // 1:停止, 0:启动/继续
Timer->RegsAddr->TCR.bit.TRB = 1; // 1:将周期寄存器PRD中的值重新装入计数器寄存器TIM中
Timer->RegsAddr->TCR.bit.SOFT = 1; // FREE=1 SOFT=1 (自由运行模式)
Timer->RegsAddr->TCR.bit.FREE = 1; // 定时器自由运行状态,在仿真条件下不会因为断点而停止
Timer->RegsAddr->TCR.bit.TIE = 1; // 使能定时器中断 0:禁止 1:使能
// 清空中断次数计数器:
Timer->InterruptCount = 0;
}
那么问题来了,请问为什么还要在开启定时器的时候使用
CpuTimer0Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0
这样一条语句呢?虽然这条语句确实能够将定时器启动,但是它会影响到
FREE=1 SOFT=1 (自由运行模式)这个状态
还有就是0x4001中的最低位为什么是1呢?手册中0~3位是保留的啊?
不太明白0x4001的原因,还请各位大大指教指教,谢谢大家! 展开
// 100MHz CPU Freq, 1 second Period (in uSeconds)
ConfigCpuTimer(&CpuTimer0, 100, 1000000);
ConfigCpuTimer(&CpuTimer1, 100, 1000000);
ConfigCpuTimer(&CpuTimer2, 100, 1000000);
#endif
// To ensure precise timing, use write-only instructions to write to the entire register. Therefore, if any
// of the configuration bits are changed in ConfigCpuTimer and InitCpuTimers (in DSP2833x_CpuTimers.h), the
// below settings must also be updated.
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
CpuTimer2Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0
程序中先前已经对TCR寄存器进行了配置
void ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)
{
Uint32 temp;
// 初始化定时器周期:
Timer->CPUFreqInMHz = Freq; // 配置频率值
Timer->PeriodInUSec = Period; // 配置定时周期值
temp = (long) (Freq * Period); // 周期*频率=定时器计数值
Timer->RegsAddr->PRD.all = temp; // 定时器计数值配置到定时器周期寄存器中
// 初始化定时器预定标计数器,即定时器周期为SYSCLKOUT同步:
Timer->RegsAddr->TPR.all = 0;
Timer->RegsAddr->TPRH.all = 0;
// 配置定时器的控制寄存器:
Timer->RegsAddr->TCR.bit.TSS = 1; // 1:停止, 0:启动/继续
Timer->RegsAddr->TCR.bit.TRB = 1; // 1:将周期寄存器PRD中的值重新装入计数器寄存器TIM中
Timer->RegsAddr->TCR.bit.SOFT = 1; // FREE=1 SOFT=1 (自由运行模式)
Timer->RegsAddr->TCR.bit.FREE = 1; // 定时器自由运行状态,在仿真条件下不会因为断点而停止
Timer->RegsAddr->TCR.bit.TIE = 1; // 使能定时器中断 0:禁止 1:使能
// 清空中断次数计数器:
Timer->InterruptCount = 0;
}
那么问题来了,请问为什么还要在开启定时器的时候使用
CpuTimer0Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0
这样一条语句呢?虽然这条语句确实能够将定时器启动,但是它会影响到
FREE=1 SOFT=1 (自由运行模式)这个状态
还有就是0x4001中的最低位为什么是1呢?手册中0~3位是保留的啊?
不太明白0x4001的原因,还请各位大大指教指教,谢谢大家! 展开
1个回答
展开全部
bit0~3是保留位,写为1 是为了与将来的代码兼容。
0x4001,TIE=1, 中断使能
另外,先对TCR=0x4001,进行初始化,
后面还有相关的位操作
0x4001,TIE=1, 中断使能
另外,先对TCR=0x4001,进行初始化,
后面还有相关的位操作
追问
非常感谢你的回复.
从程序来看,CpuTimer0Regs.TCR.all = 0x4001;这句是在后面的,在它的前面已经执行了ConfigCpuTimer()函数,在函数中详细的设定了CPU定时器寄存器的参数值,而且如果0x4001的话虽然保留了TIE,但是前面设定的FREE=1 SOFT=1就没有了,这应该不是大家所希望看到的.所以,我还是有些疑虑,或者说这段例程本身有问题.
追答
// below settings must also be updated. 这句话就是说,代码需要修改
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
CpuTimer2Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询