这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32的HAL库实现自定义延时函数delayus(),文末附代码

共10条 1/1 1 跳转至

STM32的HAL库实现自定义延时函数delayus(),文末附代码

高工
2022-10-02 11:08:57     打赏

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

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

image.png

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

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

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

image.png

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

image.png

    配置外部高速时钟。

image.png

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

image.png

image.png

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

image.png

    激活TIM7,设置如下:

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

  • 计数模式为向上

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

image.png

    生成代码。

image.png

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

image.png

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

image.png

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

image.png

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

image.png

    编译代码。

image.png

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




关键词: STM32     HAL库     delay    

高工
2022-10-02 11:18:41     打赏
2楼

大家国庆节快乐


专家
2022-10-02 12:00:55     打赏
3楼

感谢分享


专家
2022-10-02 12:50:20     打赏
4楼

参考和学习,很实用,好产品,多用


专家
2022-10-02 20:01:08     打赏
5楼

感谢分享


院士
2022-10-02 21:48:59     打赏
6楼

学习


专家
2022-10-03 01:34:44     打赏
7楼

感谢楼主的分享,很实用了。


高工
2022-10-03 03:31:23     打赏
8楼

感谢楼主的分享,很实用了。


专家
2022-10-03 07:56:58     打赏
9楼

感谢分享


工程师
2023-07-19 10:51:44     打赏
10楼

感谢分享


共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]