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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL  |= 1;

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL  |= 1;

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

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//DWT_CTRL_CYCCNTENA_Msk = 1
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk 

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

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

之前:

之后:

EN

回答 5

Stack Overflow用户

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      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 15:21:10

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 08:31:26

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

复制
相关文章
Cortex-M中特别实用的DWT计数器
素材来源:https://blog.csdn.net/booksyhay/article/details/109028712
李肖遥
2022/12/22
5350
Cortex-M中特别实用的DWT计数器
一种Cortex-M内核中的精确延时方法(ns级别)
在Cortex-M里面有一个外设叫DWT(Data Watchpoint and Trace),是用于系统调试及跟踪,
GorgonMeducer 傻孩子
2020/08/04
1.9K0
一种Cortex-M内核中的精确延时方法(ns级别)
MCU上的代码执行时间
在许多实时应用程序中,二八原则并不生效,CPU 可以花费95%(或更多)的时间在不到5% 的代码上。电动机控制、引擎控制、无线通信以及其他许多对时间敏感的应用程序都是如此。这些嵌入式系统通常是用c编写的,而且开发人员常常被迫对代码进行手工优化,可能会回到汇编语言,以满足性能的需求。测量代码部分的实际执行时间可以帮助找到代码中的热点。本文将说明如何可以方便地测量和显示在基于Cortex-M MCU的实时执行时间。
半吊子全栈工匠
2018/08/22
1.4K0
MCU上的代码执行时间
基于STM32的串口循环队列
先说串口,这个应该都知道吧!(不知道的童鞋,先把基本功学好)大部分单片机或者处理器都会带一个或者多个串口,方便进行数据的通信。
MCU起航
2020/06/29
1K0
Java多线程工具类之循环栅栏计数器
本文主要内容:CyclicBarrier(下文中凯哥就用cycBar来代替)定义介绍;举例说明;代码演示;从源码来看原理及总结;CyclicBarrier与CountDownLatch(下文就用CountDown来代替)比较。
凯哥Java
2020/04/09
1.2K0
如何选择通用计数器?
通用计数器可以用于的行业和场景是航空航天、导弹、武器等领域的时间测量和晶振,电子元器件等科研、计量领域的时间、频率测量,因此选择一款合适的通用计数器就显得尤其重要,用户需要从性能指标、性价比、功能指标和售后服务等方面综合考虑选择合适的通用计数器。
时频专家
2020/06/16
9150
如何选择通用计数器?
如何启用WORDPRESS全站SSL
本来以前Wordpress启用全站SSL很容易的,结果发现WP自己把这个过程弄复杂了,对于新的WP站点,我们可以简单如下处理:
Zach
2019/12/30
1.7K0
如何启用Nginx状态监控
  编译Nginx的时候添加参数:--with-http_stub_status_module
习惯说一说
2019/07/17
7490
如何启用Oozie的HA
Oozie是基于Hadoop的作业调度工具,工作流引擎,在实际工作中,遇到对数据进行一连串的操作的时候很实用,不需要自己写一些处理代码了,只需要定义好各个action,然后把他们串在一个工作流里面就可以自动执行了。但Oozie在实际生产过程中,也会有单点故障问题,所以我们也需要考虑部署多个Oozie Server从而实现Oozie的HA。Oozie的HA是Acive-Active的模式,通过负载均衡如HAProxy来实现。本篇文章中主要讲述如何启用Oozie Server的HA。
Fayson
2018/03/29
4.2K0
如何启用Nginx状态监控
  编译Nginx的时候添加参数:--with-http_stub_status_module
习惯说一说
2019/04/17
2.3K0
Nginx状态监控如何启用?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:zbxhhzj@qq.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。 转载本站文章请保留原文链接,如文章内说明不允许转载该文章,请不要转载该文章,谢谢合作。
会长君
2023/04/26
4480
图像的变换——dwt、idwt、wcodemat、dwt2、idwt2、wavedec2、waverec2
wavelet 小波 decomposition 分解 approximation 近似值 coefficient 系数 discrete 离散的 low-pass filter 低通滤波器 high-pass filter 高通滤波器 orthogonal 正交的
全栈程序员站长
2022/09/15
2.1K0
图像的变换——dwt、idwt、wcodemat、dwt2、idwt2、wavedec2、waverec2
MATLAB循环_matlab如何循环计算
1. while循环 在给定条件为真时,重复一个语句或一组语句。它在执行循环体之前测试状态。 语法 MATLAB中while循环的语法是 : while <expression> <statements> end 只要表达式(expression)为true,while循环将重复执行程序语句(statements)。 当结果为非空并且包含所有非零元素(逻辑或实数)时,表达式(expression)为true。 否则,表达式(expression)为false。 栗子: a = 10; % while loop execution while( a < 20 ) fprintf(‘value of a: %d\n’, a); a = a + 1; end 执行上面示例代码,得到以下结果 – value of a: 10 value of a: 11 value of a: 12 value of a: 13 value of a: 14 value of a: 15 value of a: 16 value of a: 17 value of a: 18 value of a: 19 2. for循环 多次执行一系列语句,并缩写管理循环变量的代码。 for循环是一种重复控制结构,可以让您有效地编写一个需要执行特定次数的循环。 语法 MATLAB中for循环的语法是 for index = values <program statements> … End 值(values)具有以下格式 – 值格式 描述 initval:endval index变量从initval到endval每次递增1,并重复程序语句 的执行,直到index大于endval。 initval:step:endval 通过每次迭代值步长(step)增加索引(index)的值,或者 当step为负时递减。 valArray 在每个迭代中从数组valArray的后续列创建列向量索 引。 例如,在第一次迭代中,index = valArray(:,1)。 循环最多执行n次,其中n是由numel(valArray,1,:)给出的valArray的列数。valArray可以是任何MATLAB数据类型,包括字符串,单元格数组或结构体。 前两种挺简单的,所以在此值对于第三种语法进行举例子说明: X=rand(5,1); for i=X i end X=rand(1,5); for i=X i end 运行结果是: i = 0.4898 0.4456 0.6463 0.7094 0.7547 i = 0.2760 i = 0.6797 i = 0.6551 i = 0.1626 i = 0.1190 注意:对于向量建立的是列向量索引!! X=magic(3); X for i=X i end 运行输出
全栈程序员站长
2022/11/10
2.5K0
嵌入式单片机看门狗详细分析超有用
STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。
用户6754675
2020/09/03
1.1K0
stm32之独立看门狗与窗口看门狗总结
STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。
用户6754675
2020/07/24
5210
stm32之独立看门狗与窗口看门狗总结
STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。
用户6754675
2020/03/04
7950
stm32之独立看门狗与窗口看门狗总结
STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。
用户6754675
2020/03/23
1.2K0
如何优化循环
有时候你会遇到循环,或者递归函数,它们会花费很长的执行时间,可能是你的产品的瓶颈。在你尝试使循环变得快一点之前,花几分钟考虑是否有可能把它整个移除掉,有没有一个不同的算法?你可以在计算时做一些其他的事情吗?如果你不能找到一个方法去绕开它,你可以优化这个循环了。这是很简单的,move stuff out。最后,这不仅需要智慧而且需要理解每一种语句和表达式的开销。这里是一些建议:
硬核编程
2019/09/17
9580
点击加载更多

相似问题

STM32 - DWT循环计数与我的预测不同。

10

使用STM32和HAL将DWT循环计数转换为时间

173

STM32F411 DWT CYCCNT计数器宽度

10

如何使用计数器启用的mysql查询循环处理?

10

DWT如何帮助图像增强?

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文