STM32的Systick時鐘
阿新 • • 發佈:2019-02-17
參考資料:《零死角玩轉STM32F103-霸道》
1 Systick時鐘簡介
SysTick—系統定時器是屬於CM3核心中的一個外設,內嵌在NVIC中。系統定時器是
一個 24bit 的向下遞減的計數器,計數器每計數一次的時間為1/SYSCLK,一般我們設定系
統時鐘 SYSCLK 等於 72M。當重灌載數值暫存器的值遞減到 0 的時候,系統定時器就產生
一次中斷,以此迴圈往復。
SysTick是屬於CM3核心的外設,所以所有基於CM3核心的微控制器都具有這個系
統定時器,使得軟體在 CM3 微控制器中可以很容易的移植。系統定時器一般用於作業系統,
用於產生時基,維持作業系統的心跳
2 Systick暫存器介紹
SysTick系統定時器有4個暫存器
暫存器名稱 | 暫存器描述 |
CTRL | Systick控制及狀態暫存器 |
LOAD | Systick重灌載數值暫存器 |
VAL | Systick當前陣列暫存器 |
CALIB | Systick校準暫存器 |
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時鐘在初始化的時候配置了中斷,沒有新增中斷響應函式。