STC15系列MCU —— IAP15W4K58S4 外部中斷 編程筆記
假如需要檢測一個按鍵是否按下,如果用查詢方式在主循環(huán)中檢測按鍵所在IO口的狀態(tài)會消耗很多CPU的資源,而且當程序很大的時候可能會丟失持續(xù)時間短的事件,因此就有了中斷,CPU不用時刻去查詢引腳的電平狀態(tài),只有當引腳電平發(fā)生跳變的時候才會觸發(fā)中斷,此時CPU跳轉到中斷服務函數(shù),去執(zhí)行特定的業(yè)務代碼。
下面分享STC15系列 MCU —— IAP15W4K58S4 外部中斷的代碼編寫筆記
1.外部中斷初始化
這個型號的單片機有 5 路外部中斷,前 2 路—— INT0 ~ INT1 可以選擇中斷源類型,可以設置中斷優(yōu)先級,還有中斷請求標志位,比較“高級”,后 3 路—— INT2 ~ INT4 則沒有這 3 個功能,比較“低級”。
1.1 對于“高級外部中斷”的初始化 —— INT0 和 INT1
配置“高級外部中斷”需要操作的寄存器都可位尋址,所以可以直接對某個位操作,編程時不需要查詢各 bit 的定義
清除中斷請求標志位(IE —— Interrupt Enquiry ——位于 定時器&計數(shù)器中斷控制寄存器(TCON))
程序運行過程中不需要用戶管理:該位在有中斷請求時會硬件置 1,中斷響應完成后會硬件清 0
初始化時讓 IE0 = 0 / IE1 = 0 (穩(wěn)妥起見手動賦值,不進行該操作也不會有啥問題——上電復位默認為0)
選擇中斷源類型(IT —— Interrupt Type ——位于定時器&計數(shù)器中斷控制寄存器(TCON))
IT0 = 1 / IT1 = 1 時,外部中斷引腳檢測到 下降沿電平?觸發(fā)外部中斷
IT0 = 0 / IT1 = 0 時,外部中斷引腳檢測到 上升沿電平或者下降沿電平?都能觸發(fā)外部中斷
設置中斷優(yōu)先級(PX —— Priority Of External Interrupt ——位于中斷優(yōu)先級控制寄存器(IP))????????
PX0 = 0 / PX1 = 0,配置 INT0 /?INT1 為最低優(yōu)先級
PX0 = 1 / PX1 = 1,配置 INT0 /?INT1 為最高優(yōu)先級
使能外部中斷(EX —— External ——位于中斷允許寄存器(IE))
讓 EX0 = 1 / EX1 = 1 以使能 外部中斷0(EXINT0)/ 外部中斷1(EXINT1)
使能總中斷(EA —— Enable All ——位于中斷允許寄存器(IE))
讓 EA = 1 以開啟總中斷
總中斷相當于中斷的總開關
1.2 對于“低級的外部中斷”—— INT2 和 INT3 和 INT4
由于“低級的外部中斷”的寄存器有的不支持位尋址,因此編程時要查詢寄存器各 bit 的定義
沒有中斷請求標志位,不能選擇中斷類型,不能配置中斷優(yōu)先級(datasheet上這么說,但 EXINT4 有點特殊)
使能外部中斷(EX——External——位于外部中斷允許和時鐘輸出寄存器(INT_CLKO)(AUXR2))
該寄存器不可位尋址,需要對整個寄存器進行操作
讓 EX2 = 1 / EX3 = 1 / EX4 = 1 以使能 外部中斷2(EXINT2)/外部中斷3(EXINT3)/ 外部中斷4(EXINT4)
使能總中斷(EA —— Enable All ——位于中斷允許寄存器(IE))
讓 EA = 1 以開啟總中斷(該步驟與操作“高級的外部中斷”時一致)

2.?中斷服務函數(shù)的編寫
格式:void (函數(shù)名)(void) interrupt (中斷服務號定義)
函數(shù)名可以任寫
中斷服務號參考 STC15 各中斷服務號定義,從中選擇對應的中斷,中斷服務號可以在頭文件中找到
頭文件中的中斷服務號宏定義
3.對于 EXINT4 優(yōu)先級的碎碎念
datasheet中提到 EXINT4 的優(yōu)先級固定為最低,但是 IP2 寄存器中存在控制 EXINT4 中斷優(yōu)先級的位,兩者矛盾。

進行了實驗得出了如下結果
EXINT0 設置為最低優(yōu)先級, EXINT4 設置為最高優(yōu)先級時:雙方都無法打斷對方的中斷服務函數(shù)
兩個都設置為最高優(yōu)先級時:雙方都無法打斷對方中斷服務函數(shù)
EXINT0 設置為最高優(yōu)先級,EXINT4 設置為最低優(yōu)先級時:EXINT0 的中斷服務函數(shù)可以打斷?EXINT4的中斷服務函數(shù),但是 EXINT4 的中斷服務函數(shù)無法打斷 EXINT0?的中斷服務函數(shù)
結論:
EXINT4 配置為最低優(yōu)先級時,與其他“低級外部中斷”的效果一致
EXINT4 配置為最高優(yōu)先級時,可以不被任何外部中斷打斷,但是也無法打斷 EXINT0 和 EXINT1 的中斷服務函數(shù),