一、中斷 由於某個事件的發生,CPU暫停當前正在執行的程式,轉而執行處理事件的一個程式。該程式執行完成後,CPU接著執行被暫停的程式。這個過程稱為中斷。(我正在捉泥鰍,但是我媽喊我回家吃飯,我必須回家吃飯,回家途中,發現泥鰍沒帶,回去把泥鰍帶回家,然後吃完飯繼續捉泥鰍!!!) 中斷是CPU處理外部突 ...
一、中斷
由於某個事件的發生,CPU暫停當前正在執行的程式,轉而執行處理事件的一個程式。該程式執行完成後,CPU接著執行被暫停的程式。這個過程稱為中斷。(我正在捉泥鰍,但是我媽喊我回家吃飯,我必須回家吃飯,回家途中,發現泥鰍沒帶,回去把泥鰍帶回家,然後吃完飯繼續捉泥鰍!!!)
中斷是CPU處理外部突發事件的一個重要技術。引起中斷的原因或者說發出中斷請求的來源叫做中斷源。根據中斷源的不同,可以分為硬體中斷和軟體中斷兩大類,有了中斷,系統可以更好更快的利用有限的系統資源解決系統響應速度和運行效率的一種控制技術。它的作用就是可以使你的電腦系統運行更快更平穩。
一方面,有了中斷功能,系統就可以使CPU和外設同時工作,使系統可以及時的響應外部事件。而且有了中斷功能,CPU可以允許多個外設同時工作。這樣就大大提高了CPU的利用率,也提高了數據輸入、輸出速度。另一方面,有了中斷功能,就可以使CPU及時處理各種軟硬體故障。電腦在運行過程中,往往會出現事先預料不到的情況或出現一些故障,如電源掉電,存儲出錯,運算溢出等等。電腦可以利用中斷處理系統自行處理,而不必停機或報告工作人員。
1、硬體中斷根據來源的位置分為:
內部中斷(不可屏蔽中斷):少數,中斷源在CPU的內部,如突然掉電,奇偶校驗錯、除數為0、運算溢出、單步中斷(軟體調試時可以使用,每執行一條指令,就中斷一次)等
外部中斷(可屏蔽中斷):多數,中斷源在CPU的外部,一般是指由電腦外設發出的中斷請求,如鍵盤中斷、印表機中斷、定時器中斷。可以使用中斷控制器屏蔽外部設備的中斷。
2、是否可屏蔽分為:
可屏蔽中斷
不可屏蔽中斷
3、中斷來源:
軟體中斷
硬體中斷
二、中斷與事件
概念:
事件:是表示檢測到某一動作(電平邊緣)觸發事件發生了,由硬體自動完成的觸發到產生結果的通道解決(響應速度快)。
中斷:有某個事件發生並產生中斷,並跳轉到對應的中斷處理程式中,需要CPU接入(響應速度慢)。
區別:
中斷有可能被更優先的中斷屏蔽,事件不會;事件本質上就是一個觸發信號,是用來觸發特定的外設模塊或核心本身(喚醒);事件只是一個觸發信號(脈衝),而中斷則是一個固定的電平信號;事件是中斷的觸發源,事件可以觸發中斷,也可以不觸發,開放了對應的中斷屏蔽位,則事件可以觸發相應的中斷。事件還是其它一些操作的觸發源,比如DMA(Direct Memory Access,直接存儲器存取),還有TIM中影子寄存器的傳遞與更新。
簡言之,中斷一定要有中斷服務函數,中斷必須要CPU介入,但是事件卻沒有對應的函數。事件可以在不需要CPU干預的情況下,執行某些操作,事件機制提供了一個完全由硬體自動完成的觸發到產生結果的通道,不要軟體的參與,降低了CPU的負荷,節省了中斷資源,提高了響應速度(硬體總快於軟體),是利用硬體來提升CPU晶元處理事件能力的一個有效方法;
三、實驗內容
實驗中按下按鍵0觸發中斷線4,搶占優先順序2,子優先順序為2,中斷反應函數EXTI4_IRQHandler(),控制LED0和LED1的狀態取反
1、初始化IO口為輸入 KEY_Init();
2、開啟AFIO時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
3、設置IO口與中斷線的映射關係 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);
4、初始化線上中斷,設置觸發條件等 EXTI_Init(&KST_EXTI_Structure);
5、配置中斷分組(NVIC),並使能中斷 NVIC_Init(&KST_NVIC_Structure);
6、編寫中斷服務函數 EXTI4_IRQHandler();
7、清除中斷服務函數 EXTI_ClearITPendingBit(EXTI_Line4);
1 #include "exti.h" 2 #include "key.h" 3 #include "led.h" 4 #include "beep.h" 5 #include "delay.h" 6 #include "usart.h" 7 8 9 void EXTIX_Init(void) 10 { 11 EXTI_InitTypeDef KST_EXTI_Structure; 12 NVIC_InitTypeDef KST_NVIC_Structure; 13 14 KEY_Init(); //按鍵初始化 15 16 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //使能IO口復用時鐘 17 18 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4); //設置IO口與中斷線的映射關係 19 20 KST_EXTI_Structure.EXTI_Line = EXTI_Line4; //配置中斷線4 21 KST_EXTI_Structure.EXTI_LineCmd = ENABLE; //使能 22 KST_EXTI_Structure.EXTI_Mode = EXTI_Mode_Interrupt; //外部中斷 23 KST_EXTI_Structure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發 24 EXTI_Init(&KST_EXTI_Structure); //初始化線上中斷,設置觸發條件 25 26 KST_NVIC_Structure.NVIC_IRQChannel = EXTI4_IRQn; 27 KST_NVIC_Structure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能 28 KST_NVIC_Structure.NVIC_IRQChannelPreemptionPriority = 2;//搶占優先順序2 29 KST_NVIC_Structure.NVIC_IRQChannelSubPriority = 2; //子優先順序2 30 NVIC_Init(&KST_NVIC_Structure); //中斷優先順序初始化 31 32 } 33 34 void EXTI4_IRQHandler(void) 35 { 36 delay_ms(10); 37 if(KEY0==0) 38 { 39 LED0 = !LED0; 40 LED1 = !LED1; 41 } 42 EXTI_ClearITPendingBit(EXTI_Line4); //手動清除中斷線4的標誌位 43 }
主函數
1 #include "sys.h" 2 #include "exti.h" 3 #include "beep.h" 4 #include "key.h" 5 #include "delay.h" 6 #include "led.h" 7 #include "usart.h" 8 9 int main() 10 { 11 delay_init(); 12 LED_Init(); //LED初始化 13 KEY_Init(); //按鍵初始化 14 BEEP_Init(); //蜂鳴器初始化 15 EXTIX_Init(); //外部中斷初始化 16 uart_init(115200); //串口初始化 17 LED0 = 0; 18 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先順序,2位響應優先順序 19 while(1) 20 { 21 printf("OK\r\n"); 22 delay_ms(1000); 23 } 24 25 } 26 27