利用系統滴答定時器來實現精確延時,需要以下五步:
1、設置滴答定時器的時鐘,通過設置其控制寄存器,選擇外部時鐘,即為系統時鐘的八分之一,若系統時鐘為72M,則滴答定時器時鐘為9M。即定時一秒需要9M個時鐘周期。
2、設置滴答定時器的重裝載寄存器的數值,即需要延時的時鐘周期數。如:若需要延時20微秒,則重裝載值為20*9.若要延時20毫秒,則設置重裝載值為20*9000.
3、清空滴答定時器當前值寄存器的值,使之為零,以便使能計數時能夠從設定值開始倒數計時。
4、設置滴答定時器的控制寄存器,開始倒計數。
5、查詢滴答定時器的狀態位,定時時間到,關閉定時器,清空定時器當前值。
- void delay_init(u8 SYSCLK)
- {
- SysTick->CTRL&=0xfffffffb;//控制寄存器,選擇外部時鐘即系統時鐘的八分之一(HCLK/8;72M/8=9M)
- fac_us=SYSCLK/8; //定義全局變量,即延時一微秒所需的的時鐘周期數(72/8=9,單位為微妙)
- fac_ms=(u16)fac_us*1000; //一毫秒所需的時鐘周期數(9000)
- }
- void Delay_us(u32 nus)
- {
- u32 temp;
- SysTick->LOAD=nus*fac_us; //時間加載(即延時多少個時鐘周期)
- SysTick->VAL=0x00; //清空計數器
- SysTick->CTRL=0x01 ; //開始倒數
- do
- {
- temp=SysTick->CTRL;
- }
- while(temp&0x01&&!(temp&(1<<16)));//等待時間到達
- SysTick->CTRL=0x00; //關閉計數器
- SysTick->VAL =0X00; //清空計數器
- }
- 或者
- void Delay_us(u32 Nus)
- {
- SysTick->LOAD=Nus*9; //時間加載 72M主頻
- SysTick->CTRL|=0x01; //開始倒數
- while(!(SysTick->CTRL&(1<<16))); //等待時間到達
- SysTick->CTRL=0X00000000; //關閉計數器
- SysTick->VAL=0X00000000; //清空計數器
- }
復制代碼
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|