news 2026/3/26 4:06:46

STM32之使用DWT外设编写延时函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32之使用DWT外设编写延时函数

T 是一个调试外设,它的核心功能之一是 CYCCNT(Cycle Count),这是一个32位递增计数器,用于记录 CPU 执行的时钟周期数量。我们可以通过对这个计数器的变化来实现高精度延时。

在使用 DWT 延时之前,需要完成以下操作:

使能 DWT

使能 CYCCNT

清零 CYCCNT

基于 CYCCNT 实现延时逻辑

源码如下:

dwt.delay.h文件

#ifndef __DWT_DELAY_H

#define __DWT_DELAY_H

#include "stm32g4xx.h"

/* 获取内核时钟频率 */

#define GET_CPU_ClkFreq() HAL_RCC_GetSysClockFreq()

uint32_t CPU_TS_TmrRd(void);

HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority);

//最大延时值为8秒

void dwt_delay_us(uint32_t us);

#define HAL_Delay(ms) dwt_delay_us(ms*1000)

#define dwt_delay_s(s) dwt_delay_us(s*1000000)

#endif /* __DWT_DELAY_H */

dwt_delay.c文件

#include "dwt_delay.h"

#define DWT_CR *(__IO uint32_t *)0xE0001000

#define DWT_CYCCNT *(__IO uint32_t *)0xE0001004

#define DEM_CR *(__IO uint32_t *)0xE000EDFC

#define DEM_CR_TRCENA (1 << 24)

#define DWT_CR_CYCCNTENA (1 << 0)

/**

* @brief 初始化时间戳

* @param 无

* @retval 无

* @note 使用延时函数前,必须调用本函数

*/

HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)

{

/* 使能DWT外设 */

DEM_CR |= (uint32_t)DEM_CR_TRCENA;

/* DWT CYCCNT寄存器计数清0 */

DWT_CYCCNT = (uint32_t)0u;

/* 使能Cortex-M DWT CYCCNT寄存器 */

DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;

return HAL_OK;

}

/**

* @brief 读取当前时间戳,每1ms更新一次

* @param 无

* @retval ms时间戳

*/

uint32_t HAL_GetTick(void)

{

return ((uint32_t)DWT_CYCCNT/(GET_CPU_ClkFreq()*1000));

}

/**

* @brief 采用CPU的内部计数实现精确延时,32位计数器,最大延时时间8秒

* @param us : 延迟长度,单位1 us

* @retval 无

*/

void dwt_delay_us(uint32_t us)

{

uint32_t ticks;

uint32_t told,tnow,tcnt=0;

ticks = us * (GET_CPU_ClkFreq() / 1000000); /* 需要的节拍数 */

tcnt = 0;

told = (uint32_t)DWT_CYCCNT; /* 刚进入时的计数器值 */

while(1)

{

tnow = (uint32_t)DWT_CYCCNT;

if(tnow != told)

{

if(tnow > told)

{

tcnt += tnow - told;

}

else /* 重新装载 */

{

tcnt += UINT32_MAX - told + tnow;

}

told = tnow;

/*时间超过/等于要延迟的时间,则退出 */

if(tcnt >= ticks)break;

}

}

}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/23 19:59:30

为什么说这本书是C++进阶的必读宝典?深度解析Effective C++第3版

为什么说这本书是C进阶的必读宝典&#xff1f;深度解析Effective C第3版 【免费下载链接】EffectiveC中文版第3版.pdf资源介绍 《Effective C 中文版第3版》是一本深入浅出的C进阶教程&#xff0c;由侯老精心翻译&#xff0c;被誉为C学习者的“第二本书”。本书涵盖了C编程的高…

作者头像 李华
网站建设 2026/3/23 21:13:09

见过哪些醍醐灌顶的Java代码:从“卧槽“到“原来如此“的顿悟

"代码写出来是给人看的&#xff0c;顺便能在机器上运行"——某位秃顶程序员还记得第一次看JDK源码时的那种震撼吗&#xff1f;就像刘姥姥进了大观园&#xff0c;眼花缭乱的同时不禁感叹&#xff1a;"原来代码还能这么写&#xff01;"今天咱们就来聊聊那些让…

作者头像 李华
网站建设 2026/3/24 4:22:47

WCDB编译问题终极指南:从诊断到解决的完整方案

WCDB编译问题终极指南&#xff1a;从诊断到解决的完整方案 【免费下载链接】wcdb Tencent/wcdb: 是一个基于 SQLite 的数据库引擎&#xff0c;它提供了高性能、高可用性、安全性的移动数据库解决方案。适合用于移动设备和嵌入式设备的数据库开发&#xff0c;特别是对于需要高性…

作者头像 李华
网站建设 2026/3/24 8:56:13

OpenBao终极指南:从入门到精通的安全密钥管理平台

OpenBao终极指南&#xff1a;从入门到精通的安全密钥管理平台 【免费下载链接】openbao OpenBao exists to provide a software solution to manage, store, and distribute sensitive data including secrets, certificates, and keys. 项目地址: https://gitcode.com/gh_mi…

作者头像 李华
网站建设 2026/3/25 14:24:45

桁架机械手控制技术:基于1511CPU的轴同步轻量化SICAR标准应用

桁架机械手控制1511CPU&#xff0c;轴同步&#xff0c;轻量化SICAR标准在工业自动化现场摸爬滚打多年的老张常说&#xff1a;"能把桁架机械手玩溜的&#xff0c;都是时间管理大师。"这话不假&#xff0c;尤其是当我们面对1511CPU这个控制核心时&#xff0c;轴同步的精…

作者头像 李华