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

STM32中的计时与延时

前言

在裸机开发中,延时作为一种规定循环周期的方式经常被使用,其中尤以HAL库官方提供的HAL_Delay为甚。刚入门的小白可能会觉得既然有官方提供的延时函数,而且精度也还挺好,为什么不用呢?实际上HAL_Delay中有不少坑,而这些也只是HAL库中无数坑的其中一些。想从坑里跳出来还是得加强外设原理的学习和理解,切不可只依赖HAL库。

除了延时之外,我们在开发中有时也会想要确定某段程序的耗时,这就需要计时,并且经常是us为单位的计时。

本文将介绍2种延时的方法与1种计时的方法,其中介绍延时的HAL_Delay时会讲解这个函数的坑在哪里,以供参考。

2种延时方法


直接定义一个变量,然后while循环让其自增或自减到指定值这种方式虽然也可以达到延时的效果,但可控性较差,这里不再赘述。

下文介绍的2种延时方法从原理上来说都是依靠定时器中的计数器。开启定时器后,计数器会按照输入定时器的频率不断自增或自减,知道了定时器的频率也就知道了计数器+1或-1代表了多长时间。

定时器结构图
定时器结构图

HAL_Delay

HAL_Delay解析

HAL_Delay使用STM32内部的系统时钟SysTick中的计数器。并使用Systick计时中断来进行精确计时。

/*** @brief This function provides minimum delay (in milliseconds) based*        on variable incremented.* @note In the default implementation , SysTick timer is the source of time base.*       It is used to generate interrupts at regular time intervals where uwTick*       is incremented.* @note This function is declared as __weak to be overwritten in case of other*       implementations in user file.* @param Delay  specifies the delay time length, in milliseconds.* @retval None*/
__weak void HAL_Delay(uint32_t Delay)
{uint32_t tickstart = HAL_GetTick();uint32_t wait = Delay;/* Add a freq to guarantee minimum wait */if 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 多旅行商问题:鹈鹕优化算法(Pelican Optimization Algorithm,POA)求解多仓库多旅行商问题MD-MTSP(提供Matlab代码)
  • 1. 如何在Java中连接MySQL数据库?请解释使用JDBC连接的步骤。
  • 模拟+分类讨论,LeetCode 2332. 坐上公交的最晚时间
  • 前后端分离Vue美容店会员信息管理系统o7grs
  • Kubernetes中pod版本回滚相关的命令?
  • ant-design表格自动合并相同内容的单元格
  • 路由原理介绍
  • Springboot错误日志切面,找到post请求体被消费后的数据
  • Unity-Transform类-缩放和看向
  • CTFHub技能树-信息泄露-HG泄漏
  • linux-硬件与设备管理-硬件信息查看
  • 信息安全工程师(6)网络信息安全现状与问题
  • TI AM62X Secure Boot 流程简述
  • Python计算机视觉第十章-OpenCV
  • 开源项目 face parsing 人脸区域分割 人像区域分割 人脸分割 人像区域分割 BiSeNet
  • [数据结构]链表的实现在PHP中
  • Android优雅地处理按钮重复点击
  • CSS3 变换
  • ECS应用管理最佳实践
  • gcc介绍及安装
  • Git初体验
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • mysql外键的使用
  • V4L2视频输入框架概述
  • vue-cli3搭建项目
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 笨办法学C 练习34:动态数组
  • 动态规划入门(以爬楼梯为例)
  • 机器学习学习笔记一
  • 基于axios的vue插件,让http请求更简单
  • 看域名解析域名安全对SEO的影响
  • 码农张的Bug人生 - 初来乍到
  • 面试遇到的一些题
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 我的业余项目总结
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ‌分布式计算技术与复杂算法优化:‌现代数据处理的基石
  • # 职场生活之道:善于团结
  • (bean配置类的注解开发)学习Spring的第十三天
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (五)Python 垃圾回收机制
  • (一)u-boot-nand.bin的下载
  • (转)shell中括号的特殊用法 linux if多条件判断
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 设计模式初探
  • .Net6使用WebSocket与前端进行通信
  • @PreAuthorize注解
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • @开发者,一文搞懂什么是 C# 计时器!
  • [ABC275A] Find Takahashi 题解
  • [ANT] 项目中应用ANT
  • [C#] 基于 Token 的鉴权与签名机制详解 接口对接鉴权 token、sign(a=1b=2c=3d=4)、Base64、参数加密、MD5
  • [C#C++]类CLASS
  • [C]整形提升(转载)