当前位置: 首页 > news >正文

DWT硬件延时

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
http://www.jsqmd.com/news/1124014/

相关文章:

  • 如何在10分钟内完成高质量语音转换训练?终极完整指南
  • 在PC上畅玩Switch游戏:Ryujinx模拟器完全指南与实战技巧
  • 解锁PS3手柄在Windows上的完全潜力:DsHidMini深度体验指南
  • 宝塔部署的前后端项目从IP访问改成自定义域名访问
  • E-Hentai批量下载解决方案:基于浏览器脚本的高效图片归档创新方法
  • STM32F439ZG与171010550的DC-DC降压电源设计实战
  • AI Agent 面试题 711:Agent的Prompt注入防御的实时监控和告警
  • 10分钟搭建原神私服:KCN-GenshinServer终极指南
  • 终极指南:如何用SuperSQL让AI帮你写SQL,5分钟完成数据库查询革命
  • 特征工程:相关性筛选房价预测模型精度提升实践
  • MeterSphere测试报告生成:5步打造专业测试报告与CI/CD自动化集成指南
  • Fast-GitHub终极指南:如何让GitHub下载速度提升10倍的免费解决方案
  • 如何免费获取国家中小学智慧教育平台电子课本PDF:智能解析下载方案
  • 逆向工程实战:58同城App密码加密算法解析与Python复现
  • AutoRaise终极指南:3步实现macOS鼠标悬停窗口自动聚焦,提升5倍工作效率
  • 如何通过5个简单步骤实施HARA
  • 内核堆栈报告与故障定位
  • MapLibre开源地图生态完全指南:从零构建专业级地图应用
  • 现代加密传输架构安全分析与量子前瞻性过渡策略
  • 文心一言三种接入方式:网页版、SDK与API的选型逻辑
  • 高效批量下载E-Hentai图库的完整指南
  • NBTExplorer:我的世界数据编辑终极指南与完整教程
  • 手机怎么把 Gemini 对话导出,复制、办公软件转换易丢格式,AI 导出鸭稳定完整导出对话文本
  • GBFR-Logs:深度解析《碧蓝幻想:Relink》战斗数据,提升团队协作的智能分析工具
  • 革新Web语音合成:speak.js如何实现纯JavaScript文本转语音解决方案
  • yolov26改进 | 主干/Backbone篇 | 轻量级移动端网络ShuffleNetV2(附代码+修改教程)
  • 基于CNN的番茄叶部病害智能识别系统设计与实现
  • 企业微信数据合规管理:WechatBakTool技术架构与商业价值分析
  • Zotero Format Metadata终极指南:3步彻底告别元数据混乱,打造完美文献库
  • 基于YOLOv5的道路损坏实时检测系统开发实践