我正在开发一个应用程序,它使用DA14580工具包中的定时器寄存器,时钟频率为32KHZ,
我将TIMER0\u设置在\u寄存器上,计数器与需要在之后触发的时间段相对。
这是用于将周期转换为计数器的公式
计数器上=(周期\ms*32)-1
在加载计时器0\u ON \u REG和ON \u计数器后,我需要通过计时器运行获取当前计数器
示例计时器需要在1000毫秒后触发500毫秒后我将在\u REG上读取计时器0
用公式(((在计数器上)+1)/32转换读数,得到经过的时间
但是我的问题是从这个寄存器中读取值是不准确的,而且很多时间是零!!
我要知道这个人是在倒计时还是在倒计时
嗨,Eslam
你能给我们看看你的项目和代码吗?
当做!
PY公司
这个代码应该设置为300毫秒后使用32千赫时钟,但我的问题是,它在309.20794毫秒后火灾定时器
这是不准确的,我必须更准确,所以我怎么才能得到它???
以下是执行上述操作的代码:
---------------------------------------------------------------
设置16(CLK\ U PER\ U REG,TMR\ U DIV,0);
设置16(CLK\ U PER\ U REG,TMR\ U ENABLE,1);
SetBits16(TIMER0_CTRL_REG,TIM0_CLK_SEL,0);//选择32KHz输入时钟
SetBits16(定时器0\u CTRL\u REG,定时器0\u CLK\u DIV,1);
SetBits16(定时器0\u CTRL\u REG,定时器0\u CTRL,0);
u32ƏƏ=300*32
设置字16(定时器0\u ON \u REG,u32\u tick);
NVIC启用IRQ(SWTIM\U IRQn);
NVIC\u ClearPendingIRQ(SWTIM\u IRQn);
SetBits16(TIMER0_CTRL_REG,TIM0_CTRL,1);//启用计时器
-------------------------------------------------------------------------------------------
我的第二个问题是获取当前计数器读数,以便在启动计时器后从中获取当前时间
我用这个代码得到它,但它也不准确,而且很多时候它都是零,所以我怎么知道当前时间??
u16\u on \u reg=GetWord16(定时器0\u on \u reg);
当前\u时间=((u16 \u on \u reg)/32);
谢谢,
伊斯兰
嗨,Eslam,
我不能测试你的整个项目,但这里有一些建议给你。
132KHz的晶体(不知道你是使用外部还是内部)不能精确到32000HZ。所以300*32不能给出确切的300毫秒间隔。
2我不知道你是怎么测试超时间隔的。如果使用软件方法(调试或输入ISR并设置IO信号),可能会产生一些系统开销。我建议你用脉宽调制的方法来测试间隔是否稳定。您可以参考我们SDK中的示例。
三。我不建议您阅读\u REG上的TIMER0\u。对于任何普通计时器,计数器是不稳定的,你不知道它什么时候会改变,所以读数是不安全的。出于您的目的,可以考虑降低计数器阈值并使用您自己的代码进行累积。如下所示:
u32Ətick=300;
在isr中
当前时间++;
当做!
PY公司
1我不知道哪个32KHz晶体使用内部或外部,但我配置它在数据表中提到,我清除TIMER0\U CLK\U SEL位在定时器0\U CTRL\U REG寄存器
那么请告诉我我能用哪个32KHz的晶体?那么如何用32KHZ获得300ms的准确频率呢??
2-我通过在定时器isr中切换一点来测试它,并使用示波器显示切换周期,如果您建议改用pwm,请告诉我如何检查定时器触发之间的间隔??我已经查过他的例子了,他告诉我用蜂鸣器,但我没有
3-如果读取\u REG上的TIMER0\u不安全,如果有其他方法从寄存器获取计时器值,因为我是根据系统要求强制这样做的hardwaly和在数据表中已经提到,我可以读取\u REG上的TIMER0\u,并返回\u CNTer上的实际计数器值
请确认您收到了这封信好吗?