news 2026/6/12 4:12:02

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/12 15:44:15

Graphiti知识图谱实战指南:从零搭建AI记忆系统的完整方案

Graphiti知识图谱实战指南&#xff1a;从零搭建AI记忆系统的完整方案 【免费下载链接】graphiti 用于构建和查询时序感知知识图谱的框架&#xff0c;专为在动态环境中运行的 AI 代理量身定制。 项目地址: https://gitcode.com/GitHub_Trending/grap/graphiti 你是否曾为…

作者头像 李华
网站建设 2026/6/12 19:02:00

高频信号能定位转子?这事儿听着有点玄乎,但旋转高频注入法确实让永磁同步电机甩掉了位置传感器。今天咱们就拆解这个黑科技,手把手看看怎么用代码实现无位置控制

旋转高频注入法永磁同步电机无位置控制策略&#xff0c;转子位置效果很好。 旋转高频电压注入法是通过在电机绕组端上注入三相对称的高频电压信号作为激励&#xff0c;检测 该激励信号产生的电流响应&#xff0c;通过特定的信号处理&#xff0c;最终获得转子位置与转速信息&…

作者头像 李华
网站建设 2026/6/10 15:31:08

踩下电门瞬间,电动车总有个让人着迷的爆发力。这背后藏着复合电源系统的精妙配合,今天咱们拆开看看这个由电池组、超级电容和DCDC组成的能量组合怎么玩转瞬态功率

基于规则策略的纯电动汽车复合电源仿真模型&#xff0c;包括DCDC模型、电池模型&#xff0c;超级电容模型。先看动力电池的建模。这里用二阶RC等效电路能比较好地反映动态特性。试着用Python搭个简化模型&#xff1a; class BatteryModel:def __init__(self, soc0.8):self.soc …

作者头像 李华
网站建设 2026/6/12 15:04:25

先扔个核心代码镇楼

蒙特卡洛法&#xff08;mc&#xff09;模拟晶粒生长 利用仿真软件abaqus、ansys或其他软件模拟熔池的宏观温度场&#xff0c;并用matlab编写晶粒生长程序&#xff0c;将温度写入程序接口&#xff0c;微观模拟该温度下晶粒生长的过程。 内容包括程序源代码、参数设置视频教程% 蒙…

作者头像 李华
网站建设 2026/6/10 20:34:57

ffmpeg-python视频降噪实用指南:从基础应用到高级技巧

ffmpeg-python视频降噪实用指南&#xff1a;从基础应用到高级技巧 【免费下载链接】ffmpeg-python Python bindings for FFmpeg - with complex filtering support 项目地址: https://gitcode.com/gh_mirrors/ff/ffmpeg-python 视频处理中噪声问题一直困扰着许多创作者&…

作者头像 李华
网站建设 2026/6/10 18:25:36

AntiSplit-M:终极APK合并工具完整使用指南

AntiSplit-M&#xff1a;终极APK合并工具完整使用指南 【免费下载链接】AntiSplit-M App to AntiSplit (merge) split APKs (APKS/XAPK/APKM) to regular .APK file on Android 项目地址: https://gitcode.com/gh_mirrors/an/AntiSplit-M 在Android应用分发过程中&#…

作者头像 李华