单片机
返回首页

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

2024-03-18 来源:elecfans

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

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

3d7cb228-2f57-11ed-ba43-dac502259ad0.png

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

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

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

3d9ce480-2f57-11ed-ba43-dac502259ad0.png

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

3db61ea0-2f57-11ed-ba43-dac502259ad0.png

配置外部高速时钟。

3dcaba90-2f57-11ed-ba43-dac502259ad0.png

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

3ddfd0e2-2f57-11ed-ba43-dac502259ad0.png

3df15600-2f57-11ed-ba43-dac502259ad0.png

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

3e05c11c-2f57-11ed-ba43-dac502259ad0.png

激活TIM7,设置如下:

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

计数模式为向上

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

3e20df74-2f57-11ed-ba43-dac502259ad0.png

生成代码。

3e382fa8-2f57-11ed-ba43-dac502259ad0.png

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

3e4a4242-2f57-11ed-ba43-dac502259ad0.png

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

3e64afb0-2f57-11ed-ba43-dac502259ad0.png

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

3e741900-2f57-11ed-ba43-dac502259ad0.png

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

3e8d02ee-2f57-11ed-ba43-dac502259ad0.png

编译代码。

3ead946e-2f57-11ed-ba43-dac502259ad0.png

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


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • 使用ESP8266从NTP服务器获取时间并在OLED显示器上显示

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章