请选择 进入手机版 | 继续访问电脑版
搜索
查看: 241|回复: 8

[分享] 基于HAL库的微秒级精准延时函数

[复制链接]

该用户从未签到

2

主题

7

帖子

5

蝴蝶豆

初级会员

最后登录
2019-11-3
发表于 2019-8-14 23:16:15 | 显示全部楼层 |阅读模式
先贴出延时函数
  1. /*****************************************************************
  2. * 基于STM32F0 HAL的微秒延时函数
  3. * @功能:实现US级延时
  4. * @注意:精准延时范围:2~999US
  5. *        2019-07-03        Designed By XiaoYang  http://www.pypyn.com
  6. ******************************************************************/
  7. uint32_t CFG_VAL = 0;
  8. void HAL_Delay_US(__IO uint32_t Delay)
  9. {
  10.   if(Delay < MAX_Delay_CNT && Delay > 1)
  11.   {
  12.     uint32_t wait = SysTick->LOAD - ((Delay - 1) * CFG_VAL);
  13.              //CFG_VAL = HAL_RCC_GetHCLKFreq()/1000U/1000U))
  14.              //计算出等待1US需要的计数器值
  15.     SysTick->VAL=0UL;                        //重置SysTick计数器,计数器为向下计数
  16.     while(wait < (SysTick->VAL));        //等待时间到达
  17.   }
  18. }
复制代码
展示一下效果
  1.   HAL_Delay_US(50);
  2.                 LED_GPIO_Port->ODR ^= LED_Pin;
复制代码
IMG_20190814_225917.jpg IMG_20190814_225812.jpg IMG_20190814_225853.jpg

IMG_20190814_225923.jpg
板子使用的是STM32F030F4。
User_Drivers.zip (946 Bytes, 下载次数: 2)
回复

使用道具 举报

该用户从未签到

19

主题

1704

帖子

307

蝴蝶豆

论坛元老

最后登录
2019-11-21
发表于 2019-8-22 22:24:18 | 显示全部楼层
大神,现在解决了和HAL_Delay()的冲突了吗?
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

712

帖子

702

蝴蝶豆

版主

最后登录
2019-12-12
发表于 2019-8-23 16:53:12 | 显示全部楼层
不建议这么做。本身这个芯片最高才48MHZ,进出中断就很十几个周期。所以几个微秒中断就耗费了大多数时钟周期,所以精度并不高并影响其他程序运行。并且CUBE的HAL库是以原来的1MS中断为节拍的,更改后有些函数操作会不正常的。细微的时间考虑用定时器功能
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

220

帖子

170

蝴蝶豆

金牌会员

最后登录
2019-12-15
发表于 2019-8-25 07:31:31 | 显示全部楼层
这么多计时器中断可用而不用, 非要耗尽CPU的资源去计时, 这不是一个码农该做的事
回复 支持 反对

使用道具 举报

该用户从未签到

14

主题

256

帖子

2

蝴蝶豆

金牌会员

最后登录
2019-10-8
发表于 2019-8-30 16:13:02 | 显示全部楼层
edmundlee 发表于 2019-8-25 07:31
这么多计时器中断可用而不用, 非要耗尽CPU的资源去计时, 这不是一个码农该做的事 ...

哈哈,完全赞同
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

960

帖子

176

蝴蝶豆

论坛元老

最后登录
2019-10-28
发表于 2019-8-30 18:01:37 | 显示全部楼层
SYSTICK定时器慎用,在HAL库中一般默认为mS级的基准时钟发生器,不能随便改动的。其实可以用其他的定时器来定时1uS, 但要把函数调用的时间和运行其他设置等的时间要去掉,特别是短时间的延迟,也达不到非常精确的程度。
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

397

帖子

103

蝴蝶豆

论坛元老

最后登录
2019-12-16
发表于 2019-8-30 18:20:19 | 显示全部楼层
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

7

帖子

5

蝴蝶豆

初级会员

最后登录
2019-11-3
 楼主| 发表于 2019-9-8 18:23:36 | 显示全部楼层
butterflyspring 发表于 2019-8-23 16:53
不建议这么做。本身这个芯片最高才48MHZ,进出中断就很十几个周期。所以几个微秒中断就耗费了大多数时钟周 ...

并不是通过systick中断去做定时,而是通过等待systick定时计数器的计数值达到目标值的方法实现。us级太短了,进中断完全是不明智的选择,我这个想法只能用在一些很简单的项目上。
回复 支持 反对

使用道具 举报

该用户从未签到

13

主题

148

帖子

31

蝴蝶豆

金牌会员

最后登录
2019-12-16
发表于 2019-9-9 00:05:48 | 显示全部楼层
不需要清零SysTick->VAL 直接判断VAL的时差即可
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2019-12-16 10:55 , Processed in 0.194856 second(s), 23 queries , MemCache On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表