STM32 DWT 实现硬件延时

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;
    DWT->CTRL |=  DWT_CTRL_CYCCNTENA_Msk;
    DWT->CYCCNT = 0UL;
#endif
}

void Delay_us(u32 in_xus)
{
    u32 init_tick = REG_DWT_CYCCNTR;
    u32 num_tick = (SystemCoreClock / 1000000) *in_xus;
    while((REG_DWT_CYCCNTR - init_tick) < num_tick);
}

void Delay_ms(u32 in_xms)
{
    for(u32 i = 0; i < in_xms; i++)
    {
        delay_us(1000);
    }
}

延时性能:当MCU基于160MHz时钟全速运行时,延时1us时,误差约为356ns;延时1ms时,误差约为523ns。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啵啵520520

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值