STM32H7启用DWT计数:解决ARMv7-M重置后无法计数问题
需积分: 5 59 浏览量
更新于2024-08-03
收藏 332KB PDF 举报
"这篇应用笔记(LAT1209)主要介绍了在Armv7-M架构的STM32微控制器,特别是STM32H7型号,如何启用数据观察和跟踪单元(DWT)进行计数,以便测量代码执行时间并评估效率。在启动DWT功能时,用户遇到的问题是设备复位或电源重置后,DWT无法正常工作。"
在Armv7-M架构的微控制器中,DWT是一个重要的调试工具,它可以提供精确的周期计数,这对于性能分析非常有用。问题的关键在于调试异常控制寄存器(DEMCR),在上电复位后,该寄存器的所有位默认为0。其中,DEMCR的第24位(即CoreDebug_DEMCR_TRCENA_Msk)需被设置为1,以启用包括DWT在内的调试模块。如果这一位保持为0,则DWT和仪器化触发模块(ITM)都会被禁用。
解决这个问题的步骤如下:
1. 首先,需要通过设置`CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk`来开启调试跟踪功能。
2. 然后,对于Cortex-M7核心的STM32芯片,需要解锁DWT访问寄存器(DWT-LAR)。这可以通过写入特定的密钥完成,即`DWT->LAR = 0xC5ACCE55`。
3. 清零周期计数器(`DWT->CYCCNT = 0`),以确保开始测量时计数值为0。
4. 最后,启用周期计数器(`DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk`),允许DWT开始计数CPU周期。
在CMSIS库提供的头文件,比如"core_cm7.h"中,已经定义了与这些寄存器操作相关的宏,使得编程更为简便。用户可以在自己的代码中包含这个头文件,并使用这些宏来实现DWT的启用和计数功能。
以下是一个示例代码片段,展示了如何使用DWT来测量代码执行所消耗的时钟周期:
```c
#include "core_cm7.h"
// 启用DWT和ITM
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
// 解锁DWT
DWT->LAR = 0xC5ACCE55;
// 清零CYCCNT计数器
DWT->CYCCNT = 0;
// 启用CYCCNT计数器
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;
// 保存初始计数值
uint32_t cycles = DWT->CYCCNT;
// 你的代码...
// ...
// 计算执行周期
cycles = DWT->CYCCNT - cycles;
```
通过这样的方法,开发者可以准确地获取代码执行的时钟周期数,从而评估程序的运行效率。此方法不仅适用于STM32H7,也可以适用于其他基于Cortex-M7内核的微控制器,但需要注意不同内核可能需要不同的解锁步骤,应根据具体的硬件手册进行调整。
173 浏览量
2024-03-15 上传
2024-04-19 上传
2024-03-15 上传
2024-03-15 上传
2024-03-15 上传
2024-03-15 上传
2024-03-15 上传
冻结的鱼
- 粉丝: 2378
- 资源: 192
最新资源
- 计算机操作系统课后答案(西安电子科技大学版)
- 通用变频器应用技术.pdf
- 《开源》旗舰电子杂志2008年第4期
- C# 语言的微软官方说明书(权威)
- usb2.0协议 中文版
- 《开源》旗舰电子杂志2008年第3期
- 思科2950CR官方配置命令手册.pdf
- ABB ACS510_01 用户手册中文版
- 打造linux完美桌面
- STC单片机内部资源经典应用大全.PDF
- 进行空间,你的网站及域名的备案详细步骤
- Packt.Publishing.Learn.OpenOffice.org.Spreadsheet.Macro.Programming.Dec.2006.pdf
- 虚拟硬盘系统的实现及应用
- JasperReport3
- C/C++面试大全--算法和知识点详析
- DIV+CSS布局大全