我正在开发一个应用程序,使用DA14580套件中的定时器寄存器,具有32kHz CLOK频率,
我将计时器0_ON_REG寄存器与计数器相反,与需要在射击之后所需的时间段。
这是用于转换为计数器的方程
ON_Counter =(句点* 32) - 1
使用on_counter加载timer0_on_reg,我需要通过定时器获取当前计数器
在500毫秒后,我将读取Timer0_On_reg后1000毫秒后,需要进行示例定时器。
并使用等式转换读数(((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_clearpitchingirq(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的间隔。
我不知道你是如何测试超时的时间间隔。如果使用软件方法(调试或输入ISR并设置IO信号),它可能是某些系统开销。我建议您使用PWM方式来测试间隔是否稳定。您可以在SDK中引用Peripheral_examples。
3.我不会建议您读取timer0_on_reg。对于任何通用计时器,计数器都是易失利的,你不知道它什么时候会改变,所以阅读不安全。为您的目的,也许考虑降低计数器阈值并使用您自己的代码累积。如下:
U32_Tick = 300;
在ISR.
current_time ++;
问候!
PY
1.我不知道哪个32khz水晶使用内部或外部,但是我将其配置如datasheet中提到的,我在timer0_ctrl_reg寄存器中清除tim0_clk_sel位
所以请告诉我我可以使用哪种32khz水晶?以及如何使用32khz的300 ms?
2-我通过在定时器ISR中切换一点并显示使用示波器来显示切换时段的测试,如果您建议使用PWM,请告诉我如何在计时器射击之间的间隔才能触手?我已经检查了外围_examples,他告诉我,使用蜂鸣器,但我没有它
3-如果没有安全地阅读Timer0_On_Reg,如果有任何其他方法可以从寄存器中获取计时器值,因为我强制从我的系统要求进行硬质,我可以读取Timer0_On_Reg和实际计数器值返回on_cnter
您能否承认您重新回复了这封信?