一段时间以来,我一直在使用STM32F4处理器中的DWT周期计数器CYCCNT进行定时操作。我随处可见,都假定这是一个32位计数器。
但是,我现在正在使用STM32F411CE处理器,在我看来只有31位。 我运行这段代码:
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CTRL |= 1;
uint32_t next = millis()+200;
DWT->CYCCNT = 0;
while(1){
while(next > millis()){
// do nothing
}
next += 200;
printf("%8lu %12lu\n",next,DWT->CYCCNT);
}
并在终端上观察结果。处理器以100MHz运行,因此计数器在200ms后增加了2000万。过了一会儿,计数器的值结束了,但结束了2 ^ 31,而不是2 ^ 32:
21435 2039916353
21635 2059916353
21835 2079916353
22035 2099916353
22235 2119916353
22435 2139916341
22635 12432705
22835 32432705
23035 52432705
23235 72432705
那么,有人可以指出STM32F411处理器上CYCCNT计数器宽度的任何确切信息吗?还是我忽略了令人尴尬的简单事情?
更新:
我在包含STM32F405处理器的板上运行了完全相同的代码,并得到了以下结果:
30419 4204732031
30619 4233532031
30819 4262332031
31019 4291132031
31219 24964735
31419 53764738
31619 82564738
31819 111364735
在我看来,'405处理器CYCCNT寄存器 是32位,而'411处理器仅为31位。最奇怪!
UPDATE2:
具有相同处理器类型的第二块板也表现良好。一个朋友还在他(不同)的411板上运行了代码,没有任何问题。现在看来,板子本身有故障,或者处理器可能坏了。所有其他处理器功能似乎正确。看起来是时候换出处理器了。
答案 0 :(得分:0)
DWT_CYCCNT的描述在《 Arm V7m体系结构参考手册》的C1.8.8节中,您可以从here中获得
第C1.8.3节说
CYCCNT是一个可选的自由运行的32位循环计数器。
在实现和启用后,CYCCNT在处理器时钟的每个周期递增。当柜台 溢出,它透明地包装为零。
所以这不能解释您的发现。