我需要STM32F7的高精度中断。任务是在每个刻度上增加一个计数器。 CPU的频率高达216 MHz(来自数据表),这意味着可以实现大约5 ns的滴答持续时间,对吗?

经过一些互联网研究,我发现sysTick可以用于此目的。我应该简单地配置SysTick,如下所示:

/** Configure the Systick interrupt time */
    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

/**Configure the Systick */
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);


我在SysTick_Handler函数内切换一个GPIO引脚以检查执行频率,它是1毫秒。

我想要达到1微秒的滴答持续时间,所以我用100代替了代码中的1000(在代码中),然后尝试了不同的数字,但似乎没有影响1 ms的持续时间。

我在这里想念什么吗?
是否有比sysTick更好的解决方案来实现此目标?

谢谢。

最佳答案

您不能(也不应该!)在每个时钟周期增加一些变量。相反,您应该使用硬件计时器(TIMx)进行这样的精度测量。

通常,很少有合适的方法:


使用调度程序。设置硬件定时器以在溢出时产生中断,并将其配置为在20us-20ms内溢出一次,具体取决于必要的时间间隔。在中断例程中,检查是否应在当前的调度周期内执行do_something(),如果可以,请执行。保持中断例程的时间短并且一定要有限(没有较长的软件周期等),这一点非常重要,尤其是在定时器周期很短的时候。
使用一键式计时器。如果只需要执行一个例程或严格定义了顺序,则可以使用以下方法。在do_something()的最后,配置并启动硬件计时器,该计时器将在必要的时间后再次启动do_something()。因此,在中断程序中,您只需启动do_something(),然后在do_something()的开头重置计时器,完成您的工作并再次设置计时器。这样,您可以控制最多单个时钟周期的延迟。但是,此解决方案很难维护和扩展。
结合。您可以使用调度程序,该调度程序旋转一个计时器,以精确控制执行开始时间。


调度是MCU软件开发领域的研究重点。上面有很多文章以及适用于此功能的MCU的成熟实时操作系统,以及诸如FreeRTOS或ChibiOS之类的更多文章。如果是商业项目,通常应该坚持使用FreeRTOS等通用工具,而不要编写自己的调度程序。但是,当然,这非常有教育意义,而且很有趣!

关于c - sysTick频率操纵?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51908892/

10-11 19:43