先贴出延时函数
# D" b( x2 d: ?& ^: L- /*****************************************************************% q; }# l/ |4 I+ K$ _% g' A7 C2 b; C
- * 基于STM32F0 HAL的微秒延时函数
h9 }! L- h2 t: f - * @功能:实现US级延时
! |3 h, X/ I c( P, j% c - * @注意:精准延时范围:2~999US0 z+ f" W8 e, z+ O6 y8 I) b
- * 2019-07-03 Designed By XiaoYang http://www.pypyn.com- R. S3 W. U* e7 N
- ******************************************************************/
% Y& d, g. N4 q7 B4 F - uint32_t CFG_VAL = 0;
" V: X. F, `0 F+ z2 @& B+ @/ B - void HAL_Delay_US(__IO uint32_t Delay)
8 s. W) ^$ W: n$ E1 z - {
# |- E/ z. Q- Z/ p - if(Delay < MAX_Delay_CNT && Delay > 1)
# Z- r T2 i' U$ J0 T - {
3 U; X" F, j/ i: U r( ^. b3 X+ O - uint32_t wait = SysTick->LOAD - ((Delay - 1) * CFG_VAL);
$ T8 c X' m4 a% ?7 ^7 C4 N8 r. c/ V9 ~ - //CFG_VAL = HAL_RCC_GetHCLKFreq()/1000U/1000U))6 B2 y! \! Q; X5 r
- //计算出等待1US需要的计数器值4 @9 B8 c& B8 J5 H* A2 g* I( a3 a
- SysTick->VAL=0UL; //重置SysTick计数器,计数器为向下计数
! p) Z( O [3 t& j/ \3 s* c! i( P - while(wait < (SysTick->VAL)); //等待时间到达' J. C- G4 k6 U% B, R
- }/ S" ?8 k9 G- A S0 `& o8 }. [
- }
复制代码 展示一下效果
; C( Q* ?* Q- q& w' l- HAL_Delay_US(50);
# p0 v" U$ H8 W8 @- r- I' R9 v - LED_GPIO_Port->ODR ^= LED_Pin;
复制代码
8 o! G& B/ I \9 Q9 z. |+ A; B
+ \ y" A% S9 j% Q# r+ m
! }0 O3 q. W+ d板子使用的是STM32F030F4。
a) F- R6 `8 T W+ v$ i( v
User_Drivers.zip
(946 Bytes, 下载次数: 16)
|
哈哈,完全赞同
并不是通过systick中断去做定时,而是通过等待systick定时计数器的计数值达到目标值的方法实现。us级太短了,进中断完全是不明智的选择,我这个想法只能用在一些很简单的项目上。