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

【经验分享】stm32之HAL库实现us延时方法

[复制链接]
STMCU小助手 发布时间:2022-3-9 22:00
stm32之HAL库实现us延时方法
4 R" o% h8 m' x8 p! u. i  jHAL_Delay()源码为ms级别的延时如下:9 w' A6 q) |+ u4 a
1 J2 L% n' N5 @
  1. /**
    $ D/ a, U, T9 r- j4 j" A& e* F
  2.   * @brief This function provides accurate delay (in milliseconds) based 7 T; \# D. n' q
  3.   *        on variable incremented.
    , `7 w4 T6 a# F. u1 T; y' ~9 Z
  4.   * @note In the default implementation , SysTick timer is the source of time base.
    0 S3 t9 L$ y7 F
  5.   *       It is used to generate interrupts at regular time intervals where uwTick# d* o- N3 C% B8 c
  6.   *       is incremented.
    - i7 Y. {0 _: ]9 M7 }
  7.   * @note This function is declared as __weak to be overwritten in case of other. |1 }& q' D9 f( |
  8.   *       implementations in user file.( v6 g) W4 a2 Z5 P. y( L* T. a
  9.   *
    5 t" U& e: N6 l0 x& j
  10.   * @param Delay: specifies the delay time length, in milliseconds.
    % _# O$ o- n4 J0 ^) i& O
  11.   * @retval None
    + z0 a8 I2 ^& M- z1 W% m) r" S* A% ]0 Z
  12.   */) D8 O2 d  N* L% z5 F
  13. __weak void HAL_Delay(__IO uint32_t Delay)
    8 L# E" U2 M3 {0 B" w5 A
  14. {. H' r3 a2 [: ]3 s8 @+ P
  15.   uint32_t tickstart = 0U;8 Z( n5 _% c2 L: Y- ]
  16.   tickstart = HAL_GetTick();
    1 V$ c3 W. K$ k9 y/ i9 a) D
  17.   while((HAL_GetTick() - tickstart) < Delay); a% a7 R7 U# \) |' S' R
  18.   {0 c( e: R' U9 |5 W' ]$ d
  19.   }) I  o3 v0 ~) U& K: J
  20. }
复制代码

+ Z2 b6 l7 M/ u8 |1 T& d% N  o下面是us级别的延时:
$ m; j3 z& `# p" s; A
  1. void HAL_Delay_us(uint32_t nus)1 L6 ~( }0 u# c! c% c
  2. {
    8 ~" c5 ?  H1 I9 b2 x
  3. //将systic设置为1us中断6 J: X, \! _% g7 F) D" c3 I
  4. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);1 x+ {! q9 Y" z! ~9 v5 V3 h. z5 I
  5. //延时nus
    # ~' A; d7 g) d/ g
  6. HAL_Delay(nus-1);
    0 B! J$ M; h2 j+ m8 f# V' o0 l
  7. //恢复systic中断为1ms* ?' q, L/ y9 O$ B0 e: }$ V
  8. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);! d! f* _5 ?: ^) S2 e  @) D
  9. }
复制代码

3 g' S% a) @8 y另外需要注意的一点是stm32H7里面时钟配置如下:. ]& L- i7 x0 d( |, Y' w  b; N

3 _  d; |* ~! s% b; H 7T55[5V7]T2I8[)5}4SSLGQ.png
4 h6 n# F9 I' e: [: K, z) K4 c. H& B" j
其中systic是系统时钟直接给systic的而不是HCLK,HAL_RCC_GetHCLKFreq()正好是系统时钟的1/2所以上面配置1us时钟源要改为如下:
: Y0 B3 c  B. I0 z( W) D9 g- m4 Q% O5 \" ~
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()*2/1000000);
& ~# l- S) j! C% i8 j2 f3 E1 g1 c1 x8 v  Z7 {
7 L- }, K/ G2 m9 s8 X8 y' P
赞 收藏 评论0 发布时间:2022-3-9 22:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版