1、中斷函數
因爲某個事件的發生,CPU暫停當前正在執行的程序,轉而執行處理事件的一個程序。該程序執行完成後,CPU接着執行被暫停的程序。這個過程稱爲中斷。(我正在捉泥鰍,可是我媽喊我回家吃飯,我必須回家吃飯,回家途中,發現泥鰍沒帶,回去把泥鰍帶回家,而後吃完飯繼續捉泥鰍!!!)spa
中斷是CPU處理外部突發事件的一個重要技術。引發中斷的緣由或者說發出中斷請求的來源叫作中斷源。根據中斷源的不一樣,能夠分爲硬件中斷和軟件中斷兩大類,有了中斷,系統能夠更好更快的利用有限的系統資源解決系統響應速度和運行效率的一種控制技術。它的做用就是可使你的電腦系統運行更快更平穩。調試
一方面,有了中斷功能,系統就可使CPU和外設同時工做,使系統能夠及時的響應外部事件。並且有了中斷功能,CPU能夠容許多個外設同時工做。這樣就大大提升了CPU的利用率,也提升了數據輸入、輸出速度。另外一方面,有了中斷功能,就可使CPU及時處理各類軟硬件故障。計算機在運行過程當中,每每會出現事先預料不到的狀況或出現一些故障,如電源掉電,存儲出錯,運算溢出等等。計算機能夠利用中斷處理系統自行處理,而沒必要停機或報告工做人員。code
一、硬件中斷根據來源的位置分爲:blog
內部中斷(不可屏蔽中斷):少數,中斷源在CPU的內部,如忽然掉電,奇偶校驗錯、除數爲0、運算溢出、單步中斷(軟件調試時可使用,每執行一條指令,就中斷一次)等事件
外部中斷(可屏蔽中斷):多數,中斷源在CPU的外部,通常是指由計算機外設發出的中斷請求,如鍵盤中斷、打印機中斷、定時器中斷。可使用中斷控制器屏蔽外部設備的中斷。ip
二、是否可屏蔽分爲:資源
可屏蔽中斷it
不可屏蔽中斷io
三、中斷來源:
軟件中斷
硬件中斷
2、中斷與事件
概念:
事件:是表示檢測到某一動做(電平邊緣)觸發事件發生了,由硬件自動完成的觸發到產生結果的通道解決(響應速度快)。
中斷:有某個事件發生併產生中斷,並跳轉到對應的中斷處理程序中,須要CPU接入(響應速度慢)。
區別:
中斷有可能被更優先的中斷屏蔽,事件不會;事件本質上就是一個觸發信號,是用來觸發特定的外設模塊或核心自己(喚醒);事件只是一個觸發信號(脈衝),而中斷則是一個固定的電平信號;事件是中斷的觸發源,事件能夠觸發中斷,也能夠不觸發,開放了對應的中斷屏蔽位,則事件能夠觸發相應的中斷。事件仍是其它一些操做的觸發源,好比DMA(Direct Memory Access,直接存儲器存取),還有TIM中影子寄存器的傳遞與更新。
簡言之,中斷必定要有中斷服務函數,中斷必需要CPU介入,可是事件卻沒有對應的函數。事件能夠在不須要CPU干預的狀況下,執行某些操做,事件機制提供了一個徹底由硬件自動完成的觸發到產生結果的通道,不要軟件的參與,下降了CPU的負荷,節省了中斷資源,提升了響應速度(硬件總快於軟件),是利用硬件來提高CPU芯片處理事件能力的一個有效方法;
3、實驗內容
實驗中按下按鍵0觸發中斷線4,搶佔優先級2,子優先級爲2,中斷反應函數EXTI4_IRQHandler(),控制LED0和LED1的狀態取反
一、初始化IO口爲輸入 KEY_Init();
二、開啓AFIO時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
三、設置IO口與中斷線的映射關係 GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);
四、初始化線上中斷,設置觸發條件等 EXTI_Init(&KST_EXTI_Structure);
五、配置中斷分組(NVIC),並使能中斷 NVIC_Init(&KST_NVIC_Structure);
六、編寫中斷服務函數 EXTI4_IRQHandler();
七、清除中斷服務函數 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