DWT延时原理
WDT作为计数器使用时,使用CYCCNT计数器(32位向上计数器,计数值满时从0开始重新计数)对系统时钟周期进行计数,而系统周期由内核时钟决定,内核时钟每跳动一次,计数值就会+1,因为内核时钟是可知的,当延时时间转换为对应的内核时钟计数值时,只需要等待延时计数值小于等于(实时计数值-初始计数值),就能实现对应的延时功能,具体公式如下:
Tick(delay) <=|Tick(now)-Tick(start)|。
适用范围
①Cortex-M3内核MCU
②Cortex-M33内核MCU
③Cortex-M4内核MCU
#include "stm32u5xx_hal.h"
#define REG_DWT_CTRLR (*(volatile u32 *)0xE0001000)
#define REG_DWT_CYCCNTR (*(volatile u32 *)0xE0001004)
#define REG_DEMCR (*(volatile u32 *)0xE000EDFC)
void delay_init(void)
{
#if 0
REG_DEMCR |= (u32)(1u << 24); /* 使能DWT外设 */
REG_DWT_CYCCNTR &= (u32)0u; /* 清空计数值 */
REG_DWT_CTRLR |= (u32)(1u << 0); /* 启动DWT计数 */
#else
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;