【STM32教程】利用DWT模块实现精准延时功能

文章目录

  • 一、前言
  • 1.1 DWT简介
  • 1.2 DWT延时原理
  • 1.3 寄存器说明
  • 1.4 适用范围
  • 二、功能实现
  • 三、参考资料

  • 一、前言

    1.1 DWT简介

    DWT(Data watchpoint and trace unit)数据观察点与跟踪单元。它是内核调试组件的一部分,该单元的具体功能如下:
    1、它包含了 4 个比较器,可以配置成在发生比较匹配时,执行如下动作:

    2、作为计数器,对下列项目进行计数:

    3、以固定的周期采样 PC 的值;
    4、中断事件跟踪:当用于硬件观察点或 ETM 触发时,比较器既可以比较数据地址,也可以比较程序计数器 PC,当用于其它功能时,则只能比较数据地址。

    1.2 DWT延时原理

    WDT作为计数器使用时,使用CYCCNT计数器(32位向上计数器,计数值满时从0开始重新计数)对系统时钟周期进行计数,而系统周期由内核时钟决定,内核时钟每跳动一次,计数值就会+1,因为内核时钟是可知的,当延时时间转换为对应的内核时钟计数值时,只需要等待延时计数值小于等于(实时计数值-初始计数值),就能实现对应的延时功能,具体公式如下:
    Tick(delay) <=|Tick(now)-Tick(start)|

    1.3 寄存器说明

    由于WDT属于内核调试组件的一部分,所以要使用WDT就必须要使能调试功能。在内核中调试功能一般分为两种模式:停止模式和调试监视模式(此处值讨论调试监视模式)。在MCU全速运行时,若想启用WDT(调试监视模式),需要通过DEMCR寄存器对DWT功能进行使能。DEMCR寄存器的详细说明如下:

    启用DWT组件后,需要清空CYCCNT计数器的值,再通过操作DWT_CTRLR寄存器,启动CYCCNT计数器,DWT_CTRLR寄存器的详细说明如下:

    1.4 适用范围

    ①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。

    注意事项:参照上述流程实现延时功能后,若MCU在非debug模式延时失效时,可能是因为MCU未复位导致的,需要手动对MCU进行复位。


    三、参考资料

    [1]STM32 Cortex®-M33 MCUs programming manual
    [2]STM32U5 Series Arm®-based 32-bit MCUs Reference manual
    [3]一种Cortex-M内核中的精确延时方法

    作者:CHN-Ayang

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【STM32教程】利用DWT模块实现精准延时功能

    发表回复