我正在开发一个应用程序,使用定时器寄存器在DA14580套件与32KHZ时钟频率,
我设置了TIMER0_ON_REG寄存器与反时间周期,需要发射后。
这是用来将周期转换为计数器的方程
On_counter = (period_ms * 32)- 1
加载TIMER0_ON_REG与on_counter我需要获得当前计数器通过计时器正在运行
i will read TIMER0_ON_REG .我将读取TIMER0_ON_REG
用公式(((on_counter) + 1) / 32转换读取数,得到经过时间
但是我这里的问题是从这个寄存器读取值是不准确的,很多时间是零!!
我需要知道这个计数器是在计数还是在计数

嗨Eslam
你能给我们展示一下你的项目和代码吗?
的问候!
PY
这段代码应该设置定时器触发后300毫秒使用32khz时钟,但我的问题是,它触发后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);/ /启用定时器
-------------------------------------------------------------------------------------------
我的第二个问题是在启动计时器后获取当前计数器读数以获得当前时间
我用这个代码得到它,但它也不准确,很多时候它得到0,所以我怎么知道当前时间??
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中的peripheral_examples。
3.我不建议您阅读TIMER0_ON_REG。对于任何泛型计时器,计数器是不稳定的,你不知道它什么时候会改变,所以读取是不安全的。出于您的目的,也许可以考虑减少计数器阈值,并使用您自己的代码来积累。像下图:
u32_tick = 300;
而在isr
当前时间+ +;
的问候!
PY
1.我不知道哪个32KHz晶体使用内部或外部,但我在数据表中提到的配置它,我清除TIMER0_CTRL_REG寄存器中的TIM0_CLK_SEL位
所以请告诉我可以使用哪种32KHz晶体?以及如何准确地使用32KHZ获得300毫秒?
2-我通过在定时器isr中切换一个位来测试它,并使用示波器显示切换周期,如果你建议使用PWM代替,请告诉我如何检查定时器触发之间的间隔?我已经检查了peripheral_examples,他告诉我使用蜂鸣器,但我没有
3-如果不安全读取TIMER0_ON_REG,如果有任何其他方法从寄存器获得计时器的值,因为我从我的系统要求强制这样做。并且已经在数据表中提到,我可以读取TIMER0_ON_REG和实际的计数器值ON_CNTer返回
请告知你已收到此信息,好吗?