我使用的是stm32f7发现板,一直在尝试启用dwt循环计数器。从我在网上看到的情况来看,这应该足以实现它:

CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= 1;

但是,当我运行该代码时,值不会更改或操作会被跳过(我不太确定发生了什么)。
我试着用指针指向内存中的地址,并直接修改它们,但也没有用。前任:
volatile uint32_t *DWT_CONTROL = (uint32_t *) 0xE0001000;
volatile uint32_t *DWT_CYCCNT = (uint32_t *) 0xE0001004;
volatile uint32_t *DEMCR = (uint32_t *) 0xE000EDFC;
*DEMCR = *DEMCR | 0x01000000;
*DWT_CYCCNT = 0;
*DWT_CONTROL = *DWT_CONTROL | 1;

目前,我获得的唯一方法是在visual studios(visualgdb)中单步执行调试器时,如果将dwt->ctrl的值更改为循环计数器开始的on值。除此之外,我似乎无法在代码中更改值。
编辑:是什么导致了这些代码行没有执行它们的任务,也没有崩溃和继续的行为。
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= 1;

在运行这些代码行之后,这些内存位置的所有值都保持不变,并且不会随应执行的操作而改变。
例如:
//DWT_CTRL_CYCCNTENA_Msk = 1
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk

应该会导致dwt->ctrl的值为0x40000001,但仍保持默认值0x40000000
下面的图片是运行时发生的情况的示例。
Before
After

最佳答案

可能缺少解锁dbg regs(dwt->lar=0xc5acce55):
下面的顺序为我解决了PB:

      CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
      DWT->LAR = 0xC5ACCE55;
      DWT->CYCCNT = 0;
      DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;

关于c - STM32-如何启用DWT周期计数器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36378280/

10-12 02:58