STM32H7启用DWT计数:解决ARMv7-M重置后无法计数问题

需积分: 5 3 下载量 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内核的微控制器,但需要注意不同内核可能需要不同的解锁步骤,应根据具体的硬件手册进行调整。