我正在使用 STM32F7-Discovery 开发板,并且一直在尝试启用 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
下面的图片是运行时发生的情况的示例。