Systick滴答定時器-延時函式
阿新 • • 發佈:2018-12-27
1、參考資料
《STM32F1開發指南-庫函式版本》-5.1小節 delay資料夾介紹
《Cortex-M3權威指南-中文》-第8章最後一個小節:Systick定時器
2、Systick定時器
Systick定時器,是一個簡單的定時器,對於CM3,CM4核心晶片,都有Systick定時器。
Systick定時器常用來做延時,或者實時系統的心跳時鐘。這樣可以節省MCU資源,不用浪費一個定時器。
比如UCOS中,分時複用,需要一個最小的時間戳,一般在STM32+UCOS系統中,都採用Systick做UCOS心跳時鐘。
Systick定時器就是系統滴答定時器,一個24?位的倒計數定時器,計到0?時,將從RELOAD?暫存器中自動重灌載定時初值。
只要不把它在SysTick?控制及狀態暫存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。
SysTick定時器被捆綁在NVIC中,用於產生SYSTICK異常(異常號:15)。
Systick中斷的優先順序也可以設定。
3、Systick相關暫存器
CTRL SysTick控制和狀態暫存器 LOAD
SysTick自動重灌載除值暫存器
VAL SysTick當前值暫存器 CALIB
SysTick校準值暫存器
4、Systick控制和狀態暫存器-CTRL
對於STM32,外部時鐘是HCLK(AHB匯流排時鐘)的1/8核心時鐘是HCLK時鐘
配置函式: SysTick_CLKSourceConfig();
5、SysTick重灌載數值暫存器-LOAD
6、SysTick當前值暫存器-VAL
7、Systick庫函式
·韌體庫中的Systick相關函式
SysTick_CLKSourceConfig() //Systick時鐘源選擇 misc.c檔案中
SysTick_Config(uint32_t ticks) //初始化systick,時鐘為HCLK,並開啟中斷
//core_cm3.h/core_cm4.h檔案中
8、Systick中斷服務函式
void SysTick_Handler(void);
9、SysTick_CLKSourceConfig函式:
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
10、SysTick_CLKSourceConfig函式:
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
/* set reload register */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
/* set Priority for Cortex-M0 System Interrupts */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
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 */
}
10、用中斷的方式實現delay延時
static __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void SysTick_Handler(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
int main(void)
{ …
if (SysTick_Config(SystemCoreClock / 1000)) //systick時鐘為HCLK,中斷時間間隔1ms
{
while (1);
}
while(1)
{ Delay(200);//2ms
…
}
}
11、Cortex-M系統中,Systick程式碼可以通用。
如果使用中發現延時不一致,問題一般都是
因為不同核心時鐘不一樣而已。修改ticks
值即可。
《STM32F1開發指南-庫函式版本》-5.1小節 delay資料夾介紹
《Cortex-M3權威指南-中文》-第8章最後一個小節:Systick定時器
2、Systick定時器
Systick定時器,是一個簡單的定時器,對於CM3,CM4核心晶片,都有Systick定時器。
Systick定時器常用來做延時,或者實時系統的心跳時鐘。這樣可以節省MCU資源,不用浪費一個定時器。
比如UCOS中,分時複用,需要一個最小的時間戳,一般在STM32+UCOS系統中,都採用Systick做UCOS心跳時鐘。
Systick定時器就是系統滴答定時器,一個24?位的倒計數定時器,計到0?時,將從RELOAD?暫存器中自動重灌載定時初值。
只要不把它在SysTick?控制及狀態暫存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。
SysTick定時器被捆綁在NVIC中,用於產生SYSTICK異常(異常號:15)。
Systick中斷的優先順序也可以設定。
3、Systick相關暫存器
CTRL SysTick控制和狀態暫存器 LOAD
SysTick自動重灌載除值暫存器
VAL SysTick當前值暫存器 CALIB
SysTick校準值暫存器
4、Systick控制和狀態暫存器-CTRL
對於STM32,外部時鐘是HCLK(AHB匯流排時鐘)的1/8核心時鐘是HCLK時鐘
配置函式: SysTick_CLKSourceConfig();
5、SysTick重灌載數值暫存器-LOAD
6、SysTick當前值暫存器-VAL
7、Systick庫函式
·韌體庫中的Systick相關函式
SysTick_CLKSourceConfig() //Systick時鐘源選擇 misc.c檔案中
SysTick_Config(uint32_t ticks) //初始化systick,時鐘為HCLK,並開啟中斷
//core_cm3.h/core_cm4.h檔案中
8、Systick中斷服務函式
void SysTick_Handler(void);
9、SysTick_CLKSourceConfig函式:
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
10、SysTick_CLKSourceConfig函式:
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
/* set reload register */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
/* set Priority for Cortex-M0 System Interrupts */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
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 */
}
10、用中斷的方式實現delay延時
static __IO uint32_t TimingDelay;
void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void SysTick_Handler(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
int main(void)
{ …
if (SysTick_Config(SystemCoreClock / 1000)) //systick時鐘為HCLK,中斷時間間隔1ms
{
while (1);
}
while(1)
{ Delay(200);//2ms
…
}
}
11、Cortex-M系統中,Systick程式碼可以通用。
如果使用中發現延時不一致,問題一般都是
因為不同核心時鐘不一樣而已。修改ticks
值即可。