我正在开发一个应用程序,该应用程序使用DA14580套件中的计时器寄存器,具有32kHz clok频率,
我将timer0_on_reg设置为与时间段相反的计数器,后者需要在后面启动。
这是用于转换时期以对抗的方程式
on_counter =(erecy_ms * 32)-1
aftet加载timer0_on_reg带有on_counter,我需要通过计时器来获取当前计数器
示例计时器需要在500毫秒之后1000毫秒后发射我将阅读timer0_on_reg
并使用等式转换读数(((((on_counter) + 1) / 32以获取经过的时间
但是我的问题在这里从该寄存器中读取价值不准确,很多时间为零!
我需要知道这个核心是在计数还是向下计数
嗨,Eslam
您可以向我们展示您的项目和代码吗?
问候!
py
该代码应该在300毫秒使用32 kHz时钟后将计时器设置为开火,但我的问题是它在309.20794毫秒后发射
哪个是不准确的,我需要更准确,所以我该如何才能得到???
以下是执行上述内容的代码:
--------------------------------------------------------------------------------------------------------------
setBits16(clk_per_reg,tmr_div,0);
setBits16(clk_per_reg,tmr_enable,1);
setBits16(timer0_ctrl_reg,tim0_clk_sel,0);//选择32kHz输入时钟
setBits16(timer0_ctrl_reg,tim0_clk_div,1);
setBits16(timer0_ctrl_reg,tim0_ctrl,0);
u32_tick = 300 * 32
setWord16(timer0_on_reg,u32_tick);
nvic_enableirq(swtim_irqn);
nvic_clearpendingirq(swtim_irqn);
setBits16(timer0_ctrl_reg,tim0_ctrl,1);//启用计时器
-----------------------------------------------------------------------------------------------------------------------------------------------------
我的第二个问题是在启动计时器后获得当前的计数器阅读以获取当前时间
我使用此代码来获取它,但是它也不准确,很多时候它得到零,所以我怎么知道当前时间?
u16_on_reg = getWord16(timer0_on_reg);
current_time =((U16_ON_REG) / 32);
谢谢,
Eslam
嗨,Eslam,
我无法测试您的整个项目,但这是您的一些建议。
1. 32kHz晶体(不知道您使用的外部还是内部)不能恰好是32000Hz。因此,300*32不能完全给您300ms的间隔。
2.我不知道您如何测试超时间隔。如果您使用软件方法(调试或输入ISR并设置IO信号),则可能是一些系统开销。我建议您使用PWM方法测试间隔是否稳定。您可以参考我们的SDK中的围栏示例。
3.我不建议您阅读timer0_on_reg。对于任何通用计时器,计数器都是挥发性的,您不知道它何时会更改,因此读取不安全。出于您的目的,可以考虑减少反阈值并使用自己的代码积累。如下:
u32_tick = 300;
在ISR中
current_time ++;
问候!
py
1.我不知道哪个32KHz水晶使用了内部或外部,但是我将其配置如数据表中所述,我在tim0_clk_sel bit中清除timer0_ctrl_reg寄存器中的tim0_clk_selit
所以请告诉我我可以使用哪个32kHz水晶?以及如何使用32kHz准确获得300毫秒?
2-我通过在计时器ISR中切换一点并使用示波器显示切换期来对其进行测试,如果您建议使用PWM,请告诉我如何脸颊触发计时器射击之间的间隔?我已经检查了外围_examples,他告诉我使用蜂鸣器,但我没有
3-如果读取timer0_on_reg不安全,如果有其他方法可以从寄存器中获取计时器值,因为我从系统要求中强制执行此操作。
您能确认您收到了消息吗?