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- /**
. p. j6 q$ v1 h1 R# k( H( w$ X0 q - * @brief This function provides accurate delay (in milliseconds) based
% J- Y1 N' i, b# { - * on variable incremented.; H6 k' B( x* l/ P' h& V s0 q
- * @note In the default implementation , SysTick timer is the source of time base.
8 r- a; ^8 I# N# ]6 l9 [ - * It is used to generate interrupts at regular time intervals where uwTick- r) h3 ]! \, n! M( C
- * is incremented.1 ~2 D- `( W$ f, V2 o+ u
- * @note This function is declared as __weak to be overwritten in case of other
- k' [6 Z& {( d1 s - * implementations in user file.
1 ^ e+ l! y( m - *
0 O! V" i) G! @, G. K - * @param Delay: specifies the delay time length, in milliseconds.
8 t }1 V* h, Y. @% s3 y) }8 {3 ~! m - * @retval None: O# H W9 ]' i' W. F
- */
4 y4 ~5 ?$ B& I - __weak void HAL_Delay(__IO uint32_t Delay)
8 H3 O) u' k2 d6 E G' R - {
' d* Q* o4 i; U - uint32_t tickstart = 0U;
1 w5 ?/ V) e4 V) o' T4 P) K# C - tickstart = HAL_GetTick();: [, ^% B* r( A
- while((HAL_GetTick() - tickstart) < Delay)& Y5 _% _/ b5 O$ f ]
- {
4 Q; U! V! C5 S( D - }; j" b4 V" K$ H$ p; H
- }
复制代码
1 K* V- X! k7 u+ r: t+ R* p9 Q下面是us级别的延时:/ B$ a3 S! Y1 ^" }% g0 g* _, Y" y
- void HAL_Delay_us(uint32_t nus)! Y5 s6 b( _$ F, o4 J$ ^/ Y
- {: v2 U4 T4 n0 B
- //将systic设置为1us中断# H+ F' Y I+ e
- HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000000);( Q( b3 H9 `1 Z- b! h! f; }
- //延时nus
" V. K/ y2 s8 k7 M; r9 K - HAL_Delay(nus-1);
7 c; {) @; U! x4 J( I& F# Q - //恢复systic中断为1ms
5 {+ E' G9 N, r% g% I/ m- [ - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); m. o2 w& P: ^, ^
- }
复制代码 ( K- g# `( h0 E+ s
另外需要注意的一点是stm32H7里面时钟配置如下:/ f B% `: p% M3 [
0 {" K: `0 q4 O4 h
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
|