STM32F4 DWT功能 实现程序运行时间精确测试

2023-11-09

时间戳相关寄存器定义
/*
在Cortex-M里面有一个外设叫DWT(Data Watchpoint and Trace),
该外设有一个32位的寄存器叫CYCCNT,它是一个向上的计数器,
记录的是内核时钟运行的个数,最长能记录的时间为:
10.74s=2的32次方/400000000
(假设内核频率为400M,内核跳一次的时间大概为1/400M=2.5ns)
当CYCCNT溢出之后,会清0重新开始向上计数。
使能CYCCNT计数的操作步骤:
1、先使能DWT外设,这个由另外内核调试寄存器DEMCR的位24控制,写1使能
2、使能CYCCNT寄存器之前,先清0
3、使能CYCCNT寄存器,这个由DWT_CTRL(代码上宏定义为DWT_CR)的位0控制,写1使能
*/

#define  DWT_CR      *(__IO uint32_t *)0xE0001000
#define  DWT_CYCCNT  *(__IO uint32_t *)0xE0001004
#define  DEM_CR      *(__IO uint32_t *)0xE000EDFC


#define  DEM_CR_TRCENA                   (1 << 24)
#define  DWT_CR_CYCCNTENA                (1 <<  0)

//初始化时间戳
void HAL_InitTick()
{
    /* 使能DWT外设 */
    DEM_CR |= (uint32_t)DEM_CR_TRCENA;                

    /* DWT CYCCNT寄存器计数清0 */
    DWT_CYCCNT = (uint32_t)0u;

    /* 使能Cortex-M DWT CYCCNT寄存器 */
    DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;
}

/**
  * @brief  读取当前时间戳
  * @param  无
  * @retval 当前时间戳,即DWT_CYCCNT寄存器的值
  */
uint32_t CPU_TS_TmrRd(void)
{        
  return ((uint32_t)DWT_CYCCNT);
}

测试:

STM32F407 168M

HAL_InitTick();
delay_ms(1);
uint32_t time_= CPU_TS_TmrRd();//168260

HAL_InitTick();
delay_ms(2);
time_= CPU_TS_TmrRd();//336258

HAL_InitTick();
delay_us(100);
time_= CPU_TS_TmrRd();//16964

HAL_InitTick();
delay_us(200);
time_= CPU_TS_TmrRd();//33816

HAL_InitTick();
delay_us(300);
time_= CPU_TS_TmrRd();//50576

//延时100us 计数值大概16800

参考链接:
https://segmentfault.com/a/1190000020712516

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F4 DWT功能 实现程序运行时间精确测试 的相关文章

  • mysql order by和group,where的执行顺序

    Mysql ORDER BY详解 0 索引 1 概述 2 索引扫描排序和文件排序简介 3 索引扫描排序执行过程分析 4 文件排序 5 补充说明 6 参考资料 1 概述 MySQL有两种方式可以实现ORDER BY 1 通过索引扫描生成有序的
  • 解决调试时候出现的“Encountered an improper argument”错误

    今天分享一个我们在调试时候出现的一个错误 同时这个错误让我的工程也崩了好几十次 错误 首先 我们看一下这个错误的提示框图 其错误提示为 Encountered an improper argument 翻译过来就是遇到不恰当的争论 错误原因

随机推荐

  • 多线程(七)锁策略 (乐观锁,悲观锁,读写锁,自旋锁,可重入锁)

    目录 一 乐观锁和悲观锁 1 乐观锁的理解 2 悲观锁的理解 二 读写锁 1 什么是读写锁 2 读写锁的三种状态 3 读写锁的实现 三 公平锁和非公平锁 四 可重入锁 1 可重入锁 2 可重入锁 VS 自旋锁 五 cas实现和synchro
  • 【java】id非自增的表怎么将数据批量插入数据库

    目录 示例 实体 service层 实现层 mapper mapper xml 技术框架 springboot dubbo mybatis plus id非自增的表怎么将数据批量插入数据库 mapper mapper xml都要改 示例 添
  • conda 导出环境/导入环境/导出base环境以及踩坑

    conda 导出环境 导入环境 导出base环境 参考链接 https blog csdn net shunaoxi2313 article details 92003710 conda的虚拟环境真的非常实用 尤其是对于大的深度学习项目 给
  • Longest Consecutive Sequence

    Given an unsorted array of integers find the length of the longest consecutive elements sequence For example Given 100 4
  • Java实现 LeetCode 704 二分查找(三种解法详解)

    二分查找常见三种解法详解 1 二分法 基础版 左闭右闭区间 2 二分法 改进版 左闭右开区间 3 二分法 平衡版 左闭右开区间 704 二分查找 给定一个 n 个元素有序的 升序 整型数组 nums 和一个目标值 target 写一个函数搜
  • Linux设置进程名称(标题) ( 7) -【Linux通信架构系列 】

    系列文章目录 C 技能系列 Linux通信架构系列 C 高性能优化编程系列 深入理解软件架构设计系列 高级C 并发线程编程 期待你的关注哦 现在的一切都是为将来的梦想编织翅膀 让梦想在现实中展翅高飞 Now everything is fo
  • MyBatis Generator 生成的example 使用 and or 简单混合查询

    MyBatis Generator 生成的example 使用 and or 简单混合查询 参考博客 https www cnblogs com kangping p 6001519 html 简单介绍 Example类用于构造复杂的筛选条
  • glTF格式初步了解

    glTF格式初步了解 最近看到Qt 3D的进展 偶然了解到了一种新的格式 glTF格式 这种格式据说比现有的3D格式更加符合OpenGL应用的需要 这引起了我的好奇 于是我在Qt 3D的外部链接中找到了有关glTF的相关链接 上海萌梦信息科
  • Mysql int(11)和Oracles nubmer(11) 的区别

    先说Mysql int 11 到底代表什么意思 这里的int 11 不是表示限制int的长度为11 而是字符的显示宽度 在字段类型为int时 无论你显示宽度设置为多少 int类型能存储的最大值和最小值永远都是固定的 那么这个显示宽度到底有什
  • Java中final关键字的作用

    final关键字可以用来修饰引用 方法和类 1 用来修饰一个引用 如果引用为基本数据类型 则该引用为常量 该值无法修改 如果引用为引用数据类型 比如对象 数组 则该对象 数组本身可以修改 但指向该对象或数组的地址的引用不能修改 如果引用为类
  • 开源DataX集成可视化项目Datax-Web的安装

    关于datax web项目 在做DataX项目测试的时候又收到github的推荐邮件 推荐了一个datax web的开源项目 这不是瞌睡遇到枕头 再研究研究这个项目是不是符合数据同步的要求 datax web https github co
  • JavaWeb 【基础】 servelet 异步操作

    在实际工作中我们会遇到一些耗时操作 这个时候如果不能及时response 就会返回失败 想要执行异步操作 延时返回数据 可以使用以下方法 使用asyncSupported true注解 WebServlet name apitest asy
  • Mysql基础(十二):隔离/锁/MVCC/ReadView

    目录 1 业务系统并发对数据库执行事务 2 脏写 脏读 3 不可重复读 4 幻读 5 事务隔离机制 6 MySQL如何支持4种隔离级别 Spring事务注解如何设置 7 undo log版本链是个什么东西 8 ReadView机制 多个事务
  • Java课题笔记~ Axios

    Axios 对原生的AJAX进行封装 简化书写 Axios官网是 https www axios http cn 2 1 基本使用 axios 使用是比较简单的 分为以下两步 引入 axios 的 js 文件 使用axios 发送请求 并获
  • Steam 灵感的游戏卡悬停效果

    先看效果 再看代码 查看更多
  • 【CSAPP】Binarybomb 实验(phase_1-6+secret_phase)

    Binarybomb 实验 phase 1 6 secret phase 实验内容 一个 binary bombs 二进制炸弹 下文将简称为炸弹 是一个Linux可执行C程序 包含了7个阶段 phase1 phase6和一个隐藏阶段 炸弹运
  • ROS学习笔记13--urdf文件报错:GazeboRosControlPlugin missing <legacyModeNS> while using DefaultRobotHWSim.....

    环境 ubuntn16 04 ROS kinetic vs code urdf文件运行时候报错如下 ERROR 1527494740 144219702 307 635000000 GazeboRosControlPlugin missin
  • jobdu 1 排序

    题目描述 对输入的n个数进行排序并输出 输入 输入的第一行包括一个整数n 1 lt n lt 100 接下来的一行包括n个整数 输出 可能有多组测试数据 对于每组数据 将排序后的n个整数输出 每个数后面都有一个空格 每组测试数据的结果占一行
  • MySQL存储过程与存储函数的区别

    语法定义上的区别就不说了 说一下其他的 如果有不正确的地方 还请大家指正 1 总述 存储函数和存储过程统称为存储例程 stored routine 两者的定义语法很相似 但却是不同的内容 存储函数限制比较多 比如不能用临时表 只能用表变量
  • STM32F4 DWT功能 实现程序运行时间精确测试

    时间戳相关寄存器定义 在Cortex M里面有一个外设叫DWT Data Watchpoint and Trace 该外设有一个32位的寄存器叫CYCCNT 它是一个向上的计数器 记录的是内核时钟运行的个数 最长能记录的时间为 10 74s