我正在使用STM32F7-Discoveryboard,并且一直在尝试启用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;
目前,如果我将DWT->CTRL的值更改为循环计数器开始的ON值,那么在VisualGDB中(使用VisualGDB)中处理调试器时,我得到的唯一方法是。除此之外,我似乎无法在代码中得到可以更改的值。
编辑:是什么导致这些代码行没有执行任务,但也不会崩溃和继续的行为。
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
。
下面的图片是运行时发生的事情的一个例子。
在之前:
在之后:
发布于 2016-05-20 03:45:55
可能缺少解锁dbg (DWT->LAR = 0xC5ACCE55):下面的顺序为我解决了pb:
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->LAR = 0xC5ACCE55;
DWT->CYCCNT = 0;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
发布于 2016-04-02 15:21:10
不确定这在STM32F7上是否相同,但这是如何使用STM32F4上的CMSIS正确地完成它(实际上应该在任何Cortex-M3/4(/7?)提供此模块):
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
您也必须启用跟踪模块。注意,代码不是中断安全的!通常,您应该让计数器自由运行,并采取不同的快照的时间。
只需确保您的工具链不使用干扰您的代码。OpenOCD/gdb不确定提供手动分析功能的工具如何。
正如我在评论中所强调的:不要使用一些自制的寄存器定义。ST (和ARM)为您应该使用的标准外围模块(DWT和CoreDebug实际上是ARM IP)提供CMSIS。这包括不使用魔术数字,而是使用定义的常量/宏。
更多信息可在“架构参考手册”中找到。警告:还有一个“架构应用程序级参考手册”,这不是您想要的。
发布于 2016-12-16 08:31:26
您所做的一切都是正确的,除了您缺少对DWT寄存器的解锁访问(正如Howard指出的那样)。在您的代码中,应该是这样的:
volatile uint32_t *DWT_CONTROL = (uint32_t *) 0xE0001000;
volatile uint32_t *DWT_CYCCNT = (uint32_t *) 0xE0001004;
volatile uint32_t *DEMCR = (uint32_t *) 0xE000EDFC;
volatile uint32_t *LAR = (uint32_t *) 0xE0001FB0; // <-- added lock access register
*DEMCR = *DEMCR | 0x01000000; // enable trace
*LAR = 0xC5ACCE55; // <-- added unlock access to DWT (ITM, etc.)registers
*DWT_CYCCNT = 0; // clear DWT cycle counter
*DWT_CONTROL = *DWT_CONTROL | 1; // enable DWT cycle counter
注意,正如ARMv7-M体系结构参考手册中所述,锁机制只适用于软件访问。始终允许DAP访问(这就是为什么可以使用调试器启用循环计数器的原因)。
请注意,STM32F7文档和ARM文档都有一个错误,并将0xE0000FB0作为锁定访问寄存器的地址(参见这里)。使用提供的CMSIS核心寄存器定义(core_cm7.h)可以避免这个问题,因为它们是正确的,当然,正如Olaf所说的那样,效率会更高;)
https://stackoverflow.com/questions/36378280
复制相似问题