先贴出延时函数
9 d8 Y' ]9 h! f- /*****************************************************************
2 j# A3 ~) f! B$ H+ S - * 基于STM32F0 HAL的微秒延时函数
9 g7 I) q. O! Z7 P: x, u! { - * @功能:实现US级延时
5 @' A6 p+ K- M& E, C: Y - * @注意:精准延时范围:2~999US
8 u; P! E/ ~. \5 H7 [ - * 2019-07-03 Designed By XiaoYang http://www.pypyn.com
% h+ j. M1 D' T5 v - ******************************************************************/- p$ T* y! t2 O* u
- uint32_t CFG_VAL = 0;
& v( P; F6 u- w/ [+ z+ ^# o - void HAL_Delay_US(__IO uint32_t Delay)( Y$ D. i/ m$ z- K
- {7 n! I0 Z9 C1 i
- if(Delay < MAX_Delay_CNT && Delay > 1)
( b- p# @1 F. g1 r - {
. U: G" ^. }- n5 y7 A! u - uint32_t wait = SysTick->LOAD - ((Delay - 1) * CFG_VAL);9 G4 c5 u3 d5 Y% X6 m
- //CFG_VAL = HAL_RCC_GetHCLKFreq()/1000U/1000U))4 p1 S+ L5 z; \/ S1 ^5 |
- //计算出等待1US需要的计数器值
: t9 V) o/ \. f+ n - SysTick->VAL=0UL; //重置SysTick计数器,计数器为向下计数+ l. K0 Y$ f. }' r9 E9 ?4 j
- while(wait < (SysTick->VAL)); //等待时间到达
+ R! |8 ^) U- ^. c* c - }6 Y- l; f! d$ D7 e* r
- }
复制代码 展示一下效果3 q# y; O) ]7 P3 }% |, y( W6 L
- HAL_Delay_US(50);3 o! u. v1 K9 E. R- J
- LED_GPIO_Port->ODR ^= LED_Pin;
复制代码
; N2 @+ |$ a: m- \6 E
, M i3 F4 |" t
1 s- Y D2 d" ]2 a1 e& y( S! G板子使用的是STM32F030F4。9 }% Y, H% ~1 [7 V0 L, Z, K/ u
User_Drivers.zip
(946 Bytes, 下载次数: 16)
|
哈哈,完全赞同
并不是通过systick中断去做定时,而是通过等待systick定时计数器的计数值达到目标值的方法实现。us级太短了,进中断完全是不明智的选择,我这个想法只能用在一些很简单的项目上。