先贴出延时函数
1 U$ }, e/ v& P8 v( f- /*****************************************************************
# J+ ^) ~) W% m* a - * 基于STM32F0 HAL的微秒延时函数
# v, N* j+ N- l6 m" }7 D$ K$ V - * @功能:实现US级延时
" s3 r; u& K$ X2 j - * @注意:精准延时范围:2~999US5 N9 J% k" {1 A
- * 2019-07-03 Designed By XiaoYang http://www.pypyn.com9 u% t( E: d |- f
- ******************************************************************/
6 { J8 m4 @+ k3 p' f3 v0 E0 [ - uint32_t CFG_VAL = 0;& P' U! z8 ~3 L4 ?8 V9 F: L" p
- void HAL_Delay_US(__IO uint32_t Delay)2 G8 e5 T! }) Q& ]3 [
- {
( X7 B' J! G6 R9 j% I" r/ V$ X - if(Delay < MAX_Delay_CNT && Delay > 1)4 r6 L) E8 S" L- m% K
- {
' L$ ]* N* k! D Q. Q - uint32_t wait = SysTick->LOAD - ((Delay - 1) * CFG_VAL);7 v7 P. E0 }" S; i: S- Q
- //CFG_VAL = HAL_RCC_GetHCLKFreq()/1000U/1000U))* ^% @$ [7 h* N8 v% i
- //计算出等待1US需要的计数器值
7 d' [1 N) F4 l, Q - SysTick->VAL=0UL; //重置SysTick计数器,计数器为向下计数
+ s, ?$ b4 y% V$ E6 ` - while(wait < (SysTick->VAL)); //等待时间到达" L/ i8 f% R2 I( _
- }
# d {% d) w: L* q - }
复制代码 展示一下效果
9 i. S/ [5 m" a& J" z* T# A- HAL_Delay_US(50);
w9 ?3 R9 l- E" \* P! N2 k2 u - LED_GPIO_Port->ODR ^= LED_Pin;
复制代码
/ S6 O9 U& Y4 y6 u1 w0 ^" r/ j) a0 f7 v6 D J
2 @) d$ [0 r! J板子使用的是STM32F030F4。+ [) E1 b5 m/ O
User_Drivers.zip
(946 Bytes, 下载次数: 16)
|
哈哈,完全赞同
并不是通过systick中断去做定时,而是通过等待systick定时计数器的计数值达到目标值的方法实现。us级太短了,进中断完全是不明智的选择,我这个想法只能用在一些很简单的项目上。