STM32 systick HAL库 得到微秒延时

日常使用,有很多传感器和时序是需要微妙延时的,如何使用精准微妙延时呢?其一:可以使用while延时,只适合准确度不高的情况,其二:滴答定时器实现

SysTick是stm32系列单片机基本都有的外设,它是一个24位的倒计数定时器,标准库的滴答定时器可以有毫秒、微妙延时,但是HAL库只有 HAL_Delay();是一个毫秒延时。下面记录一下我的移植过程。

  1. 根据标准库的滴答定时器例程的Systick.c /Systick.h 改写而来。把这两个文件拷到我们HAL工程下,并添加到工程中。
    在这里插入图片描述

  2. 首先在头文件中定义HAL库的滴答结构体;
    在这里插入图片描述

  3. 为了避免结构体冲突,我改写了结构体名,和初始化函数名。重新定义定时器基地址:
    在这里插入图片描述

  4. 再定义一下一会用到的变量类型别名:使用宏定义也可以,不定义直接使用HAL库里的类型名也可以。
    在这里插入图片描述

  5. 改写滴答定时器初始化函数:
    在这里插入图片描述

  6. 改写微秒延时函数:改动不大,主要是”SysTick_CTRL_ENABLE_Msk“没有定义,直接赋值吧
    在这里插入图片描述

  7. 改写毫秒延时:
    在这里插入图片描述

  8. 重新封装HAL_Delay() 和HAL_InitTick(),由于HAL用的弱定义,方便用户直接定义函数,这里相当于直接替换了。
    在这里插入图片描述

  9. 主函数中把头文件声明一下:在这里插入图片描述

  10. 在main中,HAL_Init()里有滴答定时器初始化:
    List item

在这里插入图片描述

如果编译没有错误,点击HAL_InitTick();右键是可以直接跳到我们刚刚在SysTick.c中定义的HAL_InitTick()函数的。同样,点击HAL_Delay()也可以跳到刚刚封装的函数。
在这里插入图片描述
在这里插入图片描述

  • 说明初始化函数封装成功,测试
    在这里插入图片描述
    也没有问题。移植成功。有条件可以试试delay_us();应该也没有问题;
  • 需要注意,如果使用了FreeRTOS,还是需要用HAL自带的初始化函数,因为系统时基使用的滴答定时器,里面开启了系统节拍中断,系统延时必须改为其他的定时器,比如TIM2,这时需要毫秒延时就需要从这个定时器下手了。
  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值