首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32 -如何启用DWT循环计数器

STM32 -如何启用DWT循环计数器
EN

Stack Overflow用户
提问于 2016-04-02 20:22:03
回答 5查看 29.1K关注 0票数 16

我正在使用STM32F7-Discoveryboard,并且一直在尝试启用DWT循环计数器。从我在网上看到的情况来看,这应该足以启用它:

代码语言:javascript
复制
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL  |= 1;

但是,每当我运行该代码时,都不会更改值或跳过操作(我不太确定发生了什么)。

我试着做指向内存中地址的指针,并直接修改它们,但也没有效果。例如:

代码语言:javascript
复制
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)中处理调试器时,我得到的唯一方法是。除此之外,我似乎无法在代码中得到可以更改的值。

编辑:是什么导致这些代码行没有执行任务,但也不会崩溃和继续的行为。

代码语言:javascript
复制
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL  |= 1;

在运行这些代码行之后,这些内存位置上的所有值都保持不变,并且不会随着应该执行的操作而改变。

例如:

代码语言:javascript
复制
//DWT_CTRL_CYCCNTENA_Msk = 1
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk 

应该会导致DWT->CTRL的值为0x40000001,但它将保持其默认值0x40000000

下面的图片是运行时发生的事情的一个例子。

之前:

之后:

EN

回答 5

Stack Overflow用户

发布于 2016-05-20 11:45:55

可能缺少解锁dbg (DWT->LAR = 0xC5ACCE55):下面的顺序为我解决了pb:

代码语言:javascript
复制
      CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
      DWT->LAR = 0xC5ACCE55; 
      DWT->CYCCNT = 0;
      DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
票数 10
EN

Stack Overflow用户

发布于 2016-04-02 23:21:10

不确定这在STM32F7上是否相同,但这是如何使用STM32F4上的CMSIS正确地完成它(实际上应该在任何Cortex-M3/4(/7?)提供此模块):

代码语言:javascript
复制
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;

您也必须启用跟踪模块。注意,代码不是中断安全的!通常,您应该让计数器自由运行,并采取不同的快照的时间。

只需确保您的工具链不使用干扰您的代码。OpenOCD/gdb不确定提供手动分析功能的工具如何。

正如我在评论中所强调的:不要使用一些自制的寄存器定义。ST (和ARM)为您应该使用的标准外围模块(DWT和CoreDebug实际上是ARM IP)提供CMSIS。这包括不使用魔术数字,而是使用定义的常量/宏。

更多信息可在“架构参考手册”中找到。警告:还有一个“架构应用程序级参考手册”,这不是您想要的。

票数 7
EN

Stack Overflow用户

发布于 2016-12-16 16:31:26

您所做的一切都是正确的,除了您缺少对DWT寄存器的解锁访问(正如Howard指出的那样)。在您的代码中,应该是这样的:

代码语言:javascript
复制
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所说的那样,效率会更高;)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36378280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档