網(wǎng)站總類新開傳奇網(wǎng)站發(fā)布站
1. 什么是中斷
在處理器中,中斷是一個(gè)過程,即CPU在正常執(zhí)行程序的過程中,遇到外部/內(nèi)部的緊急事件需要處理,暫時(shí)中止當(dāng)前程序的執(zhí)行,轉(zhuǎn)而去為處理緊急的事件,待處理完畢后再返回被打斷的程序處繼續(xù)往下執(zhí)行。
在發(fā)送中斷時(shí)。要打斷CPU正在做的事情。要保護(hù)現(xiàn)場,接著根據(jù)中斷向量跳轉(zhuǎn)到中斷服務(wù)函數(shù)執(zhí)行。執(zhí)行完要恢復(fù)現(xiàn)場。CPU繼續(xù)從打斷時(shí)的狀態(tài)運(yùn)行。?
舉個(gè)列子:當(dāng)前正在看書(CPU執(zhí)行),突然客廳的電話響了(中斷請求)。打斷看書(保存現(xiàn)場,當(dāng)前看到第幾頁)。去處理打電話(中斷服務(wù)函數(shù))。打完電話后繼續(xù)看書(恢復(fù) 現(xiàn)場)從打斷的頁繼續(xù)看。
2. 什么是中斷嵌套以及中斷優(yōu)先級
1. 中斷優(yōu)先級
比如CPU正在運(yùn)行有兩個(gè)中斷請求。這時(shí)總有一個(gè)先后。這時(shí)就看這兩個(gè)中斷的優(yōu)先級(程序來設(shè)置)。
2. 中斷嵌套
當(dāng)前正在看書(CPU執(zhí)行),突然客廳的電話響了(中斷請求)。打斷看書(保存現(xiàn)場,當(dāng)前看到第幾頁)。去處理打電話(中斷服務(wù)函數(shù))。這時(shí)水壺開了(水壺比打電話優(yōu)先級高)。
這時(shí)打斷電話去處理水壺開。這就是中斷嵌套。當(dāng)然在處理這前也會有保存現(xiàn)場(打電話)。去處理水壺請求。水壺處理完在處理打電話。打完電話后繼續(xù)看書(恢復(fù) 現(xiàn)場)從打斷的頁繼續(xù)看。
3. 搶占優(yōu)先級與子響應(yīng)優(yōu)先級
1.搶占式優(yōu)先級
望文知義,就是優(yōu)先級高的可以搶占優(yōu)先級的中斷。
具有高搶占式優(yōu)先級的中斷可以在具有低搶占式優(yōu)先級的中斷處理過程中被響應(yīng),即中斷嵌套,或者說高搶占式優(yōu)先級的中斷可以嵌套在低搶占式優(yōu)先級的中斷中。
2. 子優(yōu)先級(響應(yīng)式優(yōu)先級)
望文知義,就是當(dāng)兩個(gè)搶占式優(yōu)先級同時(shí)來時(shí),先處理響應(yīng)式優(yōu)先級高的(誰優(yōu)先級高先響應(yīng)誰)。
當(dāng)兩個(gè)中斷源的搶占式優(yōu)先級相同時(shí),這兩個(gè)中斷將沒有嵌套關(guān)系,當(dāng)一個(gè)中斷到來后,如果正在處理另一個(gè)中斷,這個(gè)后到來的中斷就要等到前一個(gè)中斷處理完之后才能被處理。如果這兩個(gè)中斷同時(shí)到達(dá),則中斷控制器根據(jù)他們的響應(yīng)優(yōu)先級高低來決定先處理哪一個(gè);如果他們的搶占式優(yōu)先級和響應(yīng)優(yōu)先級都相等,則根據(jù)他們在中斷表中的排位順序決定先處理哪一個(gè)。
總結(jié)下便是:搶占式優(yōu)先級>響應(yīng)優(yōu)先級>中斷表中的排位順序
如下函數(shù)設(shè)置中斷分組:
void nvic_priority_group_set(uint32_t nvic_prigroup)
?
?
?
?
3. 什么是異常?
內(nèi)核里的中斷就叫異常(滴答定時(shí)器)。外部發(fā)送的就叫中斷(定時(shí)器溢出中斷,串口接收數(shù)據(jù)中斷)
4. 什么是事件?
?
5. 幫助CPU專門處理中斷的助手NVIC(在內(nèi)核里)?
它可以屏蔽中斷,判斷中斷優(yōu)先級,處理中斷向量。
??
6. 查找手冊可以看到底有多少內(nèi)部中斷與外部中斷。
?
內(nèi)部中斷:如下圖:有16個(gè)。優(yōu)先級一次往下。一般不允許改。
?
外部中斷:(查當(dāng)前芯片有68個(gè))下面只是其中一部分。
?
7. 外部中斷(EXIT)
上圖:中斷流程如下:
?

?
8.程序設(shè)計(jì)?
1. 觸摸按鍵的原理介紹。
原理:觸摸按鍵接在TTP223-BA6的輸入I引腳,Q是輸出接在OUT_4上。芯片引腳PA3上。
當(dāng)手觸摸按鍵時(shí)會有感應(yīng)電容與C41并聯(lián)(電容變大)Q輸出0,??
當(dāng)手松開觸摸按鍵時(shí)會沒有感應(yīng)電容。只有C41(電容變小)Q輸出1。
程序設(shè)計(jì):當(dāng)一按觸摸按鍵就會產(chǎn)生一個(gè)下降沿。把PA3設(shè)置為外部中斷3。并且下降沿觸發(fā)。來翻轉(zhuǎn)LED1。
9. 程序代碼實(shí)現(xiàn)
EXTI.h
#ifndef _EXTI_H
#define _EXTI_H#include "gd32f10x.h"
#include <stdio.h>void EXTI_Init(void);
void EXTI3_IRQHandler(void);#endif
EXTI.c
#include "EXTI.h"
#include "LED.h"// 外部中斷的初始化函數(shù)
void EXTI_Init(void){/* 使能復(fù)用時(shí)鐘 */rcu_periph_clock_enable(RCU_AF);/* 使能中斷,并設(shè)置中斷優(yōu)先級 *//* 參數(shù)1:中斷類型 參數(shù)2:搶占優(yōu)先級 參數(shù)3:子優(yōu)先級 */nvic_irq_enable(EXTI3_IRQn, 2U, 2U);// 初始化EXTI線,并設(shè)置中斷觸發(fā)方式/* 參數(shù)1:中斷線 參數(shù)2:中斷模式 參數(shù)3:中斷類型 */exti_init(EXTI_3, EXTI_INTERRUPT, EXTI_TRIG_FALLING);/* 清除中斷發(fā)生的標(biāo)志 */exti_interrupt_flag_clear(EXTI_3);/* 選擇中斷源 */gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_3);
}// EXTI3(按鍵D)過來的中斷的服務(wù)函數(shù)
void EXTI3_IRQHandler(void){LED2_Toggle();exti_interrupt_flag_clear(EXTI_3); /* 清除中斷發(fā)生的標(biāo)志 */
}
main.c
#include "LED.h"#include "EXTI.h"int main(){LED_Init();EXTI_Init();while(1){}
}
?
?