STM32中的计时与延时

embedded/2024/9/25 19:22:39/

前言

在裸机开发中,延时作为一种规定循环周期的方式经常被使用,其中尤以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 

http://www.ppmy.cn/embedded/113631.html

相关文章

LCR 026

题目:LCR 026 解法一:线性表 将链表中所有元素加入数组中,创建两个指针,分别指向数组的头部和尾部,然后向中间遍历 public void reorderList(ListNode head) {if (head null || head.next null || head.next.next …

Semaphore UI --Ansible webui

1、安装python python下载地址 https://www.python.org/downloads/ 选好版本下载 wget https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tar.xz安装编译工具 sudo dnf groupinstall "Development Tools"安装依赖包 dnf install bzip2-devel ncurses-deve…

【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树

在安卓源码的设计中,将将屏幕分为了37层,不同的窗口将在不同的层级中显示。 对这一块的概念以及相关源码做了详细分析,整理出以下几篇。 【Android 13源码分析】WindowContainer窗口层级-1-初识窗口层级树 【Android 13源码分析】WindowCon…

linux 中gitee配置

文章目录 1.git安装2.git配置3.git和gitee账户建立ssh安全链接4.gitee管理代码使用4.1 git add .4.2 git commit4.3 git push 1.git安装 sudo apt-get update sudo apt-get install git检查一下git版本,看看是否安装成功 git --version2.git配置 下面两行代码配置…

双指针算法:快速解决问题的小技巧(Java代码实现)

“人的一生是短暂的,但如果卑鄙地过这短暂的一生,那就太长了。” 文章目录 前言文章有误敬请斧正 不胜感恩!双指针简介对撞指针快慢指针例题聪明的小羊肖恩神奇的数组盛最多的水 总结 前言 写在开始: 双指针算法是一种经典且高效…

保护您的隐私:隐藏 IP 地址的重要性

在当今的数字时代,我们的在线隐私和安全变得比以往任何时候都更加重要。浏览互联网时保护自己的一种方法是隐藏您的 IP 地址。 但是为什么要隐藏您的 IP 地址以及如何有效地做到这一点? 隐藏您的 IP 地址有助于保护您的在线匿名性。您的 IP 地址就像您的…

需要申请 TAC

需要申请 TAC? https://www.gsma.com/solutions-and-impact/industry-services/device-services/tac-allocation?langzh-hans 3GPP 要求所有可以连接到移动无线网络的设备类型都能通过 Type Allocation Code (TAC) 来识别,包括 IoT 设备、支付终端和联…

集群聊天服务器项目【C++】项目介绍和环境搭建

前言:学习一个基于C集群聊天服务器的项目,记录学习的内容和学习的过程。 1.项目介绍 在 Linux 环境下基于 muduo 开发的集群聊天服务器。实现新用户注册、用户登录、添加好友、添加群组、好友通信、群组聊天、保持离线消息等功能。 2.技术栈 Json序列…