news 2026/6/23 19:31:09

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/6/23 19:00:44

选择中国优化路线的美国独立服务器的8大好处

在实际的网络应用中&#xff0c;部分中国用户在访问海外网站或服务时&#xff0c;会遇到访问速度不稳定、延迟偏高、页面加载缓慢等问题。该现象在跨境访问美国服务器时尤为常见&#xff0c;尤其是在高峰时段。本文将从网络路径、路由机制以及工程实践角度&#xff0c;分析中美…

作者头像 李华
网站建设 2026/6/23 4:26:21

Effective C++ 中文版第3版:C++进阶编程的终极指南

作为C编程领域公认的进阶必读经典&#xff0c;《Effective C 中文版第3版》是每位中高级开发者提升代码质量的权威参考。这本由资深技术专家精心翻译的技术巨著&#xff0c;被誉为C学习者的"第二本书"&#xff0c;在掌握基础语法后为你打开通往专业级编程的大门。 【…

作者头像 李华
网站建设 2026/6/23 19:30:50

Slang光线追踪加速结构深度解析:从理论到性能优化实践

Slang光线追踪加速结构深度解析&#xff1a;从理论到性能优化实践 【免费下载链接】slang Making it easier to work with shaders 项目地址: https://gitcode.com/GitHub_Trending/sl/slang 在实时图形渲染领域&#xff0c;光线追踪技术正经历着前所未有的发展浪潮。作…

作者头像 李华
网站建设 2026/6/23 6:03:16

DeepSeek-R1-Distill-Qwen-7B集群部署终极指南:轻松搞定AI推理服务

想要快速上手高性能AI模型部署&#xff1f;DeepSeek-R1-Distill-Qwen-7B作为基于Qwen2.5-Math-7B蒸馏的推理模型&#xff0c;在数学、代码和逻辑任务中表现卓越。本文手把手教你构建稳定可靠的集群管理方案&#xff0c;让AI推理服务部署变得简单高效。 【免费下载链接】DeepSee…

作者头像 李华