1. 程式人生 > >STM32的Systick時鐘

STM32的Systick時鐘

參考資料:《零死角玩轉STM32F103-霸道》

1 Systick時鐘簡介

 SysTick—系統定時器是屬於CM3核心中的一個外設,內嵌在NVIC中。系統定時器是
一個
24bit 的向下遞減的計數器,計數器每計數一次的時間為1/SYSCLK,一般我們設定系
統時鐘
SYSCLK 等於 72M。當重灌載數值暫存器的值遞減到 0 的時候,系統定時器就產生
一次中斷,以此迴圈往復。

 SysTick是屬於CM3核心的外設,所以所有基於CM3核心的微控制器都具有這個系
統定時器,使得軟體在
CM3 微控制器中可以很容易的移植。系統定時器一般用於作業系統,
用於產生時基,維持作業系統的心跳

2 Systick暫存器介紹

 SysTick系統定時器有4個暫存器

暫存器名稱暫存器描述
CTRLSystick控制及狀態暫存器
LOADSystick重灌載數值暫存器
VALSystick當前陣列暫存器
CALIBSystick校準暫存器

3 軟體設計 

  SysTick屬於核心的外設,有關的暫存器定義和庫函式都在核心相關的庫檔案core_cm3.h 

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
                                                               
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                                  /* Function successful */
}

  形參 ticks 用來設定重灌載暫存器的值,最大不能超過重灌載暫存器的值2的24次方,當重灌載暫存器的值遞減到0的時候產生中斷,然後重灌載暫存器的值又重新裝載往下遞減計數,以此迴圈往復。緊隨其後設定好中斷優先順序,最後配置系統定時器的時鐘等於 AHBCLK=72M,使能定時器和定時器中斷,這樣系統定時器就配置好了,一個庫函式搞定。

4 Systick定時時間的計算

 SystemFrequency /1000     1ms中斷一次
SystemFrequency / 100000   10us中斷一次
SystemFrequency / 1000000  1us中斷一次 

5 使用Systick編寫簡單的延時函式

  延時微秒級函式

void SysTick_us( __IO uint32_t us)
{
    uint32_t i;
	  SysTick_Config(SystemCoreClock/1000000);
    for(i=0;i<us;i++)
		{
		    while( !((SysTick->CTRL)&(1<<16)) );
		}
    //關閉Systick定時器
   SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

     延時毫秒級函式
void SysTick_ms(__IO uint32_t ms)
{
    uint32_t i;
	  SysTick_Config(SystemCoreClock/1000);
    for(i=0;i<ms;i++)
		{
		    while( !((SysTick->CTRL)&(1<<16)) );
		}
    //關閉Systick定時器
		SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}

  注意,由於Systick時鐘設定了中斷,所以要在stm32f10x_it.c中新增Systick的中斷響應函式

void SysTick_Handler(void)
{
	
}
  在中斷響應函式中什麼也不用做即可

6 小結

  之前一直不知道Systick時鐘在初始化的時候配置了中斷,沒有新增中斷響應函式。