STM32-嵌入式-04-systick系統定時器
阿新 • • 發佈:2018-11-17
systick系統定時器
系統定時器存在核心中,是24位的定時器,只能向下遞減,巢狀在NVIC中
counter 在時鐘的驅動下 在reload的初值開始向下遞減計時到0,產生中斷置位標誌然後又從reload值開始重新遞減計數,迴圈
定時時間計算
t=reload*(1/clk)
clk=72M時,t=72*(1/72m)=1us
clk=72M時,t=72000*(1/72m)=1ms
clk=72M時,t=72000000*(1/72m)=1s
1s=1000MS =1000 000US=1000 000 000NS
sysTick屬於核心中的外設,他的中斷優先順序和外設的中斷優先順序相比,哪個高?
sysTick中斷優先順序配置的是scb->shprx暫存器
而外設的中斷配置的是NVIC->iprx,有優先順序分組和搶佔優先順序和子優先順序的說法。
中斷優先順序在核心外設同樣適用。
systick的使能函式:
static __INLINE uint32_t SysTick_Config(uint32_t ticks) { //判斷tick的值是否大於2^24,如果大於,不符合規則 if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); //初始化reload暫存器的值 SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; //配置中斷優先順序,配置為15,預設為最低優先順序 NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); //初始化counter的值為0 SysTick->VAL = 0; //配置systick的時鐘為72M //使能中斷 //使能systick SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0); /* Function successful */ }
編寫微秒延時函式
void SysTick_Delay_us(uint32_t us)
{
uint32_t i;
SysTick_Config(72);
for(i=0;i<us;i++)
{
//當計數器的值時間到了後,CTRL暫存器位16會置1
while(!((SysTick->CTRL)&(1<<16)));
}
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
利用中斷來進行延時
void SysTick_Init(void) { if(SysTick_Config(SystemCoreClock/100000)) while(1); } void Delay_ms(__IO u32 nTime) { uint32_t TimingDelay; TimingDelay = nTime; while(TimingDelay!=0) TimingDelay--; }