STM8计时器没有在正确的时间滴答

时间:2016-12-15 05:21:54

标签: timer stm8

我正在使用STM8计时器(不是我的代码,但维护它),并在其中使用计时器。显然,时钟设置为16MHz erfo 0.0625uS。定时器的设置是ARRH = 0x03 ARRL = 0x20因此(0x0320 = 800)它重置为800(ergo 50us) PSCR设置为0,因此定时器具有与micro相同的频率。

无论如何,当用示波器检查时,它不能提供良好的读数。 定时器中断在以下位置调用: 56us,54uS,54uS,52uS,52uS,52us,38us(!!!),42us(?),50us,50us ....

好奇地总结它给出500uS所以它算作10倍50uS

定时器中断的前8次发生了一些AD转换,因此有可能在它们之间调用AD中断。

1)你认为这会影响计时器的频率吗?

2)为什么它通过在38uS发射中断来“纠正”自身?

我很感激基于您的嵌入式或STM8体验的任何评论,因为我知道需要检查代码的精确答案......

1 个答案:

答案 0 :(得分:2)

我不确定你是否还需要答案。我曾经有过相同的搜索并且搜索了很长时间...在我的案例中简单的解决方案:

我有一个高抖动的ADC ISR。这来自我的主循环。在某个子子程序中,ADC中断暂时停用于临界区(中断和主循环上下文之间的数据传输)。效果正是您所描述的:

有时两次中断之间的时间较长,因为中断处于挂起状态并等待执行,直到再次启用中断为止。计时器仍在继续运行。时间示例:

  1. 在主循环(或子例程)中禁用中断
  2. 中断标志由计时器设置 - >中断未决
  3. 再次启用中断 - > ISR执行得太晚
  4. 在主循环中禁用中断
  5. 中断标志由计时器设置 - >未决
  6. 再次启用中断 - > ISR执行得太晚了
  7. 主循环不会在某些情况下禁用中断(可能是通过控制流程,可能是时间问题)
  8. 下一个中断在正确的时间执行,在最后一次中断后是50 us,而在拨打最后一个ISR后不是50 us。 - > ISR呼叫之间的时间缩短了。
  9. 我希望我能提供帮助。