Systick時鐘

   咱們在寫單片機程序時,最經常使用的一個函數就是延時函數,不少狀況下,都須要咱們產生一個延時,若是此時,程序對延時的精確程度較高,顯然通常的延時函數並不能知足咱們的需求,那咱們該怎麼辦呢?這個時候,Systick定時器就是它發揮做用的時候了。
ide

   什麼是Systick定時器呢?簡而言之,它是stm32內部系統滴答定時器,而且它是24位倒計時定時器,做用就是可以產生精確的延時時間。當計數到0時,它自動從一個叫作RELOD寄存器中自動加載數值。衆所周知,咱們想要驅動定時器,須要一個時鐘才能驅動,而Systick定時器的時鐘比較特殊,它的時鐘來源是系統時鐘。Systick有兩種得到系統時鐘的方式,一種是直接取自系統時鐘,另外一種是將系統時鐘8分頻,而後再賦值給Systick定時器。
函數

   Systick定時器是屬於CM3內核的外設,全部基於CM3內核的單片機都具備這個系統定時器。系統定時器通常用於操做系統,用於產生時基,維持操做系統的心跳。
操作系統

   這裏先來說講Systick最基礎的用法---精確產生一個延時。這裏,就讓它延時1秒鐘吧。Systick仍是比較簡單的,由於它只有四個寄存器。以下:
it

寄存器名稱                             寄存器描述
CTRL                                    Systick控制及狀態寄存器
LOAD                                    Systick重裝載數值寄存器
VAL                                     Systick當前數值寄存器
CALIB                                   Systick校準數值寄存器

咱們經過systick產生精確的延時,首先,咱們要設置重裝載數值。由於,當定時的時間爲0時,RELOAD中的數值自動賦值給systick。那麼,設置重裝載數值,也就是定時時間爲,這裏延時ms爲單位,class

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;    //讀取當前倒計數值
    
    }while ( ( temp & 0x01 ) && ( !( temp & ( 1 << 16 ) ) ) );
    
    SysTick->CTRL = 0x00;     //關閉計數器
    SysTick->VAL = 0;         //計數器清零

}
相關文章
相關標籤/搜索