STM32入門 之 中斷
阿新 • • 發佈:2018-11-25
首先弄清楚幾個問題:
1、什麼是中斷?
CPU在執行一個程式時,對系統發生的某個事件(程式自身或外界的原因)作出的一種反應:CPU暫停正在執行的程式,保留現場後自動轉去處理相應的事件,處理完該事件後,到適當的時候返回斷點,繼續完成被打斷的事情。
舉個例子:當你在上班,然後你的老闆來了(中斷),叫你去處理某些事情(中斷函式),你只好放下手中的事情去處理老闆給的事情,處理完以後你繼續回來工作(返回斷點)。
2、中斷系統有什麼功能?
1、實現中斷與返回
提醒進行中斷,和返回之前做的事情。(提醒老闆來找你處理事務,處理完事務之後返回繼續手中的工作)
2、實現優先順序排隊
進行優先順序的配置,優先順序高的優先執行。(如果你的老闆和同事同時找你想讓你處理事務,因為老闆優先順序更高,優先處理老闆的事情後再去處理同事的事情)
3、高階中斷源能中斷低階的中斷處理
高階的中斷事件可以中斷低階的中斷事件(當你正在解決同事的事情的時候, 你的老闆找你有事,所以先解決老闆的事再回來解決同事的事)
3、雜項
1、優先順序需要進行配置。 2、中斷可以由內部給出,也可以外界提供。 3、中斷有軟體識別(主動詢問老闆或者同事是否需要中斷)和向量中斷(老闆或者同事來了再詢問是否需要中斷)識別。
eg:以時鐘的中斷為例
上程式碼:
void Tim_Init(void) { TIM_TimeBaseInitTypeDef TIM;//定義時鐘結構體用於初始化 NVIC_InitTypeDef NVIC_InitStructure;//定義用於初始化中斷優先順序 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設定分組為2 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);//開啟時鐘 TIM.TIM_Prescaler = 7199;//預分頻 TIM.TIM_CounterMode = TIM_CounterMode_Up ;//計數器(裝載值)模式,向上計數 TIM.TIM_Period = 9999;//定義時鐘的裝載值 TIM.TIM_ClockDivision = TIM_CKD_DIV1;//分頻因子 TIM.TIM_RepetitionCounter = 0;//重複計數的值 TIM_TimeBaseInit(TIM5,&TIM);//呼叫庫函式,初始化 NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;//選定配置TIM5的中斷優先順序 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//搶佔優先順序為0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//響應優先順序位0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//開啟使能 NVIC_Init(&NVIC_InitStructure); //清除標誌 TIM_ClearFlag(TIM5, TIM_FLAG_Update); // 開啟計數器中斷 TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE); // 使能計數器 TIM_Cmd(TIM5, ENABLE); } /*定時公式: T= (TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK 其中TIMxCLK為脈衝頻率,一般為72M*/ //基本定時器少TIM.TIM_CounterMode TIM.TIM_ClockDivision TIM.TIM_RepetitionCounter void TIM5_IRQHandler(void)//中斷函式 { if(TIM_GetITStatus(TIM5,TIM_IT_Update) != RESET) { s++; TIM_ClearITPendingBit(TIM5,TIM_FLAG_Update); } }