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