[STM32F1]STM32上的DWT与延时实现

2023-11-12

  对于做单片机程序开发来说,定时管理的需求非常普遍,不管是:系统滴答定时器systick计数器延时或者是通过外设定时器timer的向上向下等计数来延时,甚至在精度要求不高的地方还可以通过变量自加判断来延时,这都是一种延时管理实现的方法。但是对于cortex-M3内核来说,还有一个可以延时的方法往往被大家所忽视,就是M3内核跟踪系统:数据观察点与跟踪单元(DWT)。
  而DWT其实原本是为了做为系统调试及跟踪用的,属于DBG部分的功能,它包含了 4 个比较器,可以配置成在发生比较匹配时,执行相关动作,如程序计数器(PC)采样器事件触发、ETM 触发,可以触发 ETM 发出一个数据包,并汇入指令跟踪数据流中等,其中每一个比较器都有 3 个寄存器,COMP 寄存器、MASK 寄存器和FUNCTION 控制寄存器;DWT也可以作为计数器,进行时钟周期(CYCCNT)计数、被折叠(Folded)的指令或者是每指令周期数(CPI)等,另外DWT还可以以固定的周期采样 PC 的值等功能,在Cortex‐M3芯片中,DWT的基地址为:0xE000_1000。

 

  既然DWT可以进行计数,那么他就可以进行延时,原因是因为它有一个32位的一个向上计数的计数器,当它溢出时会自动清零并重新开始向上计数,它的频率是内核的主频,如72Mhz,精度是1/72M= 14ns,那么时钟节拍一次,计数就加一次,这样的精度对于大部分应用延时都是非常高的了。原理弄清楚了,那么如果要实现延时功能,总共用到三个寄存器:DEMCR 、DWT_CTRL、DWT_CYCCNT,他们的地址分别为:0xE000EDFC、0xE0001000、0xE0001004,分别用于开启DWT功能、开启CYCCNT及获得系统时钟计数值。
配置方式为:
1、对DEMCR的位24控制,写1使能DWT外设。
2、对于CYCCNT寄存器清0。
3、对DWT控制寄存器的位0控制,写1使能CYCCNT寄存器。
4、通过编写函数获取DWT_CYCCNT的值,并通过判断是否到达新的DWT_CYCCNT值来实现延时。
配置函数:
#define  DEM_CR      *(volatile u32 *)0xE000EDFC

#define  DWT_CR      *(volatile u32 *)0xE0001000

#define  DWT_CYCCNT  *(volatile u32 *)0xE0001004



#define  DEM_CR_TRCENA                   (1 << 24)

#define  DWT_CR_CYCCNTENA                (1 <<  0)



void DelayInit()

{

    DEM_CR  |=  DEM_CR_TRCENA; 

    DWT_CR  |=  DWT_CR_CYCCNTENA;

    DWT_CYCCNT = 0;

}
延时函数:
void Delayus(u32 usec)

{

     u32 start,end,ts;

        

     start = DWT_CYCCNT;

     ts =  usec * (72);      

     end = start + ts;      

     while(DWT_CYCCNT < end){;} 

}

  很多人说,由于DWT是属于M3内核自带的功能,便于在不同M3处理器之间的移植,实际上想相比较普通的外设定时器来说,不管从定时方式还是最长时间上来说,DWT并没有优势,毕竟DWT原本设计不是为了做定时器用的,而且现在的各个厂家的定时器原理基本一样,也不存在着说移植后在定时器的处理上的难度有多大,所以具体要不要用DWT来实现延时功能见仁见智。
---------------------
作者:forgot
链接:https://bbs.21ic.com/icview-3288126-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

 

 

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

[STM32F1]STM32上的DWT与延时实现 的相关文章

  • C语言的关键字,字符和ASCII码

    关键字的介绍 C语言的关键字有 1 数据类型关键字 2 控制语句关键字 3 存储类型关键字 4 其他关键字 数据类型关键字有12个 char 声明字符型变量或函数 double 声明双精度变量或函数 enum 声明枚举类型 float 声明
  • 10-11

    函数 函数体内部的语句在执行时 一旦执行到return时 函数就执行完毕 并将结果返回 因此 函数内部通过条件判断和循环可以实现非常复杂的逻辑 如果没有return语句 函数执行完毕后也会返回结果 只是结果为undefined 定义方法一

随机推荐

  • ROS笔记 URDF及rviz可视化及遇到的问题

    在学习http gazebosim org tutorials tut ros urdf中遇到一些问题 因为版本不同出现错误 GazeboRosControlPlugin missing while using DefaultRobotHW
  • FIO 磁盘性能测试

    FIO 磁盘性能测试 fio 是一个开源压力测试工具 主要用来测试硬盘 io 性能 这个工具的可定制性非常强 可以根据测试者的想法进行各种混合 io 测试 它支持 13 种不同类型 io 引擎 libaio sync mmap posixa
  • 系统设计感悟

    author skate time 2012 07 26 系统设计感悟 总结以往教训 以后再设计系统时注意点 首先考虑 系统不同的服务对象的定位 比如优先级等 系统的考核指标定位 性能 稳定 扩展伸缩 再次设计系统时必须考虑 1 控制表的数
  • C++语言入门3(定义整数与整数输入)

    关于整数 c 是一个对定义要求很严格的语言 对于数的定义也有很多种 比如整数 浮点数 整数不言而喻 不含有小数点 关于整数的定义也有很多种 最常用的无疑是int 我们定义整数一般选择的是int int可以表示的整数范围可以达到2 32 1
  • ESP32调试笔记

    1 现象 上电后一直复位 rst 0x3 SW RESET boot 0x13 SPI FAST FLASH BOOT 原因 Flash烧录时 ota data和app0位置错了 解决 把ota data和app0位置烧录正确即可 位置从分
  • 【vue3总结知识点——精简一】

    vue3总结知识点 认识vue3 Composition API setup 执行时机 setup 包含的生命周期 ref获取页面数据 reactive reactive与ref的异同 比较Vue2与Vue3的响应式 vue2的响应式 Vu
  • 组合数打表模板

    组合数打表模板 组合数打表模板 适用于N lt 3000c i j 表示从i个中选j个的选法 1 2 3 4 5 6 7 8 9 10 11 12 long long C N N const int mod 1e9 5 void get C
  • MFC创建内存映射文件示例

    该实例是在程序的exe路径下 实现读取 写入内存映射文件功能 头文件 ifdef GERNERAL PRODUCTDATA EXP define GERNERAL PRODUCTDATA API declspec dllexport els
  • window中如何用命令行新建文件夹和文件

    1 新建文件夹 D gt mkdir test 通过mkdir 文件夹名 回车即可用命令行工具新建文件夹 2 新建文件 cd test文件目录下 D gt test type nul 文件名 回车即可创建新的文件
  • Element UI的table表格中实现复选框勾选

    需求 在table中实现勾选多行复选框的内容 点击提交按钮 选择的复选框与表格内容对应
  • Matlab 常用快捷键

    MATLAB Numpy函数对照表 http mathesaurus sourceforge net matlab python xref pdf 常见快捷键 Ctrl R 注释代码 Ctrl T 取消注释代码 Ctrl 或 先将光标移动到
  • stm32——PWM实现呼吸灯效果

    使用pwm点亮led 实现呼吸灯效果 led为什么可以越来越亮 越来越暗 由不同的占空比决定 占空比由CCRx决定 1 芯片手册查看引脚pwm通道 2 cubeMX sys设置串口 RCC设置时钟来源 配置时钟 配置io口的pwm输出 三
  • 华为机顶盒系统时间同步服务器,华为悦盒主时间同步服务器地址

    华为悦盒主时间同步服务器地址 内容精选 换一换 华为云存储容灾服务 简称SDRS 提供了虚拟机级别的容灾保护 当主站点故障的时候 虚拟机可以在备站点迅速恢复 以确保业务的联系性 来自 产品 边缘节点既可以是物理机 也可以是虚拟机 边缘节点需
  • Linux下C/C++语言gdb调试方法

    1 gdb参数列表 启动程序准备调试 gdb your proceduce 或者先输入gdb 然后输入 file your proceduce 然后使用run或者r命令开始程序的执行 也可以使用 run parameter将参数传递给该程序
  • 核酸检测安排

    题目描述 在系统 网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查 每名采样员的效率不同 采样效率为N人 小时 由于外界变化 采样员的效率会以M人 小时为粒度发生变化 M为采样效率浮动粒度 M N 10 输入保证N 10 的结
  • 软件测试工程师(4k~6k)的工作怎么找?转行IT人特别是应届生得好好看看这篇文章了...

    前言 作为一个入行软件测试10多年的老兵来说 最初我的工作也不是做软件测试的 只是一个偶然后机会可以转到这个行业 所以就豪不犹豫的转到这个行业 虽然前期会感觉有点压力 毕竟没有真正的做过 但是只要在工作中保持积极乐观的态度 多问 多学 多实
  • C语言数据结构篇——用栈实现四则运算

    作者名 Demo不是emo 主页面链接 主页传送门创作初心 舞台再大 你不上台 永远是观众 没人会关心你努不努力 摔的痛不痛 他们只会看你最后站在什么位置 然后羡慕或鄙夷座右铭 不要让时代的悲哀成为你的悲哀专研方向 网络安全 数据结构 每日
  • 【RocketMQ】NameServer总结

    NameServer是一个注册中心 提供服务注册和服务发现的功能 NameServer可以集群部署 集群中每个节点都是对等的关系 没有像ZooKeeper那样在集群中选举出一个Master节点 节点之间互不通信 服务注册 Broker启动的
  • “左三圈右三圈”,莫言开收割机 收割大批网友喜爱

    昨晚十点 莫言公众号如期更新 半夜就有网友在朋友圈里奔走相告 莫言为大家表演开联合收割机啦 看完莫言紧张又努力开收割机的视频 网友直呼 莫言老师抓紧方向盘使劲转动的样子太可爱了 爱了 爱了 在大家的印象中 莫言是深邃而丰腴的大作家 但这个视
  • [STM32F1]STM32上的DWT与延时实现

    对于做单片机程序开发来说 定时管理的需求非常普遍 不管是 系统滴答定时器systick计数器延时或者是通过外设定时器timer的向上向下等计数来延时 甚至在精度要求不高的地方还可以通过变量自加判断来延时 这都是一种延时管理实现的方法 但是对