SysTick:系統定時器,24位,只能遞減,存在於內核中,嵌套在NVIC中,在全部的Cortex-M內核得單片機都有這個定時器! SysTick功能框圖 ui
這其中的遞減計數器前方有介紹,是24位的,二重裝載計數器和遞減計數器一致也是24位的3d
SysTick主要配置這三個寄存器code
系統時鐘通常設置爲72MHZ,也就是說遞減計時器每減1,通過的時間爲1/72Mblog
須要配置的寄存器結構體it
typedef struct
io
{
配置
__IO uint32_t CTRL; /*!< Offset: 0x00 SysTick 控制狀態寄存器*/
循環
__IO uint32_t LOAD; /*!< Offset: 0x04 SysTick 重裝載寄存器*/
定時器
__IO uint32_t VAL; /*!< Offset: 0x08 SysTick 當前數值寄存器*/
im
__I uint32_t CALIB; /*!< Offset: 0x0C SysTick 校準寄存器*/
} SysTick_Type;
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk)
return (1); /* 判斷寫入到重載寄存的值是否小於2的24次方*/
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /*初始化重載寄存器的值*/
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /*配置中斷優先級,配置爲15,默認爲最低的優先級**注意**這裏的優先級因爲是內核,它和外設優先級配置不同 ,內核配置優先級只配置一個數字,這裏與外設配置優先級配置時的既配置搶佔優先級又配置響應優先級不同*/
SysTick->VAL = 0; /* 初始化計數值*/
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* 配置時鐘爲72M,使能中斷,使能SysTick*/
return (0);
}
void SysTick_Delay_ms(uint32_t ms)
{
`uint32_t i;` `SysTick_Config(72000);/*配置1個技術循環的時間,72000爲1ms,72爲1us*/` `for(i=0;i<ms;i++)` `{` `while( !((SysTick->CTRL) & (1<<16)) );/*讀出控制和狀態寄存器,與上第16位,至關於讀出CTRL的COUNTFLAG這個位的值,當這個位爲1時,說明SysTick已經計數到了0*/` `}`
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;/*與在取反就是將各個位徹底清零*/
}
這樣就能夠完成一個毫秒級的計數器了