stm32f4使用Systick實現(xiàn)延時
使用Systick定時器實現(xiàn)延時
一、SysTick定時器特性
SysTick定時器是一個24位的遞減計數(shù)器,即vlue自減等于0時觸發(fā)中斷,并重新加載load值,如此循環(huán)。
在stm32f4庫文件中,默認(rèn)將優(yōu)先級設(shè)置為最低優(yōu)先級,可進入函數(shù)SysTick_Config查看優(yōu)先級設(shè)置。
SysTick是Cortex-M內(nèi)核的一部分,因此只要是Cortex-M內(nèi)核都有該定時器。
SysTick的時鐘源可由HCLK產(chǎn)生,或則HCLK/8產(chǎn)生。
二、如何使用SysTick定時器
既然是定時器,那么至少應(yīng)該設(shè)置2方面內(nèi)容:
1. 定時時間
2. 定時時間到后做什么。
三、程序解析
1. SysTick定時器初始化
在SysTick定時器初始化需要注意SysTick時鐘的選擇,如果使用8分頻一定要在SysTick_Config執(zhí)行后,才執(zhí)行時鐘函數(shù)SysTick_CLKSourceConfig,否則時鐘分頻無效。
static void SysTickInit(void)
{
#ifdef SysTick_HCLK_Div8 /* SysTick時鐘源為HCLK的8分頻 */
/* SystemCoreClock/1000/8 1ms
* SystemCoreClock/100000/8 10us
* SystemCoreClock/1000000/8 1us
*/
SysTick_Config(SystemCoreClock/1000/8);
/* 時鐘配置必須放在SysTick_Config函數(shù)后,不然不起作用 */
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
#else
/****************************************
*SystemCoreClock/1000 1ms *
*SystemCoreClock/100000 10us *
*SystemCoreClock/1000000 1us *
*****************************************/
SysTick_Config(SystemCoreClock / 1000);
/* 時鐘配置必須放在SysTick_Config函數(shù)后,不然不起作用 */
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);/* 系統(tǒng)默認(rèn)SysTick時鐘源,可以不寫 */
#endif
}
2.SysTick中斷函數(shù)和延時函數(shù)
static volatile uint32_t TimingDelay;
/* 延時函數(shù) */
void Delay_Ms(uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
/* SysTick中斷函數(shù) */
void SysTick_Func(void)
{
TimingDelay--;
}