Systick系統定時器
介紹:systick定時器上屬於CM3內核中的一個外設,內嵌在NVIC中。系統定時器是一個24位向下計數的計數器,計數器每一次計數的時間是1/SYSTICK,一般我們設置SYSTICK爲72M。當重載數值寄存器的值遞減到0時,系統定時器產生一次中斷,以此循環。
使用範圍:1.一般用於操作系統,用於產生時基,維持操作系統的心跳。
使用的寄存器:CTRL,LOAD,VAL,CALIB;
例程1:利用systick產生1s的時基。
步驟:
1.設置重載寄存器的值
2.清除當前數值寄存器的值
3.配置控制於狀態寄存器
systick配置庫函數:
_STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
//不可能的重裝載值,超出範圍
if((ticks - 1UL)>SysTick_LOAD_RELOAD_Msk){
return (1UL);
}
//設置重裝載寄存器
SysTick->LOAD = (uint32_t)(tiicks - 1UL);
//設置中斷優先級
NVIC_SetPriority(SysTick_IRQn,(1UL<<NVIC_PRIO_BITS)-1UL);
//設置當前數值寄存器
SysTick->VAL = OUL;
//設置系統定時時鐘源爲AHBCLK=72M
//使能系統定時器中斷
//使能定時器
SysTick->CTRL = SysTIck_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;
return (OUL);
}
用固件庫編程的時候我們只需要調用庫函數SysTick_Config()即可,形參ticks用來設置重裝載寄存器的值,最大不能超過重裝載寄存器的值2^24,當重載寄存器的值遞減到0的時候產生中斷,然後重載寄存器的值又重新裝載往下計數,以此循環。
設置中斷優先級:
void NVIC_SetPriority(IRQn_Type IRQn,uin32_t priority)
{
if((int32_t) IRQ<0){
SCB->SHP[(((uint32_t)(int32_t))IRQn)&0XFUL)-4UL] = (uint8_t)((priority<<(8-_NVIC_PRIO_BITS)) &(uint32_t)0xffUL);
}
}
使用:NVIC_SetPriority(Systick_IRQn,(1UL<<_NVIC_PRIO_BITS)-1UL);
配置系統定時器的時鐘(AHBCLK)爲72M:
SysTick初始化函數:
void SysTick__Init(void)
{
/*systickFrequency / 1000 1ms中斷一次*/
/*systickFrequency / 100000 10us中斷一次*/
/*systickFrequency / 1000000 1us中斷一次*/
if(SysTick_Config(SystemCoreClock / 100000)){
while(1);
}
}
這個函數決定了多長時間產生一次中斷。
使能定時器和定時器中斷:
函數Delay_us()中我們等待TimingDelay爲0,當它爲零時表示延時時間到了。所以systick每進一次中斷即10us時間
SysTick中斷服務函數:
void TimingDelay_Decrement(void)
{
if(TimingDelay !=0x00)
{
TimingDelay--;
}
}
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
TimingDelay的值等於延時函數中傳進去的nTime的值,比如nTime=100000,則延時時間等於100000*10us = 1s。
EXTI外部中斷/事件控制器
EXTI(external interrupt/event controller) 一外部中斷/事件控制器,管理了控制器的20箇中斷/事件線。每個中斷/事件線都對應有一個邊沿檢測器,可以實現輸入信號的上升沿檢測和下降沿的檢測。EXTI可以實現對每個中斷/事件進行單獨配置,可以單獨配置爲中斷或者事件,以及觸發事件的屬性。
EXTI的功能框圖:
EXTI可以分爲兩部分功能,一個產生中斷,一個產生事件,這兩個功能在硬件上就有所不同。
**中斷與事件的區別:產生中斷的線路的目的上把輸入信號輸入到NVIC,進一步會運行中斷服務函數,實現功能,這樣是軟件級別的。而產生事件線路目的就是傳輸一個脈衝信號給其他外設使用,並且是電路級別的信號傳輸,屬於硬件級別的。
紅色線路上EXTI產生中斷的線路,綠色線路上EXTI產生事件的線路。
EXTI初始化結構體詳解
typedef struct{
uint32_t EXTI_Line; //中斷/事件線
EXTIMode_TypeDef EXTI_Mode;//EXTI模式
EXTITrigger_TypeDef EXTI_Trigger;//觸發類型
FunctionalState EXTI_LineCmd;//EXTI使能
}EXTI_InitTypeDef;
1.EXTI_Line:EXTI中斷/事件選擇,參考上表。
2.EXTI_MODE:EXTI模式選擇,可以選擇是產生中斷還是事件。
3.EXTI_Trigger:EXTI邊沿觸發事件,可以選擇上升沿觸發還是下降沿觸發或者是邊沿觸發。
4.EXTI_LineCmd:控制是否使能EXTI線,可選使能EXTI線(ENABLE)或禁用(DISABLE).