历史上的今天
返回首页

历史上的今天

今天是:2025年12月15日(星期一)

正在发生

2022年12月15日 | 其实,STM32有隐藏的定时器~

2022-12-15 来源:zhihu

DWT

在Cortex-M里面有一个外设叫DWT(DataWatchpoint andTrace),是用于系统调试及跟踪,DWT的中文名字应该是:数据观察点触发。在STM32用户手册的第32章节Debugsupport (DBG)有如下框图。

明显DWT属于DBG部分的功能,从上图的标题可以看出DWT属于CortexM3内核的,理论上M3内核的MCU都支持的,这个下文会说明。在这里我将其称之为“隐藏的定时器”,因为他可以代替定时器外设实现上文提到延时功能和测量代码运行时间的功能,DWT不能代替定时器的其他功能。

之所以DWT可以实现延时功能,因为它有一个32的计数器CYCCNT,这是一个向上计数的计数器,当它溢出时会自动清零并重新开始向上计数,它的频率就是内核的主频。简单点说,就是内核时钟跳动一下,CYCCNT计数器就加1。

很明显DWT计数器的精度和系统主频有关,我们常用的STM32F103主频一般为72Mhz,STM32F207一般为120Mhz,STM32H7主频一般为400Mhz。以为主频最低为72Mhz的STM32F103为例,精度是1/72M= 14ns,这个精度足以满足大部分延时函数的需求,同样程序的运行时间都是微秒级别的,远远满足测量代码运行时间的要求。

DWT的配置

首选使用DWT前必须使能DBG的系统跟踪,控制使能位在DEMCR寄存器的bit24。注意该寄存器详细说明在STM32的用户手册上查不到,需要在CortexM3内核手册查到,在《Cortex-M3权威指南》书中也可以查到。

在使能CYCCNT计数器前,必须先将其清零。下图是从ARM的官方手册《Cortex-M3Technical Reference Manual》中查到的。

使能CYCCNT计数器,其控制位是DWT控制寄存器的第一位,写1使能,则启用CYCCNT计数器,否则CYCCNT计数器将不会工作。

总结一下:

a.先使能DWT外设,由内核调试寄存器DEM_CR的位24控制,写1使能。

b.使能CYCCNT寄存器之前,先清0。

c.使能CYCCNT寄存器,由DWT_CTRL的位0控制,写1使能。

代码如下

代码

从上文我们得知,我们已经获得了一个32位向上累加的计数器,溢出会自动清零并累加,频率是系统主频。那么我们简单封装下,就可以实现延时函数。以下代码在120Mhz的STM32F207测试。

如下图,延时函数精确延时,没有问题

实现测量代码运行时长的函数接口

如下图,可以精确测量代码运行时间,没有问题。

后记

本文使用DWT代替了定时器部分功能,它的优缺点如下:

1、优点是:方便移植,经过测试在M3、M4、M7内核的MCU上都可以使用。

2、缺点是:和定时器一样,都有一个延时的最大时间,测量代码运行时间的最大值。

如果项目使用MCU有空闲的定时器,且不考虑换MCU的话,我个人建议还是使用通用的定时器外设,不要使用DWT,虽然DWT方便移植,但通用定时器外设简单易懂,对于没有了解过这部分知识的小白,看到DWT的延时函数,还需要学习下。


推荐阅读

史海拾趣

谷峰(GOFORD)公司的发展小趣事

面对电子行业快速变化的市场环境和日益激烈的竞争态势,GStek始终保持清醒的头脑和敏锐的洞察力。公司密切关注行业动态和技术发展趋势,及时调整战略方向和产品布局。同时,GStek还注重内部管理和团队建设,不断提升员工的综合素质和专业技能。这些努力使得GStek能够在复杂多变的市场环境中保持稳健的发展态势,为实现其成为全球主要电源管理IC设计公司的愿景而不断努力。

Aavid Thermalloy公司的发展小趣事

面对电子行业快速变化的市场环境和日益激烈的竞争态势,GStek始终保持清醒的头脑和敏锐的洞察力。公司密切关注行业动态和技术发展趋势,及时调整战略方向和产品布局。同时,GStek还注重内部管理和团队建设,不断提升员工的综合素质和专业技能。这些努力使得GStek能够在复杂多变的市场环境中保持稳健的发展态势,为实现其成为全球主要电源管理IC设计公司的愿景而不断努力。

DART(英国达特)公司的发展小趣事

DART公司成立于英国的一个小城市,最初只有几名工程师和少量的资金。然而,他们凭借着对电子技术的热爱和对创新的不懈追求,逐渐在行业中崭露头角。公司的创始人是一位资深的电子工程师,他带领团队开发了一款具有革命性的新型传感器,这款传感器在精度和稳定性上远超当时的同类产品。这一技术突破为DART公司赢得了第一个重要的客户,也为公司的未来发展奠定了坚实的基础。

Carlisle Interconnect Technologies公司的发展小趣事

进入21世纪,Carlisle Interconnect Technologies开始了全球化的布局。公司不仅在北美和欧洲设立了多个生产基地和研发中心,还积极开拓亚洲和拉丁美洲等新兴市场。通过全球化的战略布局,公司不仅能够更好地利用全球资源,还能够更深入地了解各地市场需求,进一步推动业务发展。同时,公司还加强了与国际知名企业的合作,共同推动电子行业的发展和进步。

这五个故事只是Carlisle Interconnect Technologies发展历程中的一部分,但它们足以展示公司在电子行业中的创新、进取和不断追求卓越的精神。这些故事也为我们揭示了一个成功企业的发展轨迹:从创业初期的创新与突破,到不断的技术升级和产品多样化,再到全球化的布局与业务拓展,每一步都充满了挑战与机遇。

Beck IPC GmbH公司的发展小趣事

Beck IPC GmbH,一家在嵌入式通讯市场享有盛誉的公司,以其创新的IPC@CHIP技术为核心,为工业OEM提供了强大的支持。在某一时期,公司研发团队经过长时间的努力,成功开发出一款具有划时代意义的嵌入式控制模块。这款模块不仅性能卓越,而且稳定性极高,迅速获得了市场的广泛认可。多家知名工业设备制造商纷纷与Beck IPC建立合作关系,将其产品应用于各种高端设备中,从而推动了公司的快速发展。

CTC [Compact Technology Corp.]公司的发展小趣事

CTC公司在创立初期便致力于半导体技术的研发。一次偶然的实验中,公司团队成功研发出了一种新型的晶体管结构,这一创新使得晶体管的工作效率大大提升,同时降低了能耗。这一技术突破迅速引起了行业的关注,CTC公司的名字开始在电子行业中崭露头角。随着该技术的普及和应用,CTC公司的业务逐渐扩大,奠定了在电子行业的重要地位。

问答坊 | AI 解惑

这段是在运算什么?

有哪位高手能看懂下边程序在做什么? MOV   A,4AH                        MOV   R0,A           &n ...…

查看全部问答>

C++ 设备驱动 交互

在做C++编程的时候,常常要用到和摄像头什么的做信息采集 这时候常常会需要得到系统设备驱动,这是如何做到的,设备驱动号是什么东西,怎么用啊? 系统的设备是不是都是统一编号的? 设备驱动是如何在系统中存储和使用的啊?…

查看全部问答>

无法卸载驱动模块

把驱动装到开发板上后无法卸载,执行rmmod my_bdri.ko后提示: rmmod: chdir(2.6.29.4-FriendlyARM): No such file or directory 执行lsmod: [root@FriendlyARM /]# lsmod my_bdri 3348 0 - Live 0xbf000000 该怎么办啊????…

查看全部问答>

研华PCL 816

第一次调试板卡,我想了解一下板卡是怎么初始化的,还有通道的选择以及AD转化的触发,数据的读取等。 为什么每次读取AD数据后,BASE+13的DRDY位仍为0啊?…

查看全部问答>

关于电源问题

隔离变压器:额定功率50W,3个绕组变比n1:n2:n3=20:10:1,电流依次为I1=1.5A、I2=3A、I3=0.1A 电阻器: 30Ω/30W,36Ω/30W   这是09年电子竞赛中的元件,大家帮猜猜会出什么样的电源题 …

查看全部问答>

winCE能否生成类似DLL的第三方程序供他人调用?

如题 因为我是初学者 但公司的新项目是做一个外包 而这个外包是在手机平台上运行的 所以来问问是否有相关参考文档 多谢达人指点~~~~~~…

查看全部问答>

阻塞与非阻塞语句的区别

module DataBusOfBus(DataBus,link_bus,write); inout[11:0] DataBus; input link_bus; reg [11:0] outsigs;   assign DataBus=(link_bus)?outsigs:12\'hzzz;   always @(posedge write)       &n ...…

查看全部问答>

想要多少个跑马灯?用74hc595来扩展输出口

  先用两片扩出16个输出,不够还可以再增加     grace生成的USI初始化,还用翻译么?   /* *  ======== USI_init ======== *  Initialize Universal Serial Interface */void USI_init(void){& ...…

查看全部问答>

【lauchpad_g2231】关于OUTMOD1置位后复位问题?

g2231资源有限,只有一个timer_A2,用过的都知道,只有两个比较器。但是我想生成两路pwm波,必然用OUTMOD7的话只能产生一路,所以我用想用OUTMOD1自动置位的方法,taccr0,taccr1控制占空比产生两路,通过看门狗定时做pwm周期控制(在定时中断 ...…

查看全部问答>

CPLD UFM使用例子

CPLD UFM使用例子,可参考…

查看全部问答>