(STM32F4) SysTick理解使用

關於Cortex System Timer (Systick) 網上隨便google就可以找到許多相關範例。

他就是ARM提供的一個24-bit的下數(count-down)計時器我看大部分應用都是提供給delay使用,在RTOS也有一些應用.

簡單提及一下 Systick Register

1 typedef struct
2 {
3   __IO uint32_t CTRL;                    /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */
4   __IO uint32_t LOAD;                    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */
5   __IO uint32_t VAL;                     /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */
6   __I  uint32_t CALIB;                   /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */
7 } SysTick_Type;

Systick CTRL register

1. COUNT FLAG[16] : Return 1 if timer counted to 0.

2. CLK SOURCE [2] : select the clock soruce, 0 : AHB / 8, 1 : AHB.

3. TICK INT [1] : Counting down to zero either assert or not the Systick exception request.

4. ENABLE [0] : Enbles the counter.

Programming manual 的 note 敘述可以利用軟體的方式去讀取 COUNT FLAG來判斷counter是否曾經到0.

Systick RELOAD register

主要是提供 24bit 的counter reload value.

Systick VAL register

當Systick timer 開始計數 VAL register就可以觀察目前計數到的數值

貼心的官方當然有提供相對應的配置function

 static __INLINE uint32_t SysTick_Config(uint32_t ticks) 

選 system clock 為主所以在配置 reload register 會影響中斷發生的時間

 SysTick_Config(SystemCoreClock / 1000) 

以這行程式碼來說 systick timer counter 1 次需要 1/168MHz的時間

Reload = 168M / 1000 = 168K , interrupt 時間 = 168K / 168M = 1ms發生一次.

官方的範例提供了 2 個function主要負責計算delay,Delay time 則是透過 Systick 配置決定的

 1 /**
 2   * @brief  Inserts a delay time.
 3   * @param  nTime: specifies the delay time length, in milliseconds.
 4   * @retval None
 5   */
 6 void Delay(__IO uint32_t nTime)
 7 { 
 8   TimingDelay = nTime;
 9 
10   while(TimingDelay != 0);
11 }
12 
13 /**
14   * @brief  Decrements the TimingDelay variable.
15   * @param  None
16   * @retval None
17   */
18 void TimingDelay_Decrement(void)
19 {
20   if (TimingDelay != 0x00)
21   { 
22     TimingDelay--;
23   }
24 }
25 
26 /**
27   * @brief  This function handles SysTick Handler.
28   * @param  None
29   * @retval None
30   */
31 void SysTick_Handler(void)
32 {
33   TimingDelay_Decrement();
34 }

 

posted on 2018-12-10 23:30  OO程式猿  阅读(3430)  评论(0编辑  收藏  举报

导航