我需要为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更好的解决方案来实现此目标?
谢谢。
答案 0 :(得分:1)
您不能(也不应该!)在每个时钟周期增加一些变量。相反,您应该使用硬件计时器(TIMx
)进行这种精确的测量。
通常,很少有合适的方法:
使用调度程序。设置硬件定时器以在溢出时产生中断,并将其配置为在20us-20ms内溢出一次,具体取决于必要的时间间隔。在中断例程中,检查是否应该在当前的调度周期中do_something()
,如果这样做,请这样做。保持中断例程的时间短并且一定有限制(没有较长的软件周期等),这一点非常重要,尤其是在计时器周期很短的时候。
使用单次计时器。如果您只需要执行一个例程或严格定义了顺序,则可以使用以下方法。在do_something()
的最后,配置并启动硬件计时器,该计时器将在必要的时间后再次启动do_something()
。因此,在中断例程中,您只需启动do_something()
,然后在do_something()
的开头重置计时器,完成您的工作并重新设置计时器。这样,您可以控制最多单个时钟周期的延迟。但是,这种解决方案很难维护和扩展。
组合。您可以使用调度程序,该调度程序旋转一个计时器,以精确控制执行开始时间。
调度是MCU软件开发领域的研究重点。上面有很多文章以及适用于此功能的MCU的成熟实时操作系统,以及诸如FreeRTOS或ChibiOS之类的更多文章。如果是商业项目,通常应该坚持使用FreeRTOS等通用工具,而不要编写自己的调度程序。但是,当然,这非常有教育意义,而且很有趣!