STM32F411 DWT CYCCNT计数器宽度

时间:2018-11-22 15:52:03

标签: stm32 stm32f4

一段时间以来,我一直在使用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板上运行了代码,没有任何问题。现在看来,板子本身有故障,或者处理器可能坏了。所有其他处理器功能似乎正确。看起来是时候换出处理器了。

1 个答案:

答案 0 :(得分:0)

DWT_CYCCNT的描述在《 Arm V7m体系结构参考手册》的C1.8.8节中,您可以从here中获得

第C1.8.3节说

  

CYCCNT是一个可选的自由运行的32位循环计数器。

     

在实现和启用后,CYCCNT在处理器时钟的每个周期递增。当柜台   溢出,它透明地包装为零。

所以这不能解释您的发现。