历史上的今天
今天是: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的延时函数,还需要学习下。
史海拾趣
|
在做C++编程的时候,常常要用到和摄像头什么的做信息采集 这时候常常会需要得到系统设备驱动,这是如何做到的,设备驱动号是什么东西,怎么用啊? 系统的设备是不是都是统一编号的? 设备驱动是如何在系统中存储和使用的啊?… 查看全部问答> |
|
如题 因为我是初学者 但公司的新项目是做一个外包 而这个外包是在手机平台上运行的 所以来问问是否有相关参考文档 多谢达人指点~~~~~~… 查看全部问答> |
|
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 ...… 查看全部问答> |
|
先用两片扩出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周期控制(在定时中断 ...… 查看全部问答> |




