stm32精确延时函数 绝地灬酷狼 2022-05-22 04:57 160阅读 0赞 \#include "SysTick.h" static u8 fac\_us=0; //us延时倍乘数 static u16 fac\_ms=0; //ms延时倍乘数 //注意:使用时需要添加misc.c文件到项目中 //初始化延迟函数 //SYSTICK的时钟固定为AHB时钟的1/8 //SYSCLK:系统时钟频率 void SysTick\_Init(u8 SYSCLK) \{ SysTick\_CLKSourceConfig(SysTick\_CLKSource\_HCLK\_Div8); fac\_us=SYSCLK/8; fac\_ms=(u16)fac\_us\*1000; \} /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \* 函 数 名: delay\_us \* 函数功能 : us延时, \* 输 入: nus:要延时的us数 注意:nus的值,不要大于798915us(最大值即2^24/fac\_us@fac\_us=21) \* 输 出: 无 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void delay\_us(u32 nus) \{ u32 temp; SysTick->LOAD=nus\*fac\_us; //时间加载 SysTick->VAL=0x00; //清空计数器 SysTick->CTRL|=SysTick\_CTRL\_ENABLE\_Msk ; //开始倒数 do \{ temp=SysTick->CTRL; \}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达 SysTick->CTRL&=~SysTick\_CTRL\_ENABLE\_Msk; //关闭计数器 SysTick->VAL =0X00; //清空计数器 \} /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* \* 函 数 名: delay\_ms \* 函数功能 : ms延时, \* 输 入: nms:要延时的ms数 注意:nms的值,SysTick->LOAD为24位寄存器,不要大于0xffffff\*8\*1000/SYSCLK 对72M条件下,nms<=1864ms \* 输 出 : 无 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/ void delay\_ms(u16 nms) \{ u32 temp; SysTick->LOAD=(u32)nms\*fac\_ms; //时间加载(SysTick->LOAD为24bit) SysTick->VAL =0x00; //清空计数器 SysTick->CTRL|=SysTick\_CTRL\_ENABLE\_Msk ; //开始倒数 do \{ temp=SysTick->CTRL; \}while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达 SysTick->CTRL&=~SysTick\_CTRL\_ENABLE\_Msk; //关闭计数器 SysTick->VAL =0X00; //清空计数器 \}
还没有评论,来说两句吧...