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

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

[复制链接]
请叫我小阳 发布时间:2019-8-14 23:16
先贴出延时函数
# D" b( x2 d: ?& ^: L
  1. /*****************************************************************% q; }# l/ |4 I+ K$ _% g' A7 C2 b; C
  2. * 基于STM32F0 HAL的微秒延时函数
      h9 }! L- h2 t: f
  3. * @功能:实现US级延时
    ! |3 h, X/ I  c( P, j% c
  4. * @注意:精准延时范围:2~999US0 z+ f" W8 e, z+ O6 y8 I) b
  5. *        2019-07-03        Designed By XiaoYang  http://www.pypyn.com- R. S3 W. U* e7 N
  6. ******************************************************************/
    % Y& d, g. N4 q7 B4 F
  7. uint32_t CFG_VAL = 0;
    " V: X. F, `0 F+ z2 @& B+ @/ B
  8. void HAL_Delay_US(__IO uint32_t Delay)
    8 s. W) ^$ W: n$ E1 z
  9. {
    # |- E/ z. Q- Z/ p
  10.   if(Delay < MAX_Delay_CNT && Delay > 1)
    # Z- r  T2 i' U$ J0 T
  11.   {
    3 U; X" F, j/ i: U  r( ^. b3 X+ O
  12.     uint32_t wait = SysTick->LOAD - ((Delay - 1) * CFG_VAL);
    $ T8 c  X' m4 a% ?7 ^7 C4 N8 r. c/ V9 ~
  13.              //CFG_VAL = HAL_RCC_GetHCLKFreq()/1000U/1000U))6 B2 y! \! Q; X5 r
  14.              //计算出等待1US需要的计数器值4 @9 B8 c& B8 J5 H* A2 g* I( a3 a
  15.     SysTick->VAL=0UL;                        //重置SysTick计数器,计数器为向下计数
    ! p) Z( O  [3 t& j/ \3 s* c! i( P
  16.     while(wait < (SysTick->VAL));        //等待时间到达' J. C- G4 k6 U% B, R
  17.   }/ S" ?8 k9 G- A  S0 `& o8 }. [
  18. }
复制代码
展示一下效果
; C( Q* ?* Q- q& w' l
  1.   HAL_Delay_US(50);
    # p0 v" U$ H8 W8 @- r- I' R9 v
  2.                 LED_GPIO_Port->ODR ^= LED_Pin;
复制代码
IMG_20190814_225917.jpg IMG_20190814_225812.jpg IMG_20190814_225853.jpg 8 o! G& B/ I  \9 Q9 z. |+ A; B
+ \  y" A% S9 j% Q# r+ m
IMG_20190814_225923.jpg
! }0 O3 q. W+ d板子使用的是STM32F030F4。
  a) F- R6 `8 T  W+ v$ i( v User_Drivers.zip (946 Bytes, 下载次数: 16)
收藏 评论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:31. h6 [2 z! F' M3 N
这么多计时器中断可用而不用, 非要耗尽CPU的资源去计时, 这不是一个码农该做的事 ...

$ Q6 I' U5 s! j# ]0 {( `4 b哈哈,完全赞同
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  f! c* L) c- O; e; ^9 {. a
不建议这么做。本身这个芯片最高才48MHZ,进出中断就很十几个周期。所以几个微秒中断就耗费了大多数时钟周 ...

; E* Z( r* d% s. J  Q并不是通过systick中断去做定时,而是通过等待systick定时计数器的计数值达到目标值的方法实现。us级太短了,进中断完全是不明智的选择,我这个想法只能用在一些很简单的项目上。
waiman 回答时间:2019-9-9 00:05:48
不需要清零SysTick->VAL 直接判断VAL的时差即可

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版