使用 STM32 的 DWT 单元监控内存

1、前言

关于 DWT(Data watchpoint and trace unit),相信有很多工程师都知道,其可用于 us级别的延时。
今天想和大家分享的是,通过 DWT 检测特定内存变量或函数,当其被修改或被调用时时,可以触发中断,通过这样的方式,实现一些特殊的调试手段。

2、DWT 介绍

U5 的 DWT comparator 有以下特性:

  1. 用作指令地址匹配或数据地址匹配的单一比较器。
  2. 在链接组中使用相关的地址范围匹配或数据地址范围匹配。

当 comparator 被匹配时,可以生成以下事件:
当 comparator 被匹配时,可以生成以下事件:

  1. 调试事件,导致 PE 或者进入调试状态;或者,如果执行主扩展则要进行DebugMonitor 异常。
  2. 如果实现,将与 ETM 匹配。
  3. 向另一个外部资源发送匹配。

DWT 由 function 和 comparator 寄存器组成,其定义是在 Armv8-M Architecture Reference Manual 文档中。

  • DWT_COMPn:存放比较值
  • DWT_FUNCTIONn:定义 comparator 的操作
    在这里插入图片描述
    在这里插入图片描述

3、实验

刚好我手中有块 STM32U575 的 Nucleo 板子,可以拿过来进行功能验证。
首先我们通过 STM32CubeMX 实现了基本的串口输出打印的工程,然后在此工程中,
按照以下步骤,添加 DWT 的配置 :

  1. 使能 tracing 功能;
  2. 使能调试中断功能;
  3. 配置 comparator 寄存器;
  4. 配置 function 寄存器

具体代码如图 1:
图1.DWT 的配置
在这里插入图片描述
这里我们配置了两个 comparator,COMP0 监控 test_var 变量的写操作, COMP1 监控 HAL_Delay 函数的调用,一旦发生 test_var 变量的写动作,或者 HAL_Delay 函数被调用,都将产生 DebugMonitor 中断事件,并且我们可以在 Debug_Mon_Handler 中断中区分这两个 comparator 事件。
图2.DebugMon_Handler 中断的参考实现
在这里插入图片描述
我们在主循环中,通过延时,并输出循环打印信息。
图3.Main 主循环的参考代码
在这里插入图片描述
下面是测试的结果,可以看出,test_var 变量被修改时,以及 HAL_Delay 被调用时,行为均被记录下来了。
图4.DWT 的测试结果
在这里插入图片描述

4、小结

这是一个非常有意思的实验,如果是在调试界面,那么 DebugMon_Handler 的中断将以断点的形式呈现。我们在实际应用中,可以通过这样的调试手段,来分析一些问题。

参考文献

文件编号 文件标题 版本号 发布日期
DDI0553B.u Arm®v8-M Architecture Reference Manual D28092022 2022/Sep/28

文档中所用到的工具及版本
STM32CubeMX V6.6.1
STM32CubeIDE V1.8.0

LAT 中的附件
U575_Nucleo_DWT_v0.2.7z


本文档参考ST官方的《【应用笔记】LAT1256+使用STM32的DWT单元监控内存》文档。
参考下载地址:https://download.csdn.net/download/u014319604/88969400

相关推荐

  1. CUDA锁页使用

    2024-03-19 20:14:05       61 阅读
  2. vmstat 监控虚拟,进程,CPU

    2024-03-19 20:14:05       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-19 20:14:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-19 20:14:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-19 20:14:05       82 阅读
  4. Python语言-面向对象

    2024-03-19 20:14:05       91 阅读

热门阅读

  1. pytorch升级打怪(四)

    2024-03-19 20:14:05       39 阅读
  2. Uni App中去掉访问路径中的#

    2024-03-19 20:14:05       43 阅读
  3. C++day6

    C++day6

    2024-03-19 20:14:05      41 阅读
  4. JDK发布信息、历史及未来规划

    2024-03-19 20:14:05       47 阅读
  5. azure databricks 常用的JDBC连接

    2024-03-19 20:14:05       47 阅读
  6. C++/C#/QT 绝对路径和相对路径设置

    2024-03-19 20:14:05       46 阅读
  7. 2024.3.19每日一题

    2024-03-19 20:14:05       42 阅读
  8. Linux重命名文件有几种方法

    2024-03-19 20:14:05       46 阅读
  9. python线程的使用和介绍

    2024-03-19 20:14:05       43 阅读
  10. Vue箭头函数还原为匿名函数示例

    2024-03-19 20:14:05       47 阅读
  11. 24.1 SpringCloud电商实战一刷

    2024-03-19 20:14:05       36 阅读