0

我的 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 毫秒的持续时间。

我在这里错过了什么吗?有没有比 sysTick 更好的解决方案来实现这个目标?

谢谢。

4

1 回答 1

1

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

一般来说,合适的方法很少:

  1. 使用调度程序。设置一个硬件定时器以在溢出时产生中断,并根据必要的时间粒度将其配置为在 20us–20ms 溢出一次。在中断例程中检查您是否应该do_something()在当前调度周期中执行,如果是。保持中断例程简短且确定有限(无需长软件周期等)非常重要,尤其是在定时器周期很短的情况下。

  2. 使用一次性计时器。如果您只需要执行一个例程或严格定义顺序,则可以使用以下方法。最后do_something(),配置并启动一个硬件计时器,该计时器将do_something()在必要的时间后再次启动。因此,在您刚刚启动的中断例程do_something()中,然后在开始时do_something()重置计时器,完成您的工作并再次设置计时器。这样,您可以将延迟控制到单个时钟周期。然而,这种解决方案更难维护和扩展。

  3. 结合。您可以使用旋转一次性计时器的调度程序来精确控制执行开始时间。

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

于 2018-08-21T14:11:25.617 回答