gpt4 book ai didi

c - sysTick 频率操纵?

转载 作者:行者123 更新时间:2023-11-30 14:46:52 25 4
gpt4 key购买 nike

我的 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 微秒的滴答持续时间,因此我将代码中的 1000 替换为 100,然后我尝试了不同的数字,但似乎没有什么影响 1 毫秒的持续时间。

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

谢谢。

最佳答案

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

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

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

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

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com