DWT硬件延时

DWT硬件延时


文章目录

  • DWT硬件延时
  • 软件&硬件延时方案
    • 软件延时
    • 硬件延时方案
  • DWT硬件延时方案
    • DWT硬件延时方案
    • DEMCR寄存器
    • DWT硬件延时方案实现
      • 延时初始化:
      • US延时:
      • MS延时:


软件&硬件延时方案

软件延时

static void Delay(uint32_t count){
while (count--);
}

软件延时的缺点:

  1. 延时精度差;

  2. 受系统主频影响,调校困难。

硬件延时方案

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

void SysTick_Handler(void){
HAL_IncTick();
}
__weak void HAL_IncTick(void){
uwTick++;
}
__weak void HAL_Delay(_IO uint32_t Delay){

uint32_t tickstart = 0;
tickstart = HAL_GetTick();
while((HAL_GetTick() - tickstart) < Delay);

}
__weak uint32_t HAL_GetTick(void){
return uwTick;
}

DWT硬件延时方案

Cortex-M4内核架构图
在这里插入图片描述

DWT硬件延时方案

  • DWT里有一个32位的寄存器叫CYCCNT,它是一个向上计数器,记录的是内核时钟运行的次数,内核时钟跳动一次,该计数器就加1,如果内核时钟是120MHz,那精度就是1/120M = 8.3ns,而单片机程序的运行时间通常都是微秒级别的,所以DWT实现延时的精度是非常高的。
  • 要实现DWT延时的功能,总共涉及到三个内核寄存器: DEMCR、 DWT_CTRL、 DWT_CYCCNT,分别用于开启DWT功能、开启CYCCNT及获得系统时钟计数值;当CYCCNT溢出之后,会清O重新开始向上计数。
  • 如果内核时钟是120MHz,直接使用CYCCNT延时最大值为: 232*1/120M = 36S

DEMCR寄存器

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

CoreDebug->DEMCR &=
~CoreDebug_DEMCR_TRCENA_Msk;

CoreDebug->DEMCR |=
CoreDebug_DEMCR_TRCENA_Msk;

DWT硬件延时方案实现

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

DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;

计数器清零:

DWT->CYCCNT = 0;

延时初始化:

/*
@brief DWT初始化配置
*
@param
@return
*/
void Delaylnit(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;
}

US延时:

/*
@brief 微秒级延时函数
@param nUs,最大延时时间( 2^32 /内核主频)*10^6 us
@return
*/
void DelayNus(uint32_t nUs){
uint32_t tickStart = DWT->CYCCNT;
/*转换为nUs对应的时钟跳动次数*/
nUs *= (rcu_clock_freq_get(CK_AHB) / 1000000);
/* 延时等待 */
while ((DWT->CYCCNT - tickStart) < nUs);
}

MS延时:

/*
@brief 毫秒级延时函数
@param nMs,延时时间n毫秒
*
@return
*/
void DelayNms(uint32_t nMs){
for (uint32_ti = 0; i < nMs; i++){
DelayNus(1000);
}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/410558.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sora抢饭碗!好莱坞大亨停止8亿美元投资

好莱坞消息&#xff0c;著名演员、影视投资人Tyler Perry在看到OpenAI最新发布的文生视频模型Sora后&#xff0c;停止了8亿&#xff08;约57亿元&#xff09;美元的投资。 该投资项目位于亚特兰大&#xff0c;本来要扩展十几个摄影棚用于影视剧的拍摄&#xff08;类似横店影视…

企业微信主体怎么转让给别人?

企业微信变更主体有什么作用&#xff1f;当我们的企业因为各种原因需要注销或已经注销&#xff0c;或者运营变更等情况&#xff0c;企业微信无法继续使用原主体继续使用时&#xff0c;可以申请企业主体变更&#xff0c;变更为新的主体。企业微信变更主体的条件有哪些&#xff1…

C++笔记(面对对象部分复习向)

B站&#xff1a;黑马程序员C教程 栈区&#xff0c;全局区&#xff0c;堆区和代码区 析构、构造和static 对象成员与类本身构造顺序&#xff0c;先成员后自己&#xff1b;析构则相反 static修饰成员变量,所有对象共享一份内存&#xff0c;编译阶段分配内存&#xff0c;类内声明…

Windows部署WebDAV服务并映射到本地盘符实现公网访问本地存储文件

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…

使用CE查找共享代码的多种方法

一般在游戏中,我们会有这样的定义Player和怪物NPC: // 基类 Character class Character { protected:std::string name;int64_t id;int32_t hp;int32_t mp;int32_t level;public:Character(const int64_t name) : id(id) {}virtual void attack() {…

做了个很牛的网站,可以搜索网站的网站到底有多好用?

今天给大家推荐的网站叫做&#xff1a;毒蘑菇 - 搜索 毒蘑菇搜索&#xff0c;顾名思义呢&#xff0c;搜索的功能比较好用&#xff0c;大家上网的时候总是需要记住网站的地址&#xff0c;即使你知道网站的名称&#xff0c;也得跳转到百度然后在搜索&#xff0c;有时候百度上那么…

Windows Server 2012 IIS中发布ASP.NET CORE项目

服务器安装IIS&#xff1a; 微软官网下载SDK&#xff1a; 下载Runtime官网&#xff1a;https://dotnet.microsoft.com/download/dotnet-core 安装成功重启IIS&#xff1a; VS发布项目&#xff1a;

流浪动物救助平台:Java开发的实践与思考

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

DevOps 周期的 6 个 C

中型到大型软件开发项目涉及许多人员、多个团队、资源、工具和开发阶段。它们都需要以某种方式进行管理和简化&#xff0c;不仅可以获得所需的产品&#xff0c;而且还要确保将来在不断变化的环境下易于管理和维护。组织通常遵循许多项目管理模型和技术。DevOps 是其中之一&…

精益生产,创新驱动:机器人技术引领企业的未来之路

随着自动化技术的普及和物联网、人工智能技术的迅速发展&#xff0c;全球制造业正在经历着一场革命性的变革。传统以人力劳动为基础的制造业正逐渐向以机器为主导的智能生产模式转型。企业们正积极探索更高效的制造方式&#xff0c;通过新兴技术提升生产力&#xff0c;同时降低…

该微信用户未开启“公众号安全助手”的消息接收功能,请先开启后再绑定解决操作步骤

1. 关注“公众平台安全助手” 2. 进入“公众平台安全助手”&#xff0c;点击右上角的用户图标&#xff0c;进入公众号信息界面。 3. 进入“公众号信息”界面后&#xff0c;点击右上角的…图标&#xff0c;打开更多选项。 4. 打开“更多选项”后&#xff0c;选择设置选项&#x…

Python高性能web框架--Fastapi快速入门

文章目录 fastapi框架一、预备知识点1.1、http协议一、简介二、 http协议特性三、http请求协议与响应协议 1.2、api接口 二、quick start简单案例 fastapi框架 Fastapi&#xff0c;一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的web框架。 fastapi的两个核心…

随机分布模型

目录 前言 一、离散型随机变量 1.1 0-1分布 1.2 二项分布 1.3 帕斯卡分布 1.4 几何分布 1.5 超几何分布 1.6 泊松分布 二、连续型随机变量 2.1 均匀分布 2.2 指数分布 2.3 高斯分布/正态分布 2.4 分布&#xff08;抽样分布&#xff09; 2.5 t分布&#xff08;抽样…

pytest钩子函数-pytest_runtest_logreport提取测试用例相关信息

问题&#xff1a;想在每个日志中记录测试用例开始结束时间&#xff0c;获取到测试用例的名称。 解决办法&#xff1a;使用钩子pytest_runtest_logreport 在pytest中&#xff0c;想要在conftest.py文件中获取正在运行的测试用例的名称&#xff0c;可以使用pytest_runtest_logre…

玩转ChatGPT:参考文献速查

一、写在前面 各位大佬&#xff0c;我又回来了&#xff0c;最近2月太忙啦&#xff08;过年、奶娃、本子、材料、结题&#xff09;&#xff0c;断更了。现水一篇证明我还活着&#xff01;&#xff01;&#xff01; 最近在写国自然本子&#xff0c;遇到一个估计大家都会遇到的问…

node14下运行项目报错:regeneratorRuntime is not defined

regeneratorRuntime is not defined&#xff0c;这是由于配置babel出错问题&#xff0c;由于使用了es7语法如async/await而当前babel版本过低 解决&#xff1a; npm install -D babel-plugin-transform-runtime babel-runtime 安装完成后在.babelrc文件下配置&#xff1a; &qu…

Centos7.9环境源码编译安装ffmpeg6.x

1.官网ffmpeg下载源码 https://ffmpeg.org/download.html#build-windows 2.未安装x264库则先安装配置 可以先查询x264库: whereis libx264 安装编译工具和依赖库&#xff1a; sudo yum install gcc make cmake mercurial git yasm pkgconfig autoconf automake libtool sudo…

Easy-Jmeter: 性能测试平台

目录 写在开始1 系统架构2 表结构设计3 测试平台生命周期4 分布式压测5 压力机管理6 用例管理6.1 新增、编辑用例6.2 调试用例6.3 启动测试6.4 动态控量6.5 测试详情6.6 环节日志6.7 实时数据6.8 测试结果 7 测试记录7 用例分析8 系统部署8.1普通部署8.2容器化部署 写在最后 写…

【Node.js】自动生成 API 文档

目录 1、直接使用swagger-ui-express 2、配合swagger-jsdoc 如何在Node.js项目中使用 Swagger 来自动生成 API接口文档&#xff0c;使用生成方式有很多种。本文基于swagger-jsdocswagger-ui-express快速实现 1、直接使用swagger-ui-express // 方便来浏览和测试api npm i sw…

2023年12月CCF-GESP编程能力等级认证C++编程六级真题解析

本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录・点这里 一、单选题(共15题,共30分) 第1题 关于C++类和对象的说法,错误的是( )。 A:在C++中,一切皆对象,即便是字面量如整数5等也是对象 B:在C++中,可以自定义新的类,并实例化为新的对象 C:在C++中,…
最新文章