Timer STM8定时器未在正确的时间滴答作响

Timer STM8定时器未在正确的时间滴答作响,timer,stm8,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 库

我正在使用一个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

库里奥斯利总结说,它给了我们500美元,所以它确实是50美元的10倍

在定时器中断的前8次,一些AD转换正在发生,因此在这期间也有可能调用AD中断

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

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


如果您有任何关于嵌入式或STM8的经验,我将不胜感激,因为我知道准确的答案需要检查代码…

我不确定您是否还需要答案。我曾经有过同样的经历,并且寻找了很长时间。。。在我的例子中,简单的解决方案是:

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

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

  • 主回路(或子程序)中的中断被禁用
  • 中断标志由定时器->中断挂起设置
  • 再次启用中断->执行ISR太晚
  • 中断在主循环中被禁用
  • 中断标志由定时器->挂起设置
  • 中断再次启用->ISR执行得太晚
  • 主回路在某些情况下不禁用中断(可能是由于控制流,可能是由于时序问题)
  • 下一个中断在正确的时间执行,即发出最后一个中断后的50 us,而不是调用最后一个ISR后的50 us。-->ISR呼叫之间的时间缩短

  • 我希望我能帮忙。

    我不确定你是否还需要答案。我曾经有过同样的经历,并且寻找了很长时间。。。在我的例子中,简单的解决方案是:

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

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

  • 主回路(或子程序)中的中断被禁用
  • 中断标志由定时器->中断挂起设置
  • 再次启用中断->执行ISR太晚
  • 中断在主循环中被禁用
  • 中断标志由定时器->挂起设置
  • 中断再次启用->ISR执行得太晚
  • 主回路在某些情况下不禁用中断(可能是由于控制流,可能是由于时序问题)
  • 下一个中断在正确的时间执行,即发出最后一个中断后的50 us,而不是调用最后一个ISR后的50 us。-->ISR呼叫之间的时间缩短
  • 我希望我能帮忙