1 //不带中断进行精确延时 2 3 //全局变量 4 static u8 fac_us;//us级基数 --0~255 5 static u16 fac_ms;//ms级基数 --0~65536 6 7 8 //延时函数初始化 9 void Delay_init(void) 10 { 11 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//9MHz 12 //SysTick->CTRL &= 0xfffffffb;--misc.c-199选择HCLK/8作为systick时钟 13 14 fac_us =SystemCoreClock/8000000;//9 15 fac_ms =(u16)fac_us*1000; 16 } 17 18 //us 19 void Dealy_us(u32 nus)//nus--2^24/9 20 { 21 u32 time; 22 SysTick->CTRL = 0x00; //关闭SysTick定时器 23 SysTick->LOAD =nus*fac_us;//加载时间 24 SysTick->VAL =0x00; //清空计数器 25 26 //SysTick->CTRL |=0x01;//开定时器 27 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//使能定时器 28 29 do 30 { 31 time =SysTick->CTRL; 32 33 }while(time&0x01 && !(time&(1<<16)));//等待时间到达 34 35 SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;//失能定时器 36 SysTick->VAL =0x00;//清空计数器 37 38 } 39 40 //ms 41 void Dealy_us(u16 nms)//nms<=2^24/9000=1864 42 { 43 u32 time; 44 SysTick->CTRL = 0x00; //关闭SysTick定时器 45 SysTick->LOAD =(u32)nms*fac_ms;//加载时间 46 SysTick->VAL =0x00; //清空计数器 47 48 //SysTick->CTRL |=0x01;//开定时器 49 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//使能定时器 50 51 do 52 { 53 time =SysTick->CTRL; 54 55 }while(time&0x01 && !(time&(1<<16)));//等待时间到达 56 57 SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;//失能定时器 58 //SysTick->CTRL = 0x00; //关闭SysTick定时器 59 SysTick->VAL =0x00;//清空计数器 60 61 }
原文:https://www.cnblogs.com/darren-pty/p/13910840.html