This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我想将计时器设置为在没有中断的情况下进行毫秒计数。
因此、我配置一个计时器(CPU 频率= 120MHz)
void SysTimerInit (void) { uint32预分频器; //确保停止计时器: CpuTimer1Regs.TCR.bit.TSS = 1; //将定时器周期初始化为最大值: CpuTimer1Regs.PRD.All = 0xFFFFFFFF; 预分频器= 120000-1;//1000US->1ms CpuTimer1Regs.TPR.bit.TDDR =(预分频器和0x0000FFFF); CpuTimer1Regs.TPRH.bit.TDDRH =(预分频器>> 8); //初始化计时器控制寄存器: CpuTimer1Regs.TCR.bit.TRB = 1; // 1 =重新加载计时器 CpuTimer1Regs.tcr.bit.soft = 1; CpuTimer1Regs.TCR.bit.FREE = 1; //定时器自由运行 CpuTimer1Regs.tcr.bit.tie = 0; // 0 =禁用/ 1 =启用计时器中断 CpuTimer1Regs.TCR.bit.TSS = 0; // 1 =停止计时器,0 =启动/重新启动计时 器}
和函数来处理计数器
void SysTimerSet (uint32 *比较_val、uint32 count_ms) { uint32 timer_count_val = CpuTimer1Regs.TIM.all; *比较_val = timer_count_val - count_ms; } UINT16 SysTimerElapsed (UINT32 *比较_val) { uint32 timer_count_val = CpuTimer1Regs.TIM.all; 返回(timer_count_val <=*比较_val); }
然后我进行测试。
SysTimerInit(); SysTimerSet (&COMPARE_val、100); while (1) { if (SysTimerElapsed (&COMPARE_val)) }{ SysTimerSet (&COMPARE_val、100); }
在调试器中、我应该看到变量 COMPARE_Val 递减100。 但我看到一些随机数。 我的错在哪里?
是否停止 CPU 以检查 COMPARE_VAL? 由于您设置了软位和空闲位、因此即使在您停止后、计时器也将继续运行、因此我怀疑这会影响您的预期计数。
不过、为了确定、您可以创建一个数组来存储 COMPARE_VAL 值、并且当数组已满时、停止程序并确保存储在数组中的值减100。 类似如下:
uint32 compare_val 数组[64]; I = 0; while (1) { if (SysTimerElapsed (&compare_val)) { SysTimerSet (&compare_val、100); Compar_val_array[i++]= COMPARE_val; if (i ==64) { _asm (" ESTOP0"); I = 0; } }
惠特尼