在"嵌入式學習006_Systick使用(一)"中,詳細介紹了Systick中寄存器的使用方法,用到了很多函數,實際上到了3.5版本的標準固件庫中,移除了相關驅動函數,用戶必須調用CMSIS.h中定義的函數,其中CMSIS只提供了一個Systick設置的函數,替代了STM32原來有的所有的驅動函數,這樣做的目的,可能是簡化Systick 的設置,可是降低了用戶對SysTick的可控性。
在CMSIS中提供的函數是SysTick_Config(uint32_t ticks); 該函數設置了自動重載入計數器(LOAD)的值,SysTick IRQ的優(yōu)先級,復位了計數器(VAL)的值,開始計數并打開SysTick IRQ中斷。SysTick時鐘默認使用系統(tǒng)時鐘。
其中這個函數定義在Core_cm3.h中 ,源代碼如下所示:
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk)return (1);
SysTick->LOAD= (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
SysTick->VAL= 0;
SysTick->CTRL= SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk|
SysTick_CTRL_ENABLE_Msk;
return (0);}
從上面的函數中可以看出,這個函數把Systick的初值,中斷優(yōu)先級,使能中斷,開啟定時器都完成了。大大簡化了程序。
其中ticks 代表的是初值。例如系統(tǒng)時鐘是72Mhz 那么要產生1ms的時基,那么我們可以這樣去寫。
SysTick_Config(SystemCoreClock/1000);當然也可以寫成:SysTick_Config(72000);
了解了這些,我們可以用它來做一個簡單的延時函數delay_ms(u16 time);
代碼如下:
void delay_ms(u16 time)
{
nTime=time ;/nTime 是個全局變量 可設 extern u16 nTime;/
while(nTime);
}
在中斷函數中直接加入nTime--;
在主函數 初始化過程中 加入SysTick_Config(72000);