STM32—SysTick系統定時器
2021-09-02 來源:eefocus
SysTick是STM32中的系統定時器,利用SysTick可以實現精確的延時。
SysTick—系統定時器
屬于 CM3 內核中的一個外設,內嵌在 NVIC 中。系統定時器是一個 24bit 的向下遞減的計數器,計數器每計數一次的時間為 1/SYSCLK,一般我們設置系統時鐘 SYSCLK 等于 72M。當重裝載數值寄存器的值遞減到 0 的時候,系統定時器就產生一次中斷,以此循環往復。因為 SysTick 是屬于 CM3 內核的外設,所以所有基于 CM3 內核的單片機都具有這個系統定時器,使得軟件在 CM3 單片機中可以很容易的移植。系統定時器一般用于操作系統,用于產生時基,維持操作系統的心跳。
延時模式:
SysTick的延時可以有倆種模式:
1.單純遞減延時
2.利用void SysTick_Handler(void) 中斷函數延時
倆種方法都涉及到一個函數,那就是SysTick 配置庫函數 ,
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
// 不可能的重裝載值,超出范圍
if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
{
return (1UL);
}
// 設置重裝載寄存器
SysTick->LOAD = (uint32_t)(ticks - 1UL);
// 設置中斷優先級
NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL);
// 設置當前數值寄存器
SysTick->VAL = 0UL;
// 設置系統定時器的時鐘源為 AHBCLK=72M
// 使能系統定時器中斷
// 使能定時器
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
return (0UL);
}
其主要任務是裝填計時器初始值、設置時鐘源、設置中斷源優先級。初始值不能超過2^24,時鐘源一般為72M。
1.單純遞減延時
毫秒級延時
void SysTick_Delay_ms(uint32_t ms)
{
uint32_t i;
SysTick_Config(72000); /* 設置初始值為72000 */
for(i=0;i while(!((SysTick->CTRL) & (1<<16))) ; /* 檢測一次計時完成 */ } SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; /* 操作寄存器 */ } 2.利用void SysTick_Handler(void) 中斷函數延時 毫秒級延時 volatile uint32_t isr_ms; void SysTick_Delay_ms_INT(uint32_t ms) { isr_ms = ms; SysTick_Config(72000); while(isr_ms); /* 在中斷里遞減 */ /* 失能systick */ SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; } 在stm32f10x_it.c中的代碼如下: extern volatile uint32_t isr_ms; /* 這個變量在bsp_systick.c里面定義 */ void SysTick_Handler(void) { isr_ms--; }
下一篇:STM32—DMA存儲器到外設