我正在使用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
。以下图片是运行时发生的示例。 Before:![Before](https://istack.dev59.com/sGhXk.webp)
![After](https://istack.dev59.com/OJMwI.webp)
const
限定符,它们仍然是变量。) - too honest for this site