在单片机程序当中,延时函数是标配,简单的不精确延时可用软件实现,但如果想要获得精准的可重入微秒级延时,就必须得使用硬件解决。
使用硬件延时主要有3种方案:
1、systick定时器;
2、timerx定时器;
3、DWT系统时钟计数器;
本文所讲解的就是第3种,如何利用DWT硬件,实现硬件延时功能。

DWT是ARM Cortex-M3/M4/M7/M33处理器的标配模块之一,因此只要是基于此内核的单片机都可以实现DWT延时功能,比如常见的STM32F1xx、STM32F4xx、STM32F7xx、GD32F1xx等等等。
DWT模块有很多功能,当前我们只用到它的系统时钟计数功能,DWT模块的系列寄存器中有1个32bit的CYCCNT寄存器,它存储着当前PC采样周期计数值,每个系统时钟其值自增1。例如STM32F103ZET6系统频率为72MHz,那么每秒钟,DWT->CYCCNT会增加72000000。
开启DWT->CYCCNT计数步骤如下:
1、DEMCR的TRCENA置1;(使能DWT功能)
2、DWT->CYCCNT清零;
3、DWT->CTRL的CYCCNTENA置1;(使能DWT_C