0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

STM32嵌入式开发 来源:ARM与嵌入式 作者:保生 2022-09-21 10:33 次阅读

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文件的区别与应用。



审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2239

    文章

    10669

    浏览量

    348705
  • 定时器
    +关注

    关注

    23

    文章

    3146

    浏览量

    112028
  • 延时函数
    +关注

    关注

    0

    文章

    25

    浏览量

    9966
  • HAL库
    +关注

    关注

    1

    文章

    112

    浏览量

    5873

原文标题:STM32的HAL库实现自定义延时函数delay_us(),文末附代码

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    HAL开启定时器中断时会卡死程序的原因?

    当开启定时器中断时候,开启定时器时会卡死程序,调试,全速运行卡死-HAL_TIM_Base_Start_IT函数,单步调试发现卡死
    发表于 04-16 07:12

    STM32蜂鸣器音乐播放实例教程

    开启定时器TIM7,是为了写延时函数HAL_Delay_us()。具体过程请移步此文:STM32的HAL
    发表于 03-26 14:19 438次阅读
    STM32蜂鸣器音乐播放实例教程

    STM32L0使用延时函数使PWM波形移相,延时函数不起作用的原因?

    ); delay_us(20); HAL_TIM_PWM_Start( htim2, TIM_CHANNEL_2); 但是定时器2的2通道输出PWM波并没有发生延时变化,这是为什么?
    发表于 03-21 06:23

    AvR单片机1us延时函数数怎么写

    在编写AvR单片机的1us延时函数之前,我们首先需要了解几个关键概念。 单片机的延时函数是通过控制器在特定的时间间隔内执行一系列的指令来
    的头像 发表于 12-26 14:02 381次阅读

    博途用户自定义库的使用

    博途官方提供了很多库,比如:基本函数库、通信库、安全库、驱动库等等,用户可以使用库中的函数/函数块来完成具体的控制任务。除了官方的库,我们也可以创建自己的库(用户自定义库)。比如,把项
    的头像 发表于 12-25 10:08 286次阅读
    博途用户<b class='flag-5'>自定义</b>库的使用

    stm32delay函数怎么写

    STM32的延时函数可以使用SysTick定时器实现。SysTick定时器是一个24位的计数器,它可以在每个时钟周期自动减少计数值,直到计
    的头像 发表于 12-21 17:53 721次阅读

    HAL库常用函数汇总

    1,系统函数HAL_Delay原型:voidHAL_Delay(uint32_tDelay);作用:利用滴答定时器生成的系统延迟函数参数:
    的头像 发表于 11-29 08:00 651次阅读
    <b class='flag-5'>HAL</b>库常用<b class='flag-5'>函数</b>汇总

    OFF延时和ON延时定时器的区别

    机械定时继电器和延时定时器用于延时电路控制触点的打开或闭合。它们的工作方式与控制继电器类似,主要区别在于定时继电器中的特定触点设计为在线圈通
    的头像 发表于 11-21 17:50 904次阅读

    STM32如何使用定时器实现微秒(us)级延时

    STM32如何使用定时器实现微秒(us)级延时? 在STM32微控制器中,可以使用定时器实现微秒
    的头像 发表于 11-06 11:05 2939次阅读

    延时函数有几个指令周期?

    大侠们,使用51单片时候,使用的12M的晶振,使用延时函数 void delay(int i) { while(i--); } 这个函数
    发表于 11-06 06:53

    STM32基于HAL实现微秒延时

    用做了库函数的超时定时器,使用的地方非常多,自己修改代码使用嘀嗒定时器的话就会引起错乱,所以此时就需要自己实现一个us级别
    的头像 发表于 10-25 15:31 1667次阅读
    STM32基于<b class='flag-5'>HAL</b>库<b class='flag-5'>实现</b>微秒<b class='flag-5'>延时</b>

    OpenHarmony自定义构建函数:@Builder装饰

    开始,该装饰支持ArkTS卡片中使用。 装饰器使用说明 自定义组件内自定义构建函数 定义的语
    发表于 09-26 16:36

    labview超快自定义控件制作和普通自定义控件制作

    labview超快自定义控件制作和普通自定义控件制作
    发表于 08-21 10:32 5次下载

    使用C++ sort函数对vector进行自定义排序

    今天在学一些C++ STL容器,看到sort函数允许自定义排序规则,小小地实操了一下。
    的头像 发表于 07-22 10:12 1046次阅读

    基于STM32F207介绍4种不同方式实现延时函数

    单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms()
    的头像 发表于 07-11 15:37 718次阅读
    基于STM32F207介绍4种不同方式<b class='flag-5'>实现</b>的<b class='flag-5'>延时</b><b class='flag-5'>函数</b>