STM32精確延遲1us和1ms的函數


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),不然程序就出錯了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM