- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 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
) 来进行此类精确测量。
一般来说,合适的方法很少:
使用调度程序。设置硬件定时器以在溢出时生成中断,并根据必要的时间粒度将其配置为每 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/
我目前正在旁听有关嵌入式系统的在线 edX 类(class),并学习如何使用 SysTick 计时器计算耗时。 Picture of logic I'm referring to Code of lo
我目前正在努力处理一段非常简单的代码,它表明 ARM GCC 的 1 级优化器以某种方式破坏了一个简单的公式。 这使用标准编译器设置 (O1) 在最新的 Atmel 6.2 Studio 上运行。 A
我的 STM32F7 需要高精度中断。任务是在每次滴答时增加一个计数器。 CPU 的频率高达 216 MHz(来自数据表),这意味着可以实现大约 5 ns 的滴答持续时间,对吗? 经过一些互联网研究,
SysTick使用说明 系统节拍 我们有一个基于 STM32G483 MCU (Cortex M4) 的定制板。我们使用 SysTick 作为软件定时器的引用。 SysTick 重载寄存器设置为 0x
我有一个 SysTick 异常处理程序,它计算滴答并调用其他函数(f1、f2、f3),其执行时间可以长于 SysTick 周期。这些函数设置和清除它们的事件状态(全局变量),因此如果发生 SysTic
我目前正在移植我的 DCF77 library (您可能会发现 source code at GitHub )从 Arduino(基于 AVR)到 Arduino Due(ARM Cortex M3)
我有一个用于半托管的 ATSAMD21E18A 微型。为了使半托管工作,GDB 需要在第一条 bkpt 指令之前“附加”。另一方面,我莫名其妙地发现,如果在我配置 GDB 时已经附加了 GDB,则 S
我在获取在运行 uC/OS-III 的 NXP LPC1857 上平稳运行的 LED 的 PWM 信号时遇到问题。仅当我禁用以 1ms 运行的操作系统 systick 时,定期发生的闪烁才会停止。 我
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!