0

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

无论如何,当用示波器检查时,它并没有给出好的读数。定时器中断被调用在: 56us , 54uS, 54uS, 52uS, 52uS, 52us, 38us(!!!), 42us(?), 50us, 50us....

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

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

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

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

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

4

1 回答 1

2

我不确定你是否还需要答案。我曾经有过同样的经历并搜索了很长时间......在我的情况下是简单的解决方案:

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

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

  1. 在主循环(或子程序)中禁用中断
  2. 中断标志由定时器设置 -> 中断挂起
  3. 再次启用中断 -> ISR 执行得太晚
  4. 在主循环中禁用中断
  5. 中断标志由定时器设置 -> 挂起
  6. 再次启用中断 -> ISR 执行太晚了
  7. 在某些情况下,主循环不会禁用中断(可能是控制流,可能是时序问题)
  8. 下一个中断在正确的时间执行,即在引发最后一个中断后 50 us,而不是在调用最后一个 ISR 后 50 us。--> ISR 调用之间的时间缩短了。

我希望我能帮上忙。

于 2017-01-17T15:11:46.960 回答