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
    +关注

    关注

    2270

    文章

    10896

    浏览量

    355774
  • 定时器
    +关注

    关注

    23

    文章

    3246

    浏览量

    114741
  • 延时函数
    +关注

    关注

    0

    文章

    25

    浏览量

    10018
  • HAL库
    +关注

    关注

    1

    文章

    121

    浏览量

    6220

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

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

收藏 人收藏

    评论

    相关推荐

    STM32CUBEMX(5)--自定义红外NEC解码,定时器TIM捕获方式

    */ HAL_TIM_Base_Start_IT(&htim1);//启动定时器 HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_2);//
    发表于 09-05 16:19

    EtherCAT运动控制PT/PVT实现用户自定义轨迹规划

    EtherCAT运动控制PT/PVT实现用户自定义轨迹规划。
    的头像 发表于 08-15 11:49 623次阅读
    EtherCAT运动控制<b class='flag-5'>器</b>PT/PVT<b class='flag-5'>实现</b>用户<b class='flag-5'>自定义</b>轨迹规划

    如何在IDF框架中使用自定义的静态和动态

    基于商业需要,我们需要在 ESP-IDF v4.0-rc 这个版本的IDF中开发与使用自定义,有如下问题请协助: 1如何利用IDF框架编写自定义静态和动态
    发表于 06-25 07:57

    ESP32如何使用中的HF相关函数发送自定义AT指令?

    请问如何使用中的HF相关函数发送自定义AT指令?
    发表于 06-17 07:43

    如何使用定时器写一个延时函数

    不用中断,就是单纯一个用作延时函数,写了一个下午也没搞明白,可能我理解出错了 void delay_us(int us) { timer_config_t
    发表于 06-14 06:03

    HarmonyOS开发案例:【 自定义弹窗】

    基于ArkTS的声明式开发范式实现了三种不同的弹窗,第一种直接使用公共组件,后两种使用CustomDialogController实现自定义弹窗
    的头像 发表于 05-16 18:18 1354次阅读
    HarmonyOS开发案例:【 <b class='flag-5'>自定义</b>弹窗】

    TSMaster 自定义 LIN 调度表编程指导

    LIN(LocalInterconnectNetwork)协议调度表是用于LIN总线通信中的消息调度的一种机制,我们收到越来越多来自不同用户希望能够通过接口实现自定义LIN调度表的需求。所以
    的头像 发表于 05-11 08:21 660次阅读
    TSMaster <b class='flag-5'>自定义</b> LIN 调度表编程指导

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

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

    HarmonyOS开发实例:【自定义Emitter】

    使用[Emitter]实现事件的订阅和发布,使用[自定义弹窗]设置广告信息。
    的头像 发表于 04-14 11:37 997次阅读
    HarmonyOS开发实例:【<b class='flag-5'>自定义</b>Emitter】

    鸿蒙ArkUI实例:【自定义组件】

    组件是 OpenHarmony 页面最小显示单元,一个页面可由多个组件组合而成,也可只由一个组件组合而成,这些组件可以是ArkUI开发框架自带系统组件,比如 `Text` 、 `Button` 等,也可以是自定义组件,本节笔者简单介绍一下自定义组件的语法规范。
    的头像 发表于 04-08 10:17 632次阅读

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

    开启定时器TIM7,是为了写延时函数HAL_Delay_us()。具体过程请移步此文:STM32的HAL
    发表于 03-26 14:19 2179次阅读
    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 1252次阅读

    基于YOLOv8实现自定义姿态评估模型训练

    Hello大家好,今天给大家分享一下如何基于YOLOv8姿态评估模型,实现自定义数据集上,完成自定义姿态评估模型的训练与推理。
    的头像 发表于 12-25 11:29 2838次阅读
    基于YOLOv8<b class='flag-5'>实现</b><b class='flag-5'>自定义</b>姿态评估模型训练

    博途用户自定义的使用

    博途官方提供了很多,比如:基本函数库、通信、安全、驱动等等,用户可以使用中的
    的头像 发表于 12-25 10:08 918次阅读
    博途用户<b class='flag-5'>自定义</b><b class='flag-5'>库</b>的使用