先贴出延时函数5 s; }0 m1 P3 B2 y( y5 o
- /***************************************************************** ~. M5 e6 x {' _- y( X* x. R
- * 基于STM32F0 HAL的微秒延时函数) u' I) [% [1 Y
- * @功能:实现US级延时
+ \+ t" z* h9 e0 k - * @注意:精准延时范围:2~999US
# j/ N ?7 Y3 e7 l2 a% _" x0 j - * 2019-07-03 Designed By XiaoYang http://www.pypyn.com6 J4 @" _; a1 {* @, g
- ******************************************************************/
1 H" p0 T2 }1 B4 \* K# N/ H0 ?* G - uint32_t CFG_VAL = 0;
' z; I' ~1 @' ~& u* t - void HAL_Delay_US(__IO uint32_t Delay)/ w8 Y) w* L, y0 A. V( b5 ?& ]+ R
- {7 |, ^* @+ |" m' o* Q
- if(Delay < MAX_Delay_CNT && Delay > 1)
. O4 z2 S# [0 S$ y - {
. ^7 L5 y7 _2 O4 s: y6 w: J) b/ ]! G - uint32_t wait = SysTick->LOAD - ((Delay - 1) * CFG_VAL);3 Q3 y' ~% C1 ~% M, t
- //CFG_VAL = HAL_RCC_GetHCLKFreq()/1000U/1000U))$ |: ?4 d* X0 G& E
- //计算出等待1US需要的计数器值2 r& s' S F1 C/ W3 ^/ p, f5 q
- SysTick->VAL=0UL; //重置SysTick计数器,计数器为向下计数4 N9 U! m% z; n8 j" p, [
- while(wait < (SysTick->VAL)); //等待时间到达
' D: T# \- Y5 x$ K) T+ c' f& \ - }$ P- ^6 C9 V! V% x2 u( l- _$ g
- }
复制代码 展示一下效果
& u8 v6 u- k$ } |! [3 X& T$ ?- l- HAL_Delay_US(50);
; k# h/ }8 o( z. P& J# I* x; w - LED_GPIO_Port->ODR ^= LED_Pin;
复制代码
# E% v' e$ n) v6 k1 T \
* S6 @) U1 A9 [& J1 Y
* L! W$ A, ^# `; ?4 Z- W1 h( g
板子使用的是STM32F030F4。3 r4 s, U1 L% q* D; Z
User_Drivers.zip
(946 Bytes, 下载次数: 15)
|
哈哈,完全赞同
并不是通过systick中断去做定时,而是通过等待systick定时计数器的计数值达到目标值的方法实现。us级太短了,进中断完全是不明智的选择,我这个想法只能用在一些很简单的项目上。