static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SYSTICK_MAXCOUNT) return (1);
SysTick->LOAD = (ticks & SYSTICK_MAXCOUNT) - 1;
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
SysTick->VAL = (0x00);
SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE) | (1<<SYSTICK_TICKINT);
return (0);
}
這是這個(gè)函數(shù)的定義,在core_cm3.h里面,是有返回值的,如果你設(shè)置的SystemFrequency / 1000不符合該函數(shù)要求就會(huì)返回1,這樣這個(gè)while循環(huán)是跳不出的,一直在循環(huán),只有你設(shè)置的值符合要求,程序才能跳出循環(huán)繼續(xù)執(zhí)行,這句話一般在SysTick_Config(SystemCoreClock / 1000);這句之后,上面這句已經(jīng)配置好Systick的定時(shí)時(shí)間為1ms,緊接著 while(SysTick_Config(SystemFrequency / 1000)); 是判斷你配置的定時(shí)頻率是否可以實(shí)現(xiàn),如果可以就繼續(xù)往下執(zhí)行,如果不可以就一直停在這里。
SysTick_Config(uint32_t ticks):設(shè)置系統(tǒng)嘀嗒時(shí)鐘并使能中斷
在STM32中與CM3內(nèi)核描述不太一樣,這個(gè)時(shí)鐘源有兩個(gè)選擇:AHB/8和AHB,在該函數(shù)中是選擇了HCLK(SysTick_CTRL_CLKSOURCE_Msk),所以定時(shí)時(shí)間=ticks / HCLK,當(dāng)要定時(shí)10ms,而HCLK為24MHz時(shí),ticks = 10000 * 24 = 240000。
如果需要選擇HCLK/8,可以直接修改這個(gè)函數(shù),或在這個(gè)函數(shù)后跟隨misc中的SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)來(lái)設(shè)置。
