STMCU小助手
发布时间:2023-10-30 15:53
|
01前言 客户在使用 STM32H7 的时候,想要使用 DWT 计数来测量代码执行时间,评估执行效率。客户发现在重新上电或 reset 后,无法启用 DWT 进行计数。( Y) D' |1 i0 Q' Y) q& o : X4 u2 Y7 c# }( R9 z 02调研8 W1 {% P2 P# s 在 ARMv7-M 架构中有个 DEMCR 寄存器,这个寄存器可以控制 DWT 的使能。在power-on reset 后这个寄存器所有位的值都为 0。而当 bit[24]为 0 时,DWT 和 ITM 模块都是 disabled 的。所以为了启用 DWT 模块,必须将 DEMCR 的 bit[24]置为 1。如图 1 所示:7 _3 Z+ q5 r' L' w- {( r 5 e" |7 ~& Y \0 _4 v/ R T
图1.DEMCR 寄存器 ! F9 y7 q4 Y7 i1 c! f6 A9 U! n. {3 \$ i8 Y% B4 P! z ]4 u) Z( q 03启用 DWT 进行计数1 X+ [1 A/ A1 U8 T: V5 g STM32H7 基于 Arm Cortex-M7 内核,而 Cortex-M7 是 ARMv7-M 架构,所以 H7 在配置 DWT 模块之前需要将 DEMCR 的 bit[24]置位。在基于 Cortex-M7 的芯片中,需要使用DWT-LAR 来解锁 DWT(其他核可能不需要,应具体分析),然后对 DWT_CTRL 进行相应使能即可。 9 a0 c+ |9 M. u, u" | 在 CMSIS 文件中已经提供了相关寄存器的宏定义(例如在“core_cm7.h”文件中包提供了 DWT 和 DEMCR 的宏定义),我们可以使用这些宏定义方便的进行配置,如图 2所示:
图2.core_cm7.h 文件 1 O+ K: F5 A! T' L& m- }, A/ Z2 }( I) D+ b7 m) x 示例(如下):使用 DWT 测量代码执行所用的时钟 cycle 数。$ T# J* ~& L9 r2 n: l; o* f% q0 x
( ?* |' e& Y, q5 a2 { ) [0 k. O6 r8 N1 \& ~- b' @3 k
04小结 在使用 ARMv7-M 架构的 STM32 时,对 DWT 配置之前应确保 DEMCR 中的 bit[24]已经被配置(使能 DWT),然后才能使用 DWT。 $ N- B ^& y9 I5 J" f+ |3 U: P5 p 转载自: STM32单片机9 w8 u, @% Y+ y! h 如有侵权请联系删除 5 N" _4 e$ |( U* P 5 Y' C" v1 j5 V3 E2 F |
【STM32MP257-DK】01开发板开箱、ST MPU 生态资源使用、环境搭建以及镜像更新
基于STM32在线升级OTA经验分享
【STM32C0测评】Nucleo-C092开发板驱动DS1302实验
Keil下的STM32N6之RAM运行工程配置说明
兔哥的初代M33【002】-H503Nucleo 内部flash操作
兔哥的杂谈【002】——如何性价比更高地去编译STM32
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
FreeRTOS学习笔记2
【NUCLEO-H533RE评测】+05 调试PWM
基于STM32 hardfault问题分析经验分享
微信公众号
手机版
学习学习
学习啦~~~