请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于HAL库的微秒级精准延时函数

[复制链接]
请叫我小阳 发布时间:2019-8-14 23:16
先贴出延时函数; Q: O2 D5 B0 v! y( s7 J
  1. /*****************************************************************
    % s* w: A* y5 x$ ?; d" T
  2. * 基于STM32F0 HAL的微秒延时函数) J% v* e) e, o6 u3 b. j
  3. * @功能:实现US级延时0 m* a2 D3 P# i/ M7 R; B
  4. * @注意:精准延时范围:2~999US
    5 x6 a1 K" @; O% K. w
  5. *        2019-07-03        Designed By XiaoYang  http://www.pypyn.com. D" w: B8 z; X) U7 A; k
  6. ******************************************************************/
    # [: Y! e* s2 p0 v# T
  7. uint32_t CFG_VAL = 0;7 k. c2 T* _( b: x/ `$ E+ d
  8. void HAL_Delay_US(__IO uint32_t Delay)
    9 V# X% X1 n( y+ [9 h% G/ E1 h) K
  9. {- @6 X8 i) W6 K/ \& D
  10.   if(Delay < MAX_Delay_CNT && Delay > 1)
    6 v# L9 p& n! L7 {6 @: {7 C% R
  11.   {
    , H2 ]  T3 ~7 x
  12.     uint32_t wait = SysTick->LOAD - ((Delay - 1) * CFG_VAL);9 k7 |. U3 v$ o/ i) ~' i
  13.              //CFG_VAL = HAL_RCC_GetHCLKFreq()/1000U/1000U))
    . |* ?# U" {2 h9 o' B- y' k( y) g! x
  14.              //计算出等待1US需要的计数器值
    . T+ @0 y% v! Y$ i  L8 b
  15.     SysTick->VAL=0UL;                        //重置SysTick计数器,计数器为向下计数2 R# K1 ]3 l2 R, Q3 u/ u
  16.     while(wait < (SysTick->VAL));        //等待时间到达# o4 z8 e9 H' @
  17.   }
    + \; z2 b/ ^  h% q
  18. }
复制代码
展示一下效果& ]0 A; V% v/ w
  1.   HAL_Delay_US(50);
    - [1 e  G. B( q) S% M/ D
  2.                 LED_GPIO_Port->ODR ^= LED_Pin;
复制代码
IMG_20190814_225917.jpg IMG_20190814_225812.jpg IMG_20190814_225853.jpg ! L2 M' l; J) Z+ f! w% ]3 ]
% n' t3 A6 l9 i& W
IMG_20190814_225923.jpg ' e& o" f% ]1 f. Q2 X
板子使用的是STM32F030F4。( i/ ~. g5 l" q
User_Drivers.zip (946 Bytes, 下载次数: 15)
收藏 评论8 发布时间:2019-8-14 23:16

举报

8个回答
五哥1 回答时间:2019-8-22 22:24:18
大神,现在解决了和HAL_Delay()的冲突了吗?
butterflyspring 回答时间:2019-8-23 16:53:12
不建议这么做。本身这个芯片最高才48MHZ,进出中断就很十几个周期。所以几个微秒中断就耗费了大多数时钟周期,所以精度并不高并影响其他程序运行。并且CUBE的HAL库是以原来的1MS中断为节拍的,更改后有些函数操作会不正常的。细微的时间考虑用定时器功能
edmundlee 回答时间:2019-8-25 07:31:31
这么多计时器中断可用而不用, 非要耗尽CPU的资源去计时, 这不是一个码农该做的事
generalcircuits 回答时间:2019-8-30 16:13:02
edmundlee 发表于 2019-8-25 07:310 X9 M$ Y' B: P
这么多计时器中断可用而不用, 非要耗尽CPU的资源去计时, 这不是一个码农该做的事 ...

# o! d) ?7 e9 u哈哈,完全赞同
zhao.zhao 回答时间:2019-8-30 18:01:37
SYSTICK定时器慎用,在HAL库中一般默认为mS级的基准时钟发生器,不能随便改动的。其实可以用其他的定时器来定时1uS, 但要把函数调用的时间和运行其他设置等的时间要去掉,特别是短时间的延迟,也达不到非常精确的程度。
radio2radio 回答时间:2019-8-30 18:20:19
请叫我小阳 回答时间:2019-9-8 18:23:36
butterflyspring 发表于 2019-8-23 16:53  Z5 e( N* s' {' ?) q
不建议这么做。本身这个芯片最高才48MHZ,进出中断就很十几个周期。所以几个微秒中断就耗费了大多数时钟周 ...
5 \1 I- ?' o# n' t9 Z% @, }- G9 [6 d1 m
并不是通过systick中断去做定时,而是通过等待systick定时计数器的计数值达到目标值的方法实现。us级太短了,进中断完全是不明智的选择,我这个想法只能用在一些很简单的项目上。
waiman 回答时间:2019-9-9 00:05:48
不需要清零SysTick->VAL 直接判断VAL的时差即可

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版