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




