#counter #cortex-m #dwt #measure-time #duration #cyccnt #microseconds

cortex-m-microclock

基于CYCCNT硬件计数器的Cortex-M设备的简单软件时钟

1 个不稳定版本

0.1.0 2023年10月4日

#258 in 性能分析

MIT/Apache

15KB
105

cortex-m-microclock

这个crate提供了一种软件时钟,它依赖于大多数Cortex-M芯片中存在的CYCCNT计数器,允许用户测量时间和产生延迟。时钟的精度取决于您的微控制器核心频率。如果您有一个至少运行在1MHZ的核心,您将具有微秒级的精度。

注意0:一些Cortex-M核心,如M0、M0+和M23核心,没有CYCCNT计数器。因此,此crate不能用于这些芯片 注意1 此crate不适用于多核系统。

底层硬件

该时钟基于Cortex-M DWT外围设备的CYCCNT计数器,它随着每个处理器时钟周期递增。但是,由于CYCCNT上计数器只有32位宽,它可能会根据您的SYSCLK频率迅速溢出。CYCCNTClock使用内部计数器跟踪多个CYCCNT周期,因此可以用于评估非常大的时间间隔。

Crate结构

CYCCNTClock是表示软件时钟的结构。此结构是一个单例,公开了crate对用户可用的所有方法。所有这些方法都是静态的,可以从任何线程中调用,而不会出现并发问题。

如何使用此crate

为了使用时钟,您首先应该调用 [CYCCNTClock::init()] 方法,该方法将接管DWT外设。从这一点开始,您可以使用 [CYCCNTClock::now()] 和 [CYCCNTClock::delay()] 方法。应定期调用 [CYCCNTClock::update()] 方法以避免CYCCNT溢出。使用以下方程式找到最小更新频率

min_update_freq= SYS_CLK_FREQ/(2³²)

注意, [CYCCNTClock::now()] 和 [CYCCNTClock::delay()] 方法隐式调用 [CYCCNTClock::update()] 方法。

示例

本项目 examples 目录中包含在STMF103 blue pill上使用此crate的完整示例。

致谢

非常感谢 fugitrtic::dwt_systick_monotonic crate的作者。

依赖关系

~780KB