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();
#endif

    ticks = 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu20.04安装MatlabR2018a

一、安装包 安装包下载链接 提取码:kve2 网上相关教程很多,此处仅作为安装软件记录,方便后续软件重装,大家按需取用。 二、安装 1. 相关文件一览 下载并解压文件后,如下图所示: 2. 挂载镜像并安装 2…

06 | Swoole 源码分析之 Coroutine 协程模块

首发原文链接:Swoole 源码分析之 Coroutine 协程模块 大家好,我是码农先森。 引言 协程又称轻量级线程,但与线程不同的是;协程是用户级线程,不需要操作系统参与。由用户显式控制,可以在需要的时候挂起、或…

回顾快速排序

快速排序 快速排序的核心: 找到一个key 通常左边的数比key小,右边的数比key大。 找key通常有三种方法: 1. 挖坑法: 代码实现: // int _pivot(int* a, int left, int right) {int begin left, end right;int in…

动态图学习新突破!最新SOTA实现性能全面升级,效率与精度兼得

现实世界中的许多图数据是动态变化的,比如社交网络、交通流量等。而传统的图学习方法通常处理的是静态图,这就导致它缺乏处理动态变化的能力,在适应性方面存在局限性。 相较之下,动态图学习能够捕捉到图数据的动态变化&#xff0…

MuJoCo 入门教程(一)

系列文章目录 前言 一、简介 MuJoCo 是多关节接触动力学(Multi-Joint dynamics with Contact)的缩写。它是一个通用物理引擎,旨在促进机器人、生物力学、图形和动画、机器学习以及其他需要快速、准确地仿真铰接结构与环境交互的领域的研究和开…

ssm016基于 Java Web 的校园驿站管理系统+jsp

校园驿站管理系统的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对校园快递信息管理混乱,出…

阿里云优惠券如何领取使用?

阿里云是阿里巴巴旗下云计算及人工智能科技公司,提供云服务器、云数据库、云存储等云计算服务和云解决方案。为了吸引更多的用户,阿里云经常推出各种优惠活动,其中就包括阿里云优惠券。本文将为大家详细介绍阿里云优惠券领取方法及使用教程&a…

Nginx 基础

文章目录 Nginx概念安装下载上传安装包执行准备条件指定安装位置编译和安装启动服务创建启动脚本 linux文件目录nginx运行原理nginx配置域名概念和原理域名配置 Nginx 概念 Nginx 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是…

211基于matlab的多类结构动力学

基于matlab的多类结构动力学,凸轮机构、双凸轮、弦振动模拟、阻尼振动 、四连杆机构 、套杆运动 、三根弹簧作用的振子。程序已调通,可直接运行。 211 matlab 结构动力学 根弹簧作用的振子 - 小红书 (xiaohongshu.com)

javaweb学习(day10-服务器渲染技术)

一、基本介绍 1.前言 目前主流的技术是 前后端分离 (比如: Spring Boot Vue/React)JSP 技术使用在逐渐减少,但使用少和没有使用是两个意思,一些老项目和中小公司还在使用 JSP,工作期间,你很有可能遇到 JSPJSP 使用在减少(但是现…

Python深度学习034:cuda的环境如何配置

文章目录 1.安装nvidia cuda驱动CMD中看一下cuda版本:下载并安装cuda驱动2.创建虚拟环境并安装pytorch的torch_cuda3.测试附录1.安装nvidia cuda驱动 CMD中看一下cuda版本: 注意: 红框的cuda版本,是你的显卡能装的最高的cuda版本,所以可以选择低于它的版本。比如我的是11…

人工智能|深度学习——基于Xception算法模型实现一个图像分类识别系统

一、Xception简介 在计算机视觉领域,图像识别是一个非常重要的任务,其应用涵盖了人脸识别、物体检测、场景理解等众多领域。随着深度学习技术的发展,深度卷积神经网络(Convolutional Neural Networks,简称CNN&#xff…

阿赵UE学习笔记——24、动画播放控制

阿赵UE学习笔记目录   大家好,我是阿赵。   继续学习虚幻引擎的使用。关于UE的动画系统,之前学习了很多,包括动画合成或者动画蒙太奇等,实际上最后得到的都是一个动画片段。那么这些动画片段,是需要怎样播放控制呢…

乐观锁解决超卖问题

3.6 乐观锁解决超卖问题 修改代码方案一、 VoucherOrderServiceImpl 在扣减库存时,改为: boolean success seckillVoucherService.update().setSql("stock stock -1") //set stock stock -1.eq("voucher_id", voucherId).eq(&q…

STM32-02基于HAL库(CubeMX+MDK+Proteus)GPIO输出案例(LED流水灯)

文章目录 一、功能需求分析二、Proteus绘制电路原理图三、STMCubeMX 配置引脚及模式,生成代码四、MDK打开生成项目,编写HAL库的GPIO输出代码五、运行仿真程序,调试代码 一、功能需求分析 在完成开发环境搭建之后,开始使用STM32GP…

TCP和UDP区别和使用场景

TCP 和 UDP 是计算机⽹络中两种常⽤的传输层协议,⽤于实现可靠传输和⽆连接传输。 TCP TCP(Transmission Control Protocol)是⼀种⾯向连接的、可靠的传输协议。它通过三次握⼿四次挥⼿进⾏连接和断开链接,保证数据的可靠性、…

H5类似Word文档输入框小记

最近一个需求在客户端编辑输入超长文本带下划线。 最开始的input、textarea无法像span一样换行pass了。柳暗无天日之际,被投喂了一个contenteditable 。试了一下,嗯... 乌龟看绿豆--对眼了。 div 加上 contenteditable 后便继承了inputEvent 开启输入模…

【“状态机” 解析UART不定长度的协议帧】

【“状态机” 解析UART不定长度的协议帧】 1. 数据帧格式2. 状态机原理3. 代码实现 通信设计中考虑协议的灵活性,经常把协议设计成“不定长度”。如果一个系统接收上述“不定长度”的协议帧,将会有一个挑战–如何高效接收与解析。一个实例如下图&#xf…

流量卡VS随身WIFI?手把手教你怎么选!流量卡和随身WiFi哪个好?流量卡和随身WiFi的区别!流量卡和随身WiFi哪个更划算?流量卡和随身WiFi怎么选?

出门在外,网络、流量已经成为了我们必不可少需要考虑的问题!在选择如何获取大流量时,很多人都选择困难:是选择一张流量卡,还是一个随身WIFI? 今天,将从功能与形态、信号、适用场景、限制条件等多…

初阶数据结构—算法的时间复杂度和空间复杂度

第一章:数据结构前言(Lesson 1) 1. 什么是数据结构? 数据结构 (Data Structure) 是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的 数据元素的集合。 2. 什么是算法? 算法(Algorithm)…