STM32精確延遲1us和1ms的函數
延遲1us:
1 /******************************************************************************* 2 * 函 數 名 : delay_us 3 * 函數功能 : 延時函數,延時us 4 * 輸 入 : i 5 * 輸 出 : 無 6 *******************************************************************************/ 7 void delay_us(u32 i) 8 { 9 u32 temp; 10 SysTick->LOAD=9*i; //設置重裝數值, 72MHZ時 11 SysTick->CTRL=0X01; //使能,減到零是無動作,采用外部時鍾源 12 SysTick->VAL=0; //清零計數器 13 do 14 { 15 temp=SysTick->CTRL; //讀取當前倒計數值 16 } 17 while((temp&0x01)&&(!(temp&(1<<16)))); //等待時間到達 18 SysTick->CTRL=0; //關閉計數器 19 SysTick->VAL=0; //清空計數器 20 }
延遲1ms:
1 /******************************************************************************* 2 * 函 數 名 : delay_ms 3 * 函數功能 : 延時函數,延時ms 4 * 輸 入 : i 5 * 輸 出 : 無 6 *******************************************************************************/ 7 void delay_ms(u32 i) 8 { 9 u32 temp; 10 SysTick->LOAD=9000*i; //設置重裝數值, 72MHZ時 11 SysTick->CTRL=0X01; //使能,減到零是無動作,采用外部時鍾源 12 SysTick->VAL=0; //清零計數器 13 do 14 { 15 temp=SysTick->CTRL; //讀取當前倒計數值 16 } 17 while((temp&0x01)&&(!(temp&(1<<16)))); //等待時間到達 18 SysTick->CTRL=0; //關閉計數器 19 SysTick->VAL=0; //清空計數器 20 }
注意:以上兩函數中間的參數u32 i不能超過1800,舉例,想定時一分鍾,可以通過for循環讓delay_ms(1000)走60次,而不能使用delay_ms(60000),不然程序就出錯了。