嵌入式單片機,ATmega328P,外部中斷INT0,INT1,INT2,中斷標志位介紹


三個外部中斷INT0,INT1,INT2;對應由芯片外部引腳PD2、PD3、PB2上的電平的變化或狀態作為中斷觸發信號。
    INT0、INT1、INT2的中斷觸發方式取決於用戶程序對MCU控制寄存器(MCUCR)以及MCU控制與狀態寄存器(MCUCSR)的設定。其中,INT0和INT1支持4種中斷觸發方式,INT2支持2種。

INT0 INT1 INT2 說明
上升沿觸發 Yes Yes Yes(異步)
下降沿觸發 Yes Yes Yes(異步)
任意電平變化觸發 Yes Yes ——
低電平觸發 Yes Yes —— 無中斷標志
任意電平變化觸發表示只要引腳上有邏輯電平的變化就會產生中斷申請(不管是上升沿還是下降沿都引起中斷觸發)。
▋低電平觸發是不帶中斷標志類型的,即只要中斷輸入引腳PD2或PD3保持低電平,那么將一直會產生中斷申請。
▋MCU對INT0和INT1的引腳上的上升沿或下降沿變化的識別(觸發),需要I/O時鍾信號的存在(由I/O時鍾同步檢測),屬於同步邊沿觸發的中斷類型。
▋MCU對INT2的引腳上的上升沿或下降沿變化的識別(觸發),以及低電平的識別(觸發)是通過異步方式檢測的,不需要I/O時鍾信號的存在。因此,這類觸發類型的中斷經常作為外部喚醒源, 用於將處在 Idle 休眠模式,以及處在各種其它休眠模 式的 MCU 喚醒。這是由於除了在空閑(Idel)模式時,I/O 時鍾信號還保持繼續工 作,在其它各種休眠模式下,I/O 時鍾信號均是處在暫停狀態的。
▋如果設置了允許響應外部中斷的請求,那么即便是引腳PD2、PD3、PB2設置為輸出方式工作,引腳上的電平變化也會產出外部中斷觸發請求。這一特性為用戶提供了使用軟件中斷的途徑

與外部中斷相關的寄存器和標志位
   除了寄存器SREG中的全局中斷允許標志位I外,與外部中斷有關的寄存器有4個,共有11個標志位。其作用分別是3個外部中斷各自的中斷標志位中斷允許控制位,和用於定義外部中斷的觸發類型
1)、MCU控制寄存器——MCUCR    (ATmega328P EICRA - External Interrupt Control Register A外部中斷控制寄存器A(0x69))
    MCU控制寄存器MCUCR的低4位為INT0(ISCO1,ISC00)INT1(ISC11、ISC10)中斷觸發類型控制位,中斷觸發方式:
7 6 5 4 3 2 1 0
$35($0055) SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00
讀/寫 R/W  R/W  R/W  R/W  R/W  R/W  R/W  R/W
初始化值 0 0 0 0 0 0 0 0

INT0、INT1的中斷觸發方式
ISCn1 ISCn0 中斷觸發方式
0 0 INTn的低電平產生一個中斷請求
0 1 INTn的下降沿和上升沿都產生一個中斷請求
1 0 INTn的下降沿產生一個中斷請求
1 1 INTn的上升沿產生一個中斷請求
MCU對INT0、INT1引腳上電平值的采樣在邊沿檢測前。如果選擇脈沖邊沿觸發或電平變化中斷的方式,那么在INT0、INT1引腳上的一個脈寬大於一個時鍾周期的脈沖變化將觸發中斷,過短的脈沖則不能保證觸發中斷。如果選擇低電平觸發中斷,中斷請求將一直保持到引腳上的低電平消失為止。

2)、MCU控制和狀態寄存器——MCUCSR
    MCU控制和狀態寄存器MCUCSR中的第6位(ISC2)為INT2的中斷觸發類型控制位
7 6 5 4 3 2 1 0
$34($0054) JTD ISC2 —— JTRF WDRF BORF EXTPF PORF
讀/寫 R/W R/W R R/W R/W R/W R/W R/W
初始化值 0 0 0 復位標志 復位標志 復位標志 復位標志 復位標志
ISC2 中斷觸發方式
0 INT2的下降沿產生一個異步中斷請求
1 INT2的上升沿產生一個異步中斷請求

3)、通用中斷控制寄存器——GICR
   通用中斷控制寄存器GICR的高3位為INT0、INT1和INT2的中斷允許控制位,如果SREG寄存器中的全局中斷I位為“1”,以及GICR寄存器中相應的中斷允許位別置為“1”,當外部引腳INT0(或INT1、或INT2)上的電平變化時,MCU將會響應相應的中斷請求。
7 6 5 4 3 2 1 0
$3B($005B) INT1 INT0 INT2 —— —— —— IVSEL IVCE
讀/寫 R/W R/W R/W R R R R/W R/W
初始化值 0 0 0 0 0 0 0 0


//針對ATmega328P,叫做外部中斷屏蔽寄存器
ATmega328P EIMSK - External Interrupt Mask Register 外部中斷屏蔽寄存器(0x3D)
Bit 7 6 5 4 3 2 1 0
0x1D(0x3D) - - - - - - INT1 INT0
讀/寫 R R R R R R R R
初始值 0 0 0 0 0 0 0 0


4)、通用中斷標志寄存器——GIFR
    通用中斷標志寄存器GIFR的高3位為INT0、INT1和INT2的中斷標志位
7 6 5 4 3 2 1 0
$3A($005A) INTF1 INTF0 INTF2 —— —— —— —— ——
讀/寫 R/W R/W R/W R R R R R
初始化值 0 0 0 0 0 0 0 0


//針對ATmega328P,叫做外部中斷標志寄存器
ATmega328P EIFR - External Interrupt Flag Register 外部中斷標志寄存器(0x3C)
7 6 5 4 3 2 1 0
0x1C(0x3C) - - - - - - INTF1 INTF0
讀/寫 R R R R R R R/W R/W
初始化值 0 0 0 0 0 0 0 0

 當 INT2..0 引腳上的有效事件滿足中斷觸發條件后,INTF2..0 位會變成“1”。如果此時 SREG 寄存器中 I = 1,以及 GICR 寄存器中的 INTn 被置為“1”MCU 將響應中斷請求,跳至相應的中斷向量處開始執行中斷服務程序,同時硬件自動將 INTFn 標志位清零。
注意:用戶可以使用指令將 INTFn 清除,清除的方式是寫邏輯“1”到 INTFn,將標志清零。另外,當INT0(INT1) 設置為低電平觸發方式時,標志位 INTF0(INTF1) 始終為“0”, 這並不意味着不產生中斷請求,而是低電平觸發方式是不帶中斷標志類型的中斷觸發。在低 電平觸發方式時,中斷請求將一直保持到引腳上的低電平消失為止。
   在系統程序的初始化部分中對外部中斷進行設置時(定義或改變觸發方式),應先將GICR寄存器中該中斷允許位清零,禁止MCU響應該中斷后再設置ISCn位(中斷觸發方式)。
   在開放中斷允許前,一般應通過向GIFR寄存器中的中斷標志位INTFn寫入邏輯“1”,將該中斷的中斷標志位清零,然后開放中斷。這樣可以防止在改變ISCn的過程中誤觸發中斷。
GICR|=0xC0;  //允許INT0、INT1中斷 1100 0000
MCUCR=0x0A;  //INT0、INT1下降沿觸發 0000 1010
GIFR=0xC0;  //清除INT0、INT1中斷標志位 1100 0000
//全局中斷允許;



/* 注: */
ATmega328P中, EICRA - External Interrupt Control Register A、EIMSK External Interrupt Mask Register 外部中斷屏蔽寄存器、EIFR External Interrupt flag Register 外部中斷標志寄存器。三個寄存器中,要觸發外部中斷,SREG.7全局中斷允許標志位I為1,外部中斷屏蔽寄存器(外部中斷允許標志位)中的對應外部中斷位為1(中斷允許),EIFR外部中斷標志位為1(中斷標志位),即可觸發中斷。即:外部中斷滿足觸發條件 EIFR(對應位) = 1, ,並且SREG.7 = 1 和 EIMSK(對應位) = 1



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM