You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

STM32F767ZI Nucleo板DWT周期计数器测函数时间及时钟疑问

解答你的STM32周期计数与时钟频率问题

关于时间计算的公式是否正确

你的公式time_in_seconds = cycles/216*10^6错误的,问题出在单位换算的逻辑搞反了。

STM32F767的SYSCLK是216MHz,意味着每秒会产生216×10^6个时钟周期。所以正确的时间计算应该是:

float time_in_seconds = (float)cycles / 216000000.0f;

或者用更简洁的科学计数法写法:

float time_in_seconds = (float)cycles / (216e6);

你的原公式相当于把周期数先除以216再乘以1e6,结果会比实际时间大出好几个数量级,完全不符合实际逻辑。

另外还要补个重要提醒:使用DWT计数器前,必须先开启它的计数功能,否则DWT->CYCCNT根本不会正常累加。需要在代码开头添加这两行初始化代码:

CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;  // 开启调试跟踪功能
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;             // 开启CYCCNT计数器

关于降低板卡时钟频率对函数耗时的影响

答案是会增加函数的耗时(以秒为单位)

简单解释一下:对于纯CPU执行的函数(不涉及外设等待、中断触发这类不确定因素的话),函数执行需要的时钟周期总数是基本固定的。当你降低板卡的时钟频率时,每个时钟周期的持续时间会变长(比如从216MHz降到108MHz,单个周期时间从4.6ns变成9.2ns)。总耗时=周期总数 × 单个周期时间,所以总耗时自然会增加。

举个直观例子:假设你的函数需要1000个时钟周期,216MHz下耗时是1000/216e6 ≈ 4.6μs;降到108MHz后,耗时变成1000/108e6 ≈ 9.2μs,正好翻倍。

内容的提问来源于stack exchange,提问作者Habebit

火山引擎 最新活动