STM32入門學習之_SysTick_Config()函數的SysTick時鐘配置

上來就是systick定時器,因爲GPIO等的基礎操作過於簡單,網上資料太多了。
這裏討論的是基於STM32F10x 的基於 V3.5.0庫的庫函數配置方法。

      Systick又叫系統嘀答定時器,是一個24位的硬件定時器。嵌入式操作系統常有一個類似“心跳”的定時器,來分配時間片,實現宏觀上的多任務。
其實,操作系統的多任務,在微觀上,CPU對多任務的管理是分時的。每個任務都給一定的時間片,就是把時間分成N個等份,優先級高或是
重要的任務多佔幾個時間片,優先級低的或是不重要的任務就少佔幾個時間片。大部分嵌入式操作系統基於時間片的。如ucos。

       那基於STM32F10x V3.5.0庫如何操作Systick定時器呢。
首先:STM32 的內核庫已經提供了這個功能。只要配置SysTick_Config()即可實現。
看下面的程序段。
/*
* 函數名:SysTick_Init
* 描述         :啓動系統滴答定時器 SysTick
* 輸入  : 無
* 輸出  :無
* 調用  : 外部調用
*/
void SysTick_Init(void)
{
        if(SysTick_Config(SystemCoreClock/1000))         //1ms定時器
        {
                while(1);
        }
        //SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;                         //若無法啓動則關閉
}


        SysTick_Config的參數,其實就是一個時鐘次數,叫systick重裝定時器的值。意思就是我要多少個1/fosc 時間後中斷一下。

      根據學過的物理中的時間與頻率的公式:fosc=1/T   T=1/fosc ,fosc爲系統的頻率。
如果STM32時鐘頻率爲:72MHz,每次的時間爲:T=1/72MHz。1秒鐘爲:1/(每次的時間)=1/(1/72MHz)=72 000 000次。1MHz是:1000 000。

      反過來講。SysTick_Config(72000)代表:72000*(1/72MHz)=1/1000=1(ms)。即定時爲1ms。
如果需要1S則,可以通一設置一個全局變量,然後定初值得爲1000,這樣,每個systick中斷一次,這個全局變量減1,減到0,即systick中斷1000次,時間
爲:1ms*1000=1S。從而實現1S的定時。
      因爲SysTick定時器是:24位的,最大定時時間爲:2的24次方*(1/72MHz)的時間,這裏系統頻率爲:72MHz的情況下。

      如何使用這個Systick用於程序設計上的延時或是定時作用呢?
如下:
__IO uint32_t TimingDelay;
定義一個全局變量,注意類型爲 volatile的。

volatile的作用: 作爲指令關鍵字,確保本條指令不會因爲編譯器的優化而省略,且要求每次直接讀值.然後定義一個延時或是定時函數:


/*
* 函數名:Delay_ms
* 描述         :ms延時程序,1ms爲一個單位
* 輸入  : - nTime
* 輸出  :無
* 示例  : Delay_ms(1) 實現的延時爲:1*ms=1ms
* 調用  :外部調用
*/
void Delay_ms(uint16_t nTime)
{
        TimingDelay = nTime;
        //使能系統滴答定時器
        while(TimingDelay !=0);
}

      還要在系統的中斷函數文件:stm32f10x_it.c/h裏面,修改系統自帶的systick函數。這個函數要麼沒有聲明或是爲空操作。這裏加入
定時延時裏的處理。
      即中斷後,全局變量做個--處理即可。

      在::stm32f10x_it.c裏修改如下:
添加外部的聲明:
extern __IO uint32_t TimingDelay;

      修改這個函數: SysTick_Handler,這是系統的關於SysTick_Handler的中斷服務程序名,
在啓動文件裏如:startup_stm32f10x_hd.s   有它的定義的名字。不要弄錯了。否則無法中斷處理。


/**
  * @brief  This function handles SysTick Handler.
  * @param  None
  * @retval None
  */
void SysTick_Handler(void)
{
if (TimingDelay != 0x00)
        {   
                TimingDelay--; 
        }
}


      以上,即定義配置好了Systick定時器。如何使用呢?
很簡單。
        Delay_ms(500);  即爲延時500ms。


       當然,使用前,請先初始化:
SysTick_Init();
       否則無法使用並影響後續的程序運行,這個很重要,就像打開了串口中斷,你不清標誌位,也同樣在接收字符後,CPU中斷在那裏,而不能繼續執行!。使用外設功能,需要初始化!


以上基本講完了。主要是加入了自己的理解。

以下爲搜索的一些其他理解。

SysTick_Config(SystemFrequency / 10)   函數的形參就是systick重裝定時器的值。

systck計數頻率爲每秒72000000次,所以7200000次就是1/10秒,也就是100ms。


SysTick是1個24bit遞減計數器,通過對SysTick控制與狀態寄存器的設置,可選擇HCLK時鐘(72M)或HCLK的8分頻(9M,缺省是這個)作爲SysTick的時鐘源。
SysTick的重裝寄存器決定了定時器頻率。


若SysTick的時鐘源是72M,   SystemFrequency = 72000000Hz
所以 SysTick_Config(SystemFrequency / 1000); 就是1ms時基。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章