STM32-(SysTick定時器,EXTI外部中斷/事件控制器)
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).