尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

DWT硬件延时

DWT硬件延时
📅 发布时间:2026/7/4 20:59:01

1、Cortex-M4内核架构

2、硬件延时

利用计数功能的硬件进行延时,比如单片机片上定时器(Timer),内核滴答定时器(systick)等:

__weak void HAL_IncTick(void) { uwTick++; } __weak uint32_t HAL_GetTick(void) { return uwTick; } void SysTick_Handler(void) { HAL_IncTick(); } __weak void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = 0; tickstart = HAL_GetTick(); while((HAL_GetTick() - tickstart) < Delay); }

3、DWT(监视点单元,数据跟踪)硬件延时方案

DWT里有一个32位的寄存器叫CYCCNT,它是一个向上计数器,记录的是内核时钟运行的次数,内核时钟跳动一次,该计数器就加1,如果内核时钟是120MHz,那精度就是1/120M = 8.3ns,而单片机程序的运行时间通常都是微秒级别的,所以DWT实现延时的精度是非常高的。

要实现DWT延时的功能,总共涉及到三个内核寄存器:DEMCR 、DWT_CTRL、DWT_CYCCNT,分别用于开启DWT功能、开启CYCCNT及获得系统时钟计数值;当CYCCNT溢出之后,会清0重新开始向上计数。

如果内核时钟是120MHz,直接使用CYCCNT延时最大值为: 232 * 1/120M = 36S。

注:DWT只在Cortex-M3及以上内核中存在。

①使能DWT,需要向DEMCR寄存器的24位写1,寄存器定义位于core_cm4.h

CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; /* 关闭 TRC */

CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;/* 打开 TRC */

②使能计数器,需要向CTRL寄存器的0位写1:

DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; /* 关闭计数功能 */

DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;/* 打开计数功能 */

③计数器清零:

DWT->CYCCNT = 0;

代码编写:

#include <stdint.h> #include "gd32f30x.h" #include "delay.h" static uint32_t g_sysClock; /** *********************************************************** * @brief DWT初始化配置 * @param * @return *********************************************************** */ void DelayInit(void) { /* 关闭 TRC */ CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; /* 打开 TRC */ CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; /* 关闭计数功能 */ DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; /* 打开计数功能 */ DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; /* 计数清零 */ DWT->CYCCNT = 0; g_sysClock = rcu_clock_freq_get(CK_SYS); } /** *********************************************************** * @brief 微秒级延时函数 * @param nUs,最大延时时间( 2^32 / 内核主频 ) * 10^6 us * @return *********************************************************** */ void DelayNus(uint32_t nUs) { uint32_t tickStart = DWT->CYCCNT; /* 转换为nUs对应的时钟跳动次数*/ nUs *= g_sysClock / 1000000; /* 延时等待 */ while ((DWT->CYCCNT - tickStart) < nUs); } /** *********************************************************** * @brief 毫秒级延时函数 * @param nMs,延时时间n毫秒 * @return *********************************************************** */ void DelayNms(uint32_t nMs) { for (uint32_t i = 0; i < nMs; i++) { DelayNus(1000); } } #ifndef _DELAY_H_ #define _DELAY_H_ #include "stdint.h" /** *********************************************************** * @brief DWT初始化配置 * @param * @return *********************************************************** */ void DelayInit(void); /** *********************************************************** * @brief 微秒级延时函数 * @param nUs,最大延时时间( 2^32 / 内核主频 ) * 10^6 us * @return *********************************************************** */ void DelayNus(uint32_t nUs); /** *********************************************************** * @brief 毫秒级延时函数 * @param nMs,延时时间n毫秒 * @return *********************************************************** */ void DelayNms(uint32_t nMs); #endif

相关新闻

  • MeterSphere测试报告生成:5步打造专业测试报告与CI/CD自动化集成指南
  • 10分钟搭建原神私服:KCN-GenshinServer终极指南
  • MapLibre开源地图生态完全指南:从零构建专业级地图应用

最新新闻

  • 机器学习算法选型实战指南:从业务约束出发的诊断式决策法
  • uiv高级用法:掌握自定义主题与组件扩展的终极指南
  • CDGA数据治理证书含金量深度解析:从知识体系到实战价值
  • 2026年AI写小说工具深度测评:长文本稳定性与角色一致性实战指南
  • 自考学生必备AI论文写作工具全攻略
  • EditAnything与ComfyUI集成教程:打造专业视频编辑工作流

日新闻

  • STM32F745VG与MC6470 IMU的高性能姿态控制系统设计
  • 机器不消费,人何以生存
  • AI项目操作手册编写规范与最佳实践

周新闻

  • Windows字体自定义终极方案:No!! MeiryoUI完全指南
  • Deepin Boot Maker:告别命令行,3分钟制作Linux启动盘的智能解决方案
  • Plain Craft Launcher 2:重新定义你的Minecraft游戏体验

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号