1. 程式人生 > 實用技巧 >6-stm32 滴答定時器(delay不帶中斷延時)

6-stm32 滴答定時器(delay不帶中斷延時)

 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 }