十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
我們在寫單片機程序時,最常用的一個函數(shù)就是延時函數(shù),很多情況下,都需要我們產(chǎn)生一個延時,如果此時,程序?qū)ρ訒r的精確程度較高,顯然一般的延時函數(shù)并不能滿足我們的需求,那我們該怎么辦呢?這個時候,Systick定時器就是它發(fā)揮作用的時候了。
創(chuàng)新互聯(lián)成立十載來,這條路我們正越走越好,積累了技術(shù)與客戶資源,形成了良好的口碑。為客戶提供成都網(wǎng)站設計、成都網(wǎng)站制作、網(wǎng)站策劃、網(wǎng)頁設計、域名注冊、網(wǎng)絡營銷、VI設計、網(wǎng)站改版、漏洞修補等服務。網(wǎng)站是否美觀、功能強大、用戶體驗好、性價比高、打開快等等,這些對于網(wǎng)站建設都非常重要,創(chuàng)新互聯(lián)通過對建站技術(shù)性的掌握、對創(chuàng)意設計的研究為客戶提供一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進步。
什么是Systick定時器呢?簡而言之,它是stm32內(nèi)部系統(tǒng)滴答定時器,并且它是24位倒計時定時器,作用就是能夠產(chǎn)生精確的延時時間。當計數(shù)到0時,它自動從一個叫做RELOD寄存器中自動加載數(shù)值。眾所周知,我們想要驅(qū)動定時器,需要一個時鐘才能驅(qū)動,而Systick定時器的時鐘比較特殊,它的時鐘來源是系統(tǒng)時鐘。Systick有兩種獲得系統(tǒng)時鐘的方式,一種是直接取自系統(tǒng)時鐘,另一種是將系統(tǒng)時鐘8分頻,然后再賦值給Systick定時器。
Systick定時器是屬于CM3內(nèi)核的外設,所有基于CM3內(nèi)核的單片機都具有這個系統(tǒng)定時器。系統(tǒng)定時器一般用于操作系統(tǒng),用于產(chǎn)生時基,維持操作系統(tǒng)的心跳。
這里先來講講Systick最基礎的用法---精確產(chǎn)生一個延時。這里,就讓它延時1秒鐘吧。Systick還是比較簡單的,因為它只有四個寄存器。如下:
寄存器名稱 寄存器描述 CTRL Systick控制及狀態(tài)寄存器 LOAD Systick重裝載數(shù)值寄存器 VAL Systick當前數(shù)值寄存器 CALIB Systick校準數(shù)值寄存器
我們通過systick產(chǎn)生精確的延時,首先,我們要設置重裝載數(shù)值。因為,當定時的時間為0時,RELOAD中的數(shù)值自動賦值給systick。那么,設置重裝載數(shù)值,也就是定時時間為,這里延時ms為單位,
SysTick->LOAD = 9000 * i; //72MHz進行8分頻,于是是9MHz,所以9 * 10^6 Hz * 1 * 10^-6 s
接著,我們要使能systick,
SysTick->CTRL = 0x01; //若為0x00,則關閉定時器
之后,我們要對定時器清零,
SysTick->VAL = 0;
完整代碼如下:
void delay_ms ( unsigned int i ){ unsigned int temp; SysTick->LOAD = 9000 * i; //如果是微妙,則 SysTick->LOAd = 9 * i; SysTick->CTRL = 0x01; SysTick->VAL = 0; do{ temp = SysTick->CTRL; //讀取當前倒計數(shù)值 }while ( ( temp & 0x01 ) && ( !( temp & ( 1 << 16 ) ) ) ); SysTick->CTRL = 0x00; //關閉計數(shù)器 SysTick->VAL = 0; //計數(shù)器清零 }