在HAL库中用定时器实现自定义延时函数delay_us()

发布者:心愿实现最新更新时间:2024-03-18 来源: elecfans关键字:HAL库  定时器 手机看文章 扫描二维码
随时随地手机看文章

STM32程序从标准库移植到HAL库的时候,会发现HAL库中只有一个毫秒级延时函数HAL_Delay(),而没有微秒级延时delay_us(),本文就在HAL库中用定时器实现这个delay_us()。

如下图,找到HAL_Delay()函数定义的地方,发现这个函数有__weak标识,是一个弱化函数,可以被重写。

3d7cb228-2f57-11ed-ba43-dac502259ad0.png?imageView2/2/w/1000

由于HAL库许多地方都使用了HAL_Delay()函数,为了避免惹麻烦建议不重写,可以用定时器自己写一个延时函数。

开发软件用的STM32CubeIDE,此Cube软件的使用方法可以参考这篇文章:STM32外部中断实例。

项目设置,勾选后每个外设的源文件.c、头文件.h分别成双出现。

3d9ce480-2f57-11ed-ba43-dac502259ad0.png?imageView2/2/w/1000

我用的是ISP编程,选择的是Serial Wire。

3db61ea0-2f57-11ed-ba43-dac502259ad0.png?imageView2/2/w/1000

配置外部高速时钟。

3dcaba90-2f57-11ed-ba43-dac502259ad0.png?imageView2/2/w/1000

为了观察效果,开一个LED,它在PC0管脚,低电平点亮。

3ddfd0e2-2f57-11ed-ba43-dac502259ad0.png?imageView2/2/w/1000

3df15600-2f57-11ed-ba43-dac502259ad0.png?imageView2/2/w/1000

本实例用到了TIM7,它挂在APB1上,时钟为72MHz。

3e05c11c-2f57-11ed-ba43-dac502259ad0.png?imageView2/2/w/1000

激活TIM7,设置如下:

预分频PSC为71,分频后TIM7时钟为72/(71+1)=1MHz

计数模式为向上

计数周期为1,就是说定时器一个周期后就溢出了,而定时器一个周期的时间是定时器时钟频率的倒数,1/1M,也就是1us。

3e20df74-2f57-11ed-ba43-dac502259ad0.png?imageView2/2/w/1000

生成代码。

3e382fa8-2f57-11ed-ba43-dac502259ad0.png?imageView2/2/w/1000

在tim.c的用户代码区添加如下代码。

3e4a4242-2f57-11ed-ba43-dac502259ad0.png?imageView2/2/w/1000

在tim.h的user code处添加如下引用代码,其中HAL_Delay_us()是微秒级延时函数,HAL_Delay_ms()是毫秒级延时函数。

3e64afb0-2f57-11ed-ba43-dac502259ad0.png?imageView2/2/w/1000

main.c中添加如下代码,测试效果。

3e741900-2f57-11ed-ba43-dac502259ad0.png?imageView2/2/w/1000

上面代码连续用了13个延时函数,是为了凑够1秒方便观察。另外延时函数的参数是uint16_t,无符号短整型,数值范围为0~65535,数值超限会报错,如下图。

3e8d02ee-2f57-11ed-ba43-dac502259ad0.png?imageView2/2/w/1000

编译代码。

3ead946e-2f57-11ed-ba43-dac502259ad0.png?imageView2/2/w/1000

下载到开发板可以看到LED每秒亮一次,STM32CubeIDE软件生成hex文件的方式,请移步此文:STM32单片机中Hex、Bin文件的区别与应用。


关键字:HAL库  定时器 引用地址:在HAL库中用定时器实现自定义延时函数delay_us()

上一篇:开启Cache后UART无法发送新数据
下一篇:基于意法半导体Arm Cortex-M7 MCU STM32H743 的语音辨识解决方案

推荐阅读最新更新时间:2026-03-21 17:10

STM32定时器中断详解(HAL库实战讲解)
1、定时器简单介绍 以STM32F103C8T6中几个定时器为例: TIM1:这是一个高级定时器,不仅具备基本的定时中断功能,还拥有内外时钟源选择、输入捕获、输出比较、编码器接口以及主从触发模式等多种功能。这使得TIM1能够适用于各种复杂的应用场景,为开发者提供强大的时间控制和信号处理能力。 TIM2、TIM3和TIM4:这些是通用定时器,同样具有定时功能,但在功能上与高级定时器有所区别。通用定时器通常用于实现一些基本的定时任务,如LED闪烁、脉冲宽度测量等。 每个定时器都由一个**16位计数器、预分频器和自动重装寄存器的时基单元组成。**预分频器可以对时钟进行分频,计数器则对预分频后的时钟进行计数。当计数器的值达到设定值时,
[单片机]
STM32<font color='red'>定时器</font>中断详解(<font color='red'>HAL库</font>实战讲解)
STM32F1系列基本定时器HAL库配置
时钟的概念了解完就趁热打铁进行定时器的简单讲解,定时器的操作是十分重要的,他不仅可以用于计数/定时(两者其实一个道理),还可以生成PWM,输入捕获等等,高级定时器可以用于工业电机上的有关操作。所以,我们专门讲解一波基本定时器,并用它做一个闪烁灯小实验。 定时器简介 在STM32F1上,常规定时器分为三种定时器:高级,通用,基本; 高级定时器的功能涵盖通用定时器,通用定时器功能涵盖基本定时器 以基本定时器实现计数功能,这里说的并不准确,应该说是定时功能, 定时是对周期固定的脉冲信号进行计数如APB(MCU的外设时钟APB),而计数是对周期不确定(可能固定也可能不固定)的脉冲信号进行计数。 更为深入的比喻:就是水杯中装水的
[单片机]
STM32F1系列基本<font color='red'>定时器</font><font color='red'>HAL库</font>配置
STM32基本定时器 HAL库
1.定时器分类 STM32F1系列中,除了互联型的产品,共有8个定时器,分为基本定时器、通用定时器和高级定时器。 基本定时器是一个16位只能向上计数的定时器,只能定时,没有外部IO。 通用定时器是一个16位可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,每个定时器有四个外部IO。 高级定时器是一个16位可以向上/下计数的定时器,可以定时,可以输出比较,可以输入捕捉,还可以有三相电机互补输出信号,每个定时器有8个外部IO。 2.基本定时器功能框图 时钟源:定时器时钟TIMxCLK(内部时钟CK_INT),是经APB1预分频器后分频提供,APB1预分频系数为1,则频率不变,否则*2; 计数器时钟:定
[单片机]
STM32基本<font color='red'>定时器</font> <font color='red'>HAL库</font>
STM32 HAL库学习系列第5篇 定时器TIM---编码器接口模式配置
cube基本配置,外设开启编码器,串口2 -------------------------------------------------------------------------------------------------------------------------- 错误:error: #20: identifier TIM_ICPOLARITY_BOTHEDGE is undefined 意思是,高级、通用定时器不能用BothEdge,只有基本定时器才能用BothEdge F4系列 /* 编码器初始化及使能编码器模式 */ ENCODER_TIMx_Init(); HA
[单片机]
STM32 <font color='red'>HAL库</font>学习系列第5篇 <font color='red'>定时器</font>TIM---编码器接口模式配置
HAL库教程11:定时器的缓冲功能与影子寄存器
  在STM32的定时器中,TIMx_PSC、 TIM_ARR两个寄存器加上捕捉比较模块中TIMX_CCR寄存器,它们都可以动态修改。不过他们的修改和生效可能不在同一个时刻,或者说,修改过后立即生效的话可能会带来潜在问题,这里便引入了预装寄存器及影子寄存器的概念。要记住一点,真正在TIMER模块中起作用的是影子寄存器。(中文手册P393)   实际上,STM32定时器中,CNT与ARR或CCR的比较,都是比较是否相等,而不是大小!!比如此时CNT已经到了5,ARR 本来是9,现在突然变成4了,就没有相等了,CNT会数到最大值,2^32 或 2^16次方,再从零开始。   默认情况下,影子寄存器用户没有办法直接读取或修改,用
[单片机]
<font color='red'>HAL库</font>教程11:<font color='red'>定时器</font>的缓冲功能与影子寄存器
[HAL库学习之路]7.定时器中断
一、Pinout 二、Clock Configuration 三、Configuration 定时器溢出时间 Tout=((arr+1)∗(psc+1))/TclkTout=((arr+1)∗(psc+1))/Tclk 四、Generate Code 代码 定时器溢出时间为500ms,500ms翻转一次LED状态 int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration-------------------------------------------------------
[单片机]
STM32 HAL库 MODBUS-RTU 串口通信
现行市场上的MODBUS实现都是官方标准的某种变体。不同的供应商设备之间可能无法正确的通信。我根据自己的需求用 MODBUS -RTU协议写了一个通过串口通信的实现。 MODBUS协议的介绍可以参考这篇 https://www.bilibili.com/opus/546416352263391792 串口的配置可以参考之前写的这两篇 https://www.bilibili.com/opus/489432912320458041 https://www.bilibili.com/opus/489466232682393593 其中可以更改的部分中 本从机的地址码是0x01 功能1的功能码是0x78(这是MODB
[单片机]
【STM32 HAL库】GPIO:按键和LED
文章内容偏向HAL库的移植和使用,以个人观点及了解为主,若与事实不符,则以www.st.com、www.stmcu.org.cn等平台为准。 使用的软件: VSCode(1.36版,带C/C++ IntelliSense插件) Keil MDK(5.26版) 芯片:STM32H743ZIT6(Nucleo-H743平台,B-01版) 所使用的库:STM32Cube_FW_H7_V1.3.0,下载地址:https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-softw
[单片机]
【STM32 <font color='red'>HAL库</font>】GPIO:按键和LED
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved