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

stm32程序从标准库移植到hal库的时候,会发现hal库中只有一个毫秒级延时函数hal_delay(),而没有微秒级延时delay_us(),本文就在hal库中用定时器实现这个delay_us()。
如下图,找到hal_delay()函数定义的地方,发现这个函数有__weak标识,是一个弱化函数,可以被重写。
由于hal库许多地方都使用了hal_delay()函数,为了避免惹麻烦建议不重写,可以用定时器自己写一个延时函数。
开发软件用的stm32cubeide,此cube软件的使用方法可以参考这篇文章:stm32外部中断实例。
项目设置,勾选后每个外设的源文件.c、头文件.h分别成双出现。
我用的是isp编程,选择的是serial wire。
配置外部高速时钟。
为了观察效果,开一个led,它在pc0管脚,低电平点亮。
本实例用到了tim7,它挂在apb1上,时钟为72mhz。
激活tim7,设置如下:
预分频psc为71,分频后tim7时钟为72/(71+1)=1mhz
计数模式为向上
计数周期为1,就是说定时器一个周期后就溢出了,而定时器一个周期的时间是定时器时钟频率的倒数,1/1m,也就是1us。
生成代码。
在tim.c的用户代码区添加如下代码。
在tim.h的user code处添加如下引用代码,其中hal_delay_us()是微秒级延时函数,hal_delay_ms()是毫秒级延时函数。
main.c中添加如下代码,测试效果。
上面代码连续用了13个延时函数,是为了凑够1秒方便观察。另外延时函数的参数是uint16_t,无符号短整型,数值范围为0~65535,数值超限会报错,如下图。
编译代码。
下载到开发板可以看到led每秒亮一次,stm32cubeide软件生成hex文件的方式,请移步此文:stm32单片机中hex、bin文件的区别与应用。


比特大陆挺进AI芯片领域 欲与英特尔、英伟达、AMD比肩
山东铁塔建立健全“大服务”体系,积极推动5G网络建设和5G应用落地
手机选4G运存还是6G运存?在这个性能过剩的时代
LINUX最全的命令行详细概述
影像仪光学3D扫描测头成像清晰,快速实现尺寸的精准测量
在HAL库中用定时器实现自定义延时函数delay_us()
浴室智能镜子带你享受智能卫浴时光
Facebook决定削减对机器学习和人工智能技术的投资
33KHZ 100W超声波振动筛换能器振子设计
与非门组成声光节拍器电路图
机场用无人机维护地面设备
全球机器人产业格局 中国工业机器人产业链
未来让机器人当大厨,给你炒菜做饭,期待吗
非晶硅光电池
电子屏幕对眼睛有哪些潜在的危害?
浅析Linux控制台、终端与shell之间的关系
阿尔法狗已逝?AI领域才刚刚开始
FPGA技术呈现的4个主要的发展动向
绕线型片式电感应用噪声变大的原因
一阶低通滤波器的截止频率