stm32F103C8T6标准库DWT基础应用1

发布时间:2026/9/3 8:16:43

stm32F103C8T6标准库DWT基础应用1
目录1.DWT介绍2. DWT精度3.DWT 精确延时功能4. DWT相关寄存器4.1 DEMCR4.2 DWT_CYCCNT4.3 CYCCNTENA4.4 寄存器总结5. DWT宏定义编写6. DWT模块代码6.1 DWT初始化6.2 获取当前时间戳6.3 节拍数转换成对应的时间6.4 us延时6.5 ms延时6.6 s延时1.DWT介绍在Cortex-M里面有一个外设叫DWT(DataWatchpoint andTrace)是用于系统调试及跟踪它有一个32位的寄存器叫CYCCNT它是一个向上的计数器记录的是内核时钟运行的个数内核时钟跳动一次该计数器就加1精度非常高决定内核的频率是多少。2. DWT精度例如本教程是基于F103系列内核时钟是72M那精度就是1/72M14ns而程序的运行时间都是微秒级别的所以14ns的精度是远远够的。假设内核频率为72M内核跳一次的时间大概为1/72M14ns最长能记录的时间为60s2的32次方/72000000。如果是H7这种400M主频的芯片那它的计时精度高达1/400M2.5ns。如果是i.MXRT1052这种高速的处理器假设内核频率为528M内核跳一次的时间大概为1/528M1.9ns,(最长能记录的时间为8.13s2的32次方/528000000。当CYCCNT溢出之后会清0重新开始向上计数。3.DWT 精确延时功能要实现延时的功能总共涉及到三个寄存器DEMCR、DWT_CTRL、DWT_CYCCNT分别用于开启DWT功能、开启CYCCNT及获得系统时钟计数值。详细内容出自文献《DDI0337Hcortexm3_r2p0_trm》与《CM3权威指南CnR2》等4. DWT相关寄存器4.1 DEMCR想要使能DWT外设需要由另外的内核调试寄存器DEMCR的位24控制写1使能。DEMCR的地址是OxEOOOEDFC。关于该寄存器的详情见图DEMCR的位24写1使能。4.2 DWT_CYCCNT使能DWT_CYCCNT寄存器之前先清0。其基地址是OxE0001004复位默认值是0可读写类型。所以往0xE0001004这个地址写0就将DWT_CYCCNT清0了。4.3 CYCCNTENA它是DWT控制寄存器DWT_CTRL的第一位其基地址为OxE0001000写1使能则启用CYCCNT计数器否则CYCCNT计数器将不会工作。4.4 寄存器总结想要使用DWT的时候需要将 DEMCR寄存器的第24位写1使能。想要查看计数的值去看DWT_CYCCNT寄存器里面计数的值。如果想要开始计数DWT 控制寄存器 DWT_CTRL 的第 0 位 CYCCNTENA 置 1开启 CYCCNT 硬件自增计数。5. DWT宏定义编写/*DWT时间戳相关寄存器定义*/#defineDEMCR(*(uint32_t*)(0xE000EDFC))#defineDWT_CTRL(*(uint32_t*)(0xE0001000))#defineDWT_CYCCNT(*(uint32_t*)(0xE0001004))#defineDEMCR_TRCENA(124)#defineDWT_CTRL_CYCCNTENA(10)外设叫DWT(Data Watchpoint and Trace数据观察点与跟踪单元)该外设有一个32位的寄存器叫CYCCNT它是一个向上的计数器记录的是内核时钟运行的个数内核每一个时钟周期时间大概为1/72M14ns最长能记录的时间约为60s 2的32次方 /72000000当CYCCNT溢出之后自动清零重新开始向上计数。开关1 DEMCR调试异常与监控控制寄存器 (寄存器地址0xE000EDFC) DEMCR_TRCENA管理第24位使能(DWT工作) 开关2 DWT_CTRL控制寄存器 (寄存器地址0xE0001000) DWT_CTRL_CYCCNTENA管理第0位(计数器工作) DWT_CYCCNTDWT 周期计数器寄存器 (寄存器地址0xE0001004) 存放计数值CPU每一个时钟周期自动1。(使用前需要软件手动清零) 使能CYCCNT计数的操作步骤 1、先使能DWT外设准备这个由内核调试寄存器DEMCR的位24控制写1使能 2、使能CYCCNT计数器之前先清0。 3、使能CYCCNT计数器这个由DWT_CTRL的位0控制写1使能6. DWT模块代码6.1 DWT初始化/** * brief 初始化 DWT 计数器 * param 无 * retval 使用DWT延时函数之前必须调用本函数 */voidDWT_Init(void){/* 1.先使能DWT设备准备 */DEMCR|(uint32_t)DEMCR_TRCENA;/* 2.DWT CYCCNT寄存器清0 */DWT_CYCCNT(uint32_t)0U;//使能CYCCNT计数器之前先清0。/* 使能Cortex-M DWT CYCCNT 寄存器 */DWT_CTRL|(uint32_t)DWT_CTRL_CYCCNTENA;}6.2 获取当前时间戳/** * brief 获取当前的时间戳 * param 无 * retval 当前时间戳,即DWT_CYCCNT寄存器的值 */uint32_tDWT_GetTick(void){return(uint32_t)DWT_CYCCNT;}6.3 节拍数转换成对应的时间/** * brief 节拍数转化时间间隔(微秒单位) * param tick: 需要转换的节拍数 * param frequency: 内核时钟频率 * retval 当前时间戳,即DWT_CYCCNT寄存器的值 */uint32_tDWT_TickToMicrosecond(uint32_ttick,uint32_tfrequency){return(uint32_t)1000000.0/frequency*tick;}传入的tick3600代表需要累计走过 3600 个 CPU 内核时钟节拍。DWT‑CYCCNT 寄存器每个内核时钟周期自动 1当DWT-CYCCNT − start这个差值累加到 3600 时硬件层面真实流逝时间就是 50μsCPU 主频 72MHz 条件下。这里的tick DWT-CYCCNT − start周期差值只是用户只需要传递节拍数CYCCNT和us互相转换1/SystemCoreClock*CYCCNTs 1000/SystemCoreClock*CYCCNTms 1000 000/SystemCoreClock*CYCCNTus (x)us6.4 us延时/** * brief DWT计数实现精确延时32位计数器 * param time : 延迟长度单位1 us * retval 无 * note 无 */voidDWT_DelayUs(__IOuint32_ttime){/* 将微秒转化为对应的时钟计数值*/uint32_ttick_durationtime*(SystemCoreClock/1000000);uint32_ttick_startDWT_GetTick();/* 刚进入时的计数器值 */while(DWT_GetTick()-tick_starttick_duration);}tick_duration time * (SystemCoreClock / 1000000) ;time输入单位微秒 usSystemCoreClock内核时钟单位Hztick_duration输出DWT 需要的节拍数就是DWT-CYCCNT‑start要达到的差值完整流程72MHztime50time50计算tick_duration 50 * (SystemCoreClock/1000000)→tick_duration 3600tick_start DWT-CYCCNT;假设此刻寄存器读到 12400tick_start 12400while 判断(DWT-CYCCNT - tick_start) 3600差值不到 3600循环继续等待CYCCNT 硬件持续 1差值 ≥3600退出 while延时完成6.5 ms延时/** * brief DWT计数实现精确延时32位计数器 * param time : 延迟长度单位1 ms * retval 无 */voidDWT_DelayMs(__IOuint32_ttime){for(uint32_ti0;itime;i){DWT_DelayUs(1000);}}6.6 s延时/** * brief DWT计数实现精确延时32位计数器 * param time : 延迟长度单位1 s * retval 无 */voidDWT_DelayS(__IOuint32_ttime){for(uint32_ti0;itime;i){DWT_DelayMs(1000);}}

相关新闻

PasteMD:基于Python的Markdown语义粘贴引擎

PasteMD:基于Python的Markdown语义粘贴引擎

2026/9/3 8:16:43

简介:PasteMD 是一款面向程序员、技术文档撰写者及办公效率追求者的 Python 桌面工具,专为解决 Markdown、网页富文本及 AI 对话内容在 Word/WPS/Excel 中排版失真、粘贴繁琐的痛点而设计。它通过系统托盘常驻运行,支持一键识别剪贴板内容类型…

类和对象(java 精简版)

类和对象(java 精简版)

2026/9/3 8:16:43

1. 类的定义格式在java中定义类时需要用到class关键字//创建类 class ClassName{filed; //子段(属性)或者 成员变量method; //行为 或者 成员方法 }2. 成员变量和成员方法class Student{ //成员变量 public String name; public int age;//普通成员方法…

基于Leaflet.js的Web地图可视化实战:从坐标解析到交互式呈现

基于Leaflet.js的Web地图可视化实战:从坐标解析到交互式呈现

2026/9/3 8:16:43

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Python+PyQt5调用百度植物识别API的毕业设计工程实践

Python+PyQt5调用百度植物识别API的毕业设计工程实践

2026/9/3 9:06:45

简介:本资源是一套完整的基于Python的植物识别桌面应用毕业设计项目,面向计算机或人工智能方向本科生,解决图像识别类课程设计与毕设中GUI开发、API集成与AI服务调用的实际需求。压缩包共16个文件,含2个核心Python源码&#xff08…

MATLAB实现相移法偏移估计:从原理到代码实战

MATLAB实现相移法偏移估计:从原理到代码实战

2026/9/3 9:06:45

简介:本资源是一套面向地球物理勘探专业师生及科研人员的相移法偏移MATLAB实现代码,聚焦地震数据处理中的倾斜界面校正问题,适用于地震成像、速度建模与偏移算法教学实践。压缩包共5个文件,含3个核心.m函数(实现预处理…

ROS2多线激光雷达仿真骨架:Ubuntu22.04+Humble+Fortress全栈验证

ROS2多线激光雷达仿真骨架:Ubuntu22.04+Humble+Fortress全栈验证

2026/9/3 9:06:45

简介:本资源是一个面向ROS2初学者与机器人仿真开发者的Gazebo多线激光雷达仿真工程,基于ROS 2 Humble和Ubuntu 22.04平台构建,聚焦于机器人感知模块的快速验证与算法调试,特别适用于SLAM建图、定位导航及传感器融合等场景。压缩包…

AI 为何无法绕过 Claude Code Harness 的护栏?执行前裁决机制设计哲学

AI 为何无法绕过 Claude Code Harness 的护栏?执行前裁决机制设计哲学

2026/9/3 9:06:45

AI 为何无法绕过 Claude Code Harness 的护栏?执行前裁决机制设计哲学 【免费下载链接】claude-code-harness Claude Code Dedicated Development Harness - Achieving High-Quality Development Through an Autonomous Plan→Work→Review Cycle 项目地址: https…

SkillOpt 训练循环6大核心阶段图解:Rollout、Reflect、Aggregate、Select、Update、Gate

SkillOpt 训练循环6大核心阶段图解:Rollout、Reflect、Aggregate、Select、Update、Gate

2026/9/3 9:06:45

SkillOpt 训练循环6大核心阶段图解:Rollout、Reflect、Aggregate、Select、Update、Gate 【免费下载链接】SkillOpt SkillOpt is a text-space optimizer that trains reusable natural-language skills for frozen LLM agents through trajectory-driven edits, va…

电竞复盘分析技术实现:从语音转写到数据可视化的完整工具链

电竞复盘分析技术实现:从语音转写到数据可视化的完整工具链

2026/9/3 8:56:45

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

备战数据库管理工程师校招:索引、事务、备份恢复核心考点解析

2026/9/2 10:08:07

每年校招季我都会接触不少准备数据库方向笔试的同学,看到最多的状态就是:简历上写着“熟悉 MySQL”“了解索引优化”,一碰到数据库管理工程师的笔试卷,却在索引、事务、锁、备份恢复这些题目上翻车。网易这套 2018 校园招聘数据库…

数字电路时序基石:深入理解建立时间与保持时间

数字电路时序基石:深入理解建立时间与保持时间

2026/9/2 12:11:52

1. 这不是“背公式”的事:时间参数到底在约束什么你翻过数字电路教材,一定见过这两个词:建立时间(Setup Time)和保持时间(Hold Time)。它们常被并列写在触发器(Flip-Flop&#xff09…

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

蓝桥杯国赛超声波测距机:从单片机原理到嵌入式系统实战

2026/9/1 23:49:08

1. 项目缘起:从赛题到超声波测距机的诞生第八届蓝桥杯单片机设计与开发国赛的题目,我至今记忆犹新。它没有直接给出一个花哨的名字,而是用“超声波测距机”这个朴实无华的功能描述,精准地勾勒出了考核的核心。对于当时备赛的我而言…

【原创】基于微信小程序+AI大模型+uni-app的宠物用品商城小程序(设计与实现)

【原创】基于微信小程序+AI大模型+uni-app的宠物用品商城小程序(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

【原创】基于AI大模型+SpringBoot+Vue的宠物用品商城(设计与实现)

【原创】基于AI大模型+SpringBoot+Vue的宠物用品商城(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

【原创】基于微信小程序+AI大模型+uni-app的节日礼品定制商城小程序(设计与实现)

【原创】基于微信小程序+AI大模型+uni-app的节日礼品定制商城小程序(设计与实现)

2026/9/3 0:06:18

摘要:随着电子商务与本地生活服务的普及,线上交易与店铺运营管理已成为常规业态。传统分散式进销存与人工对账方式存在流程割裂、库存难同步、促销规则难落地、经营数据难沉淀等弊端,难以支撑一体化的数字化运营。同类课题亦多见多商户在线商…

远程协作的工作台整理

远程协作的工作台整理

2026/9/3 6:56:24

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/3 6:39:45

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/3 5:20:28

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…