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

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

[复制链接]
STMCU小助手 发布时间:2022-3-9 22:00
stm32之HAL库实现us延时方法
. G8 L( j; F& l' [7 |HAL_Delay()源码为ms级别的延时如下:
+ @+ i  X# y9 K  p" ?
; x( P8 S2 D) i$ H: W5 Y8 T
  1. /**
    . p. j6 q$ v1 h1 R# k( H( w$ X0 q
  2.   * @brief This function provides accurate delay (in milliseconds) based
    % J- Y1 N' i, b# {
  3.   *        on variable incremented.; H6 k' B( x* l/ P' h& V  s0 q
  4.   * @note In the default implementation , SysTick timer is the source of time base.
    8 r- a; ^8 I# N# ]6 l9 [
  5.   *       It is used to generate interrupts at regular time intervals where uwTick- r) h3 ]! \, n! M( C
  6.   *       is incremented.1 ~2 D- `( W$ f, V2 o+ u
  7.   * @note This function is declared as __weak to be overwritten in case of other
    - k' [6 Z& {( d1 s
  8.   *       implementations in user file.
    1 ^  e+ l! y( m
  9.   *
    0 O! V" i) G! @, G. K
  10.   * @param Delay: specifies the delay time length, in milliseconds.
    8 t  }1 V* h, Y. @% s3 y) }8 {3 ~! m
  11.   * @retval None: O# H  W9 ]' i' W. F
  12.   */
    4 y4 ~5 ?$ B& I
  13. __weak void HAL_Delay(__IO uint32_t Delay)
    8 H3 O) u' k2 d6 E  G' R
  14. {
    ' d* Q* o4 i; U
  15.   uint32_t tickstart = 0U;
    1 w5 ?/ V) e4 V) o' T4 P) K# C
  16.   tickstart = HAL_GetTick();: [, ^% B* r( A
  17.   while((HAL_GetTick() - tickstart) < Delay)& Y5 _% _/ b5 O$ f  ]
  18.   {
    4 Q; U! V! C5 S( D
  19.   }; j" b4 V" K$ H$ p; H
  20. }
复制代码

1 K* V- X! k7 u+ r: t+ R* p9 Q下面是us级别的延时:/ B$ a3 S! Y1 ^" }% g0 g* _, Y" y
  1. void HAL_Delay_us(uint32_t nus)! Y5 s6 b( _$ F, o4 J$ ^/ Y
  2. {: v2 U4 T4 n0 B
  3. //将systic设置为1us中断# H+ F' Y  I+ e
  4. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);( Q( b3 H9 `1 Z- b! h! f; }
  5. //延时nus
    " V. K/ y2 s8 k7 M; r9 K
  6. HAL_Delay(nus-1);
    7 c; {) @; U! x4 J( I& F# Q
  7. //恢复systic中断为1ms
    5 {+ E' G9 N, r% g% I/ m- [
  8. HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);  m. o2 w& P: ^, ^
  9. }
复制代码
( K- g# `( h0 E+ s
另外需要注意的一点是stm32H7里面时钟配置如下:/ f  B% `: p% M3 [
0 {" K: `0 q4 O4 h
7T55[5V7]T2I8[)5}4SSLGQ.png
3 M4 o. `" M) T9 }; ^2 |; s+ R) d. K. c! H1 @5 L0 l
其中systic是系统时钟直接给systic的而不是HCLK,HAL_RCC_GetHCLKFreq()正好是系统时钟的1/2所以上面配置1us时钟源要改为如下:
& A* j2 Q) s& \$ ~% i5 y4 O; m9 r5 K4 q) h
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()*2/1000000);
1 a+ h, m/ T: n9 K% b5 Y, f- c# j7 H# Q! {5 I: E
$ Y+ A3 z/ I: K# l. Z& p2 z8 B
收藏 评论0 发布时间:2022-3-9 22:00

举报

0个回答

所属标签

相似分享

官网相关资源

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