STM32 DWT数据观察触发器作为延时函数的使用

STM32 DWT数据观察触发器作为延时函数的使用


📑DWT(Data Watchpoint and Trace数据观察触发器)描述

  • 📝DWT是属于处理器内核单元中的调试组件之一,由四个比较器组成。它们可配置为:硬件监视点或对ETM或PC采样器或数据地址采样器的触发器。DWT还提供了一些方法来提供一些分析信息。为此,可以访问一些计数器来提供:时钟循环折叠指令加载存储单元(LSU)操作休眠周期CPI(每个指令的时钟)中断开销。
  • 🔖DWT似乎除了M0内核的没有其他的都有。具体型号有没有,请参考对应的内核参考手册。在数据手册上没有此相关信息。
  • 🔖以下内容引自野火开发文档描述:https://doc.embedfire.com/mcu/stm32/f103badao/std/zh/latest/book/DWT.html
  • 🌿在Cortex-M中,DWT是用于系统调试及跟踪,它有一个32位的寄存器叫CYCCNT, 它是一个向上的计数器,记录的是内核时钟运行的个数,内核时钟跳动一次,该计数器就加1,精度非常高,决定内核的频率是多少, 对于F103系列,内核时钟是72M,那精度就是1/72M = 14ns,而程序的运行时间都是微秒级别的,所以14ns的精度是远远够的。 最长能记录的时间为:60s=2的32次方/72000000(假设内核频率为72M,内核跳一次的时间大概为1/72M=14ns), 而如果是H7这种400M主频的芯片,那它的计时精度高达2.5ns(1/400000000 = 2.5),而如果是 i.MX RT1052这种高速的处理器, 最长能记录的时间为: 8.13s=2的32次方/528000000 (假设内核频率为528M,内核跳一次的时间大概为1/528M=1.9ns) 。当CYCCNT溢出之后, 会清0重新开始向上计数。系统处理框图见图:

在这里插入图片描述
要实现延时的功能,总共涉及到三个寄存器:DEMCR、DWT_CTRL、DWT_CYCCNT,分别用于开启DWT功能、开启CYCCNT及获得系统时钟计数值。

📘DWT相关寄存器

  • 🌿DEMCR
    想要使能DWT外设,需要由另外的内核调试寄存器DEMCR的位24控制,写1使能。DEMCR的地址是:0xE000EDFC
    在这里插入图片描述
  • 🌿DWT_CYCCNT
    使能DWT_CYCCNT寄存器之前,先清0。其基地址是0xE0001004,复位默认值是0,可读写类型。所以往0xE0001004这个地址写就将DWT_CYCCNT清0了。
  • 🌿CYCCNTENA
    它是DWT控制寄存器的第一位,写1使能,则启用CYCCNT计数器,否则CYCCNT计数器将不会工作。
    在这里插入图片描述
  • 🧨综上所述,想要使用DWT的CYCCNT需要以下3个步骤:
  1. 先使能DWT外设,这个由另外内核调试寄存器DEMCR的位24控制,写1使能。
  2. 使能CYCCNT寄存器之前,先清0。
  3. 使能CYCCNT寄存器,这个由DWT的CYCCNTENA 控制,也就是DWT控制寄存器的位0控制,写1使能。

📗DWT当定时器使用

  • 🌿初始化寄存器
/**
* @brief  初始化时间戳
* @param  无
* @retval 无
* @note   使用延时函数前,必须调用本函数
*/
void CPU_TS_TmrInit(void)
{/* 使能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  采用CPU的内部计数实现精确延时,32位计数器
* @param  us : 延迟长度,单位1 us
* @retval 无
* @note   使用本函数前必须先调用CPU_TS_TmrInit函数使能计数器,或使能宏CPU_TS_INIT_IN_DELAY_FUNCTION最大延时值为60秒,即60s=2的32次方/72000000
*/
void CPU_TS_Tmr_Delay_US(__IO uint32_t us)
{uint32_t ticks;uint32_t told,tnow,tcnt=0;/* 在函数内部初始化时间戳寄存器, */
#if (CPU_TS_INIT_IN_DELAY_FUNCTION)/* 初始化时间戳并清零 */CPU_TS_TmrInit();
#endifticks = us * (GET_CPU_ClkFreq() / 1000000);  /* 需要的节拍数 */tcnt = 0;told = (uint32_t)CPU_TS_TmrRd();         /* 刚进入时的计数器值 */while (1) {tnow = (uint32_t)CPU_TS_TmrRd();if (tnow != told) {/* 32位计数器是递增计数器 */if (tnow > told) {tcnt += tnow - told;}/* 重新装载 */else {tcnt += UINT32_MAX - told + tnow;}told = tnow;/*时间超过/等于要延迟的时间,则退出 */if (tcnt >= ticks)break;}}
}

📚测试工程

  • 🔖基于hal stm32f103
链接:https://pan.baidu.com/s/169wTGNecTqwBXqhuYzSVew?pwd=nbx4 
提取码:nbx4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/787952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dcoker 下redis设置密码

修改Docker里面Redis密码 Redis是一个开源的内存数据结构存储系统,常用于缓存、消息队列和数据持久化等场景。在使用Docker部署Redis时,默认情况下是没有设置密码的,这可能会导致安全隐患。因此,为了保证数据的安全性&…

高性能服务系列【十二】终篇:等待的代价

上一篇《主题匹配》入选CSDN的区块链领域内容榜,最早我看到的时候是排行榜34名,写这篇文章的时候已经落到了46名。虽然我没有觉得和区域链有什么关系,估计入选的原因是那篇文章涉及到几个算法吧。 在整个高性能服务系列中,我很少…

蓝桥杯真题Day44 倒计时10天 练了六道真题 !

[蓝桥杯 2020 省 B2] 平面切分 题目描述 平面上有 N 条直线, 其中第 i 条直线是 yAi​⋅xBi​ 。请计算这些直线将平面分成了几个部分。 输入格式 第一行包含一个整数 N。 以下 N 行, 每行包含两个整数 Ai​,Bi​。 输出格式 一个整数代表答案。 代码表示 #include<…

基于SpringBoot的图书馆管理系统设计与实现

介绍 基于&#xff1a;java8 SpringBoot thymeleaf MySQL8.0.17 mybatis-plus maven Xadmin 实现图书馆管理系统 系统要实现如下的基本管理功能&#xff1a; &#xff08;1&#xff09;用户分为两类&#xff1a;管理员&#xff0c;一般用户。 &#xff08;2&#xff09…

java利用多线程,线程池加快任务处理时间,等待所有线程结束,数据统一处理

遇到了业务上处理很慢的情况&#xff0c;都可以用多线程解决&#xff0c;这是原先未优化的代码 /*** 导出excel*/GetMapping("/export/excel")ApiOperationSupport(order 11)ApiOperation(value "导出excel", notes "传入gaugeRecord")public…

Day57:WEB攻防-SSRF服务端请求Gopher伪协议无回显利用黑白盒挖掘业务功能点

目录 SSRF-原理&挖掘&利用&修复 SSRF无回显解决办法 SSRF漏洞挖掘 SSRF协议利用 http:// &#xff08;常用&#xff09; file:/// &#xff08;常用&#xff09; dict:// &#xff08;常用&#xff09; sftp:// ldap:// tftp:// gopher:// &#xff08;…

群晖NAS使用Docker部署大语言模型Llama 2结合内网穿透实现公网访问本地GPT聊天服务

文章目录 1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛&#xff0c;包括聊天机…

Nginx漏洞之未授权访问和源码泄漏漏洞处理

一、漏洞描述 某次安全扫描&#xff0c;发现某平台存在资源&#xff1a;未授权访问和源码泄漏&#xff1b;攻击者可能获取到网站的配置文件、敏感数据存储位置和访问凭证等信息。这意味着攻击者可以获得对网站的完全或部分控制权&#xff0c;进而进行恶意篡改、删除或添加恶意…

6.8物联网RK3399项目开发实录-驱动开发之RTC实时时钟的使用(wulianjishu666)

90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接&#xff1a;https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwdc53f RTC 使用 简介 AIO-3399J 开发板上有 一个集成于 RK808 上的RTC(Real Time Clock)&#xff0c;主要功能有时钟&#xff0c…

Matlab安装完成后打开后闪退

官方解决办法&#xff0c;英文看着费劲 其中Problem #2和Problem #4大概率能解决问题我是使用Problem #4解决的&#xff0c;引发原因是Problem #3加密软件导致&#xff0c;只能先命令行再desktop才能打开软件 知乎绵绵给出的方法&#xff0c;和官方解决相同但是中文

【PowerDesigner】PGSQL反向工程过程已中断

问题 反向工程过程已中断,原因是某些字符无法通过ANSI–&#xff1e;UTF-16转换进行映射。pg导入sql时报错&#xff0c;一查询是power designer 反向工程过程已中断&#xff0c;某些字符无法通过ANSI–>UTF-16转换进行映射&#xff08;会导致数据丢失&#xff09; 处理 注…

代码随想录第28天| 131.分割回文串 93.复原IP地址 78.子集

131.分割回文串 131. 分割回文串 - 力扣&#xff08;LeetCode&#xff09; 代码随想录 (programmercarl.com) 带你学透回溯算法-分割回文串&#xff08;对应力扣题目&#xff1a;131.分割回文串&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 给你一个字符串 s&…

armbian等linux系统修改fstab实现开机自动挂载磁盘(详解)

当 Linux 操作系统启动时&#xff0c;它会尝试挂载您的硬盘和其他存储设备上的分区。为了实现这一目标&#xff0c;系统使用 /etc/fstab 文件来确定应该如何挂载文件系统。/etc/fstab 文件是一个文本文件&#xff0c;包含了在系统引导期间将要挂载的所有文件系统的定义。它通过…

关于投标的细节

第一点&#xff1a; 进来的时候记住到达时间&#xff0c;这个时间只能是个参考。签到表时间填写要符合逻辑性&#xff0c;就是来的比你早的到达时间一定比你的晚&#xff0c;来的比你晚的到达时间一定比你迟。优先考虑的是先后而不是真实到达时间。除非你是第一个填写的 第二点…

如何创建自己的 Spring Boot Starter 并为其编写单元测试

当我们想要封装一些自定义功能给别人使用的时候&#xff0c;创建Spring Boot Starter的形式是最好的实现方式。如果您还不会构建自己的Spring Boot Starter的话&#xff0c;本文将带你一起创建一个自己的Spring Boot Starter。 快速入门 创建一个新的 Maven 项目。第三方封装的…

连接Redis不支持集群错误,ERR This instance has cluster support disabled,解决方案

1. 问题背景 调整redis的配置后&#xff0c;启动程序时&#xff0c; 会报如下错误&#xff1a; [redis://172.16.0.8xxx]: ERR This instance has cluster support disabledSuppressed: io.lettuce.core.RedisCommandExecutionException: ERR This instance has cluster supp…

TypeScript-数组、函数类型

1.数组类型 1.1类型 方括号 let arry:number[][5,2,0,1,3,1,4] 1.2 数组泛型 let arry2:Array<number>[5,2,0,1,3,1,4] 1.3接口类型 interface makeArryRule{[index:number]:number }let arry3:makeArryRule[5,2,0,1,3,1,4] 1.4伪数组 说明&#xff1a; argument…

MyBatis数据库逆向生成工具

使用Mybatis数据库逆向生成工具 1.在pom中引入通用mapper工具 <!-- 通用mapper逆向工具 --><dependency><groupId>tk.mybatis</groupId><artifactId>mapper-spring-boot-starter</artifactId><version>1.2.4</version></d…

苹果安卓双端短视频直播系统源码,带后台-支持二开和采集

搭建教程 1.PHP5.6-7.2 mysql 5.6 redis5.0 nginx1.15 2.宝塔就完全满足了 我刚开了台服务器&#xff0c;建议用阿里云的 我这个是腾讯云 先让服务器 自己装着 时间比较长 3.搭建前需要准备的东西 腾讯云直播、七牛存储、百度语音、腾讯地图等好多东西 七牛存储…

面试算法4/400-乘积小于 K 的子数组

题目 给定一个正整数数组 nums和整数 k &#xff0c;请找出该数组内乘积小于 k 的连续的子数组的个数。 示例 1: 输入: nums [10,5,2,6], k 100 输出: 8 解释: 8 个乘积小于 100 的子数组分别为: [10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]。 需要注意的是 [10,…