程序存儲(chǔ)器空間最低的一些地址,被默認(rèn)定義為復(fù)位和中斷向量。完整的向量列表見(jiàn)“中斷”部分。該列表也決定了不同中斷的優(yōu)先級(jí)。地址越小,優(yōu)先級(jí)越高。RESET具有最高的優(yōu)先級(jí),其次是INT0——外部中斷請(qǐng)求0。詳細(xì)討論見(jiàn)“中斷”部分。
當(dāng)某個(gè)中斷產(chǎn)生時(shí),全局中斷使能位I被清零,所有中斷都被禁止。用戶程序可以向I位寫入1,以實(shí)現(xiàn)中斷嵌套。所有已使能的中斷就可以中斷當(dāng)前的中斷程序。當(dāng)從中斷指令——RETI——的執(zhí)行返回時(shí),I位被自動(dòng)置位。
基本上有兩種類型的中斷。第一種是由事件觸發(fā)的,把中斷標(biāo)志置位。對(duì)于這些中斷,程序計(jì)數(shù)器被引導(dǎo)到實(shí)際的中斷向量,以執(zhí)行中斷處理程序,同時(shí)硬件把相應(yīng)的中斷標(biāo)志清除。通過(guò)向要清除的標(biāo)志位位置寫一個(gè)邏輯1,也可以被清除中斷標(biāo)志。如果中斷使能位被清除后,相應(yīng)的中斷條件發(fā)生時(shí),中斷標(biāo)志將被設(shè)置,而后保持到中斷被使能為止,或者由軟件把標(biāo)志清除。類似地,如果在全局中斷使能位被清除后,一個(gè)或多個(gè)中斷條件產(chǎn)生時(shí),相應(yīng)的中斷標(biāo)志將被設(shè)置,并保持到全局中斷使能位被設(shè)置為止,然后按優(yōu)先級(jí)順序執(zhí)行。
第二種中斷,只要中斷條件存在,就會(huì)被觸發(fā)。這些中斷沒(méi)有必要具有中斷標(biāo)志。如果中斷條件在中斷被使能前消失,那么中斷將不被觸發(fā)。
當(dāng)AVR從一個(gè)中斷中退出時(shí),它一般會(huì)返回主程序,并且執(zhí)行再執(zhí)行一條指令后,才會(huì)響應(yīng)后續(xù)的中斷。
注意,當(dāng)進(jìn)入中斷程序時(shí)狀態(tài)寄存器不會(huì)自動(dòng)保存,當(dāng)從中斷程序返回時(shí),它也不會(huì)自動(dòng)恢復(fù)。這必須由用戶軟件來(lái)完成。
當(dāng)使用CLI指令禁能中斷時(shí),中斷將立即被禁能。當(dāng)CLI指令執(zhí)行后,將沒(méi)有中斷再被執(zhí)行,即使中斷在CLI執(zhí)行的同時(shí)發(fā)生。下例所示為怎樣使用CLI指令來(lái)避免在定時(shí)的EEPROM寫時(shí)序期間避免產(chǎn)生中斷。
| 匯編代碼例子 |
| in r16, SREG ; 保存SREG值 cli ; 在定時(shí)程序中禁能中斷 sbi EECR, EEMWE ; 開(kāi)始寫入EEPROM sbi EECR, EEWE out SREG, R16 ; 恢復(fù)SREG值(I位) |
| C代碼例子 |
| char cSREG; cSREG = SREG; /* 保存SREG值*/ /* 在定時(shí)程序中禁能中斷 */ _CLI (); EECR = (1<<EEMWE); EECR = (1<<EEWE); /* 開(kāi)始寫入EEPROM */ SREG = cSREG; /* 恢復(fù)SREG值(I位) */ |
當(dāng)使用SEI指令來(lái)使能中斷時(shí),緊跟在SEI后面的指令將在任何后續(xù)的中斷前被執(zhí)行,示例如下。
| 匯編代碼例子 |
| sei ; 置位全局中斷使能 sleep ; 進(jìn)入休眠,等待中斷 ; 注意:將在任意中斷前進(jìn)入休眠 |
| C代碼例子 |
| _SEI(); /* 置位全局中斷使能 _SLEEP(); /* 進(jìn)入休眠,等待中斷 */ /* 注意:將在任意中斷前進(jìn)入休眠 */ |
中斷響應(yīng)時(shí)間
對(duì)于所有使能的AVR中斷,中斷執(zhí)行響應(yīng)最少為四個(gè)時(shí)鐘周期。在四個(gè)時(shí)鐘周期之后,實(shí)際中斷處理程序的向量地址被執(zhí)行。在這四個(gè)時(shí)鐘周期內(nèi),程序指針(PC)被壓入堆棧。該失量正常為一到中斷程序的跳轉(zhuǎn),并且該跳轉(zhuǎn)花費(fèi)三個(gè)時(shí)鐘周期。如果中斷發(fā)生在一個(gè)多周期指令的執(zhí)行期間,在中斷被響應(yīng)前,該指令要執(zhí)行完畢。如果當(dāng)MCU在休眠模式中有中斷產(chǎn)生,那么該中斷響應(yīng)時(shí)間要再增加四個(gè)時(shí)鐘周期。這是由于從選擇的睡眠模式中喚醒需要啟動(dòng)時(shí)間。
從中斷處理程序返回需要四個(gè)時(shí)鐘周期。在這四個(gè)時(shí)鐘周期內(nèi),程序指針(兩個(gè)字節(jié))從堆棧中被彈出,堆棧指針加2,SREG的I位被置位。





