嵌入式单片机,ATmega328P,外部中断INT0,INT1,INT2,中断标志位介绍
body, table { font-family: 微軟雅黑; font-size: 13.5pt }
table { border-collapse: collapse; border-top: 2px solid rgba(128, 128, 128, 1); border-right: 0 solid rgba(128, 128, 128, 1); border-bottom: 2px solid rgba(128, 128, 128, 1); border-left: 0 solid rgba(128, 128, 128, 1) }
th { border: 1px solid rgba(128, 128, 128, 1); padding: 4px; background-color: rgba(221, 221, 221, 1) }
td { border: 1px solid rgba(128, 128, 128, 1); padding: 4px }
tr:nth-child(2n) { background-color: rgba(248, 248, 248, 1) }
三個(gè)外部中斷INT0,INT1,INT2;對應(yīng)由芯片外部引腳PD2、PD3、PB2上的電平的變化或狀態(tài)作為中斷觸發(fā)信號(hào)。
????INT0、INT1、INT2的中斷觸發(fā)方式取決于用戶程序?qū)?strong>MCU控制寄存器(MCUCR)以及MCU控制與狀態(tài)寄存器(MCUCSR)的設(shè)定。其中,INT0和INT1支持4種中斷觸發(fā)方式,INT2支持2種。
| INT0 | INT1 | INT2 | 說明 | |
| 上升沿觸發(fā) | Yes | Yes | Yes(異步) | |
| 下降沿觸發(fā) | Yes | Yes | Yes(異步) | |
| 任意電平變化觸發(fā) | Yes | Yes | —— | |
| 低電平觸發(fā) | Yes | Yes | —— | 無中斷標(biāo)志 |
任意電平變化觸發(fā)表示只要引腳上有邏輯電平的變化就會(huì)產(chǎn)生中斷申請(不管是上升沿還是下降沿都引起中斷觸發(fā))。
▋低電平觸發(fā)是不帶中斷標(biāo)志類型的,即只要中斷輸入引腳PD2或PD3保持低電平,那么將一直會(huì)產(chǎn)生中斷申請。
▋MCU對INT0和INT1的引腳上的上升沿或下降沿變化的識(shí)別(觸發(fā)),需要I/O時(shí)鐘信號(hào)的存在(由I/O時(shí)鐘同步檢測),屬于同步邊沿觸發(fā)的中斷類型。
▋MCU對INT2的引腳上的上升沿或下降沿變化的識(shí)別(觸發(fā)),以及低電平的識(shí)別(觸發(fā))是通過異步方式檢測的,不需要I/O時(shí)鐘信號(hào)的存在。因此,這類觸發(fā)類型的中斷經(jīng)常作為外部喚醒源,用于將處在 Idle 休眠模式,以及處在各種其它休眠模式的 MCU 喚醒。這是由于除了在空閑(Idel)模式時(shí),I/O 時(shí)鐘信號(hào)還保持繼續(xù)工作,在其它各種休眠模式下,I/O 時(shí)鐘信號(hào)均是處在暫停狀態(tài)的。
▋?nèi)绻O(shè)置了允許響應(yīng)外部中斷的請求,那么即便是引腳PD2、PD3、PB2設(shè)置為輸出方式工作,引腳上的電平變化也會(huì)產(chǎn)出外部中斷觸發(fā)請求。這一特性為用戶提供了使用軟件中斷的途徑。
與外部中斷相關(guān)的寄存器和標(biāo)志位
除了寄存器SREG中的全局中斷允許標(biāo)志位I外,與外部中斷有關(guān)的寄存器有4個(gè),共有11個(gè)標(biāo)志位。其作用分別是3個(gè)外部中斷各自的中斷標(biāo)志位,中斷允許控制位,和用于定義外部中斷的觸發(fā)類型。
1)、MCU控制寄存器——MCUCR (ATmega328P EICRA - External Interrupt Control Register A外部中斷控制寄存器A(0x69))
????MCU控制寄存器MCUCR的低4位為INT0(ISCO1,ISC00)和INT1(ISC11、ISC10)中斷觸發(fā)類型控制位,中斷觸發(fā)方式:
| 位 | 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的中斷觸發(fā)方式
| ISCn1 | ISCn0 | 中斷觸發(fā)方式 |
| 0 | 0 | INTn的低電平產(chǎn)生一個(gè)中斷請求 |
| 0 | 1 | INTn的下降沿和上升沿都產(chǎn)生一個(gè)中斷請求 |
| 1 | 0 | INTn的下降沿產(chǎn)生一個(gè)中斷請求 |
| 1 | 1 | INTn的上升沿產(chǎn)生一個(gè)中斷請求 |
MCU對INT0、INT1引腳上電平值的采樣在邊沿檢測前。如果選擇脈沖邊沿觸發(fā)或電平變化中斷的方式,那么在INT0、INT1引腳上的一個(gè)脈寬大于一個(gè)時(shí)鐘周期的脈沖變化將觸發(fā)中斷,過短的脈沖則不能保證觸發(fā)中斷。如果選擇低電平觸發(fā)中斷,中斷請求將一直保持到引腳上的低電平消失為止。
2)、MCU控制和狀態(tài)寄存器——MCUCSR
MCU控制和狀態(tài)寄存器MCUCSR中的第6位(ISC2)為INT2的中斷觸發(fā)類型控制位
| 位 | 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 | 復(fù)位標(biāo)志 | 復(fù)位標(biāo)志 | 復(fù)位標(biāo)志 | 復(fù)位標(biāo)志 | 復(fù)位標(biāo)志 |
| ISC2 | 中斷觸發(fā)方式 |
| 0 | INT2的下降沿產(chǎn)生一個(gè)異步中斷請求 |
| 1 | INT2的上升沿產(chǎn)生一個(gè)異步中斷請求 |
3)、通用中斷控制寄存器——GICR
?? 通用中斷控制寄存器GICR的高3位為INT0、INT1和INT2的中斷允許控制位,如果SREG寄存器中的全局中斷I位為“1”,以及GICR寄存器中相應(yīng)的中斷允許位別置為“1”,當(dāng)外部引腳INT0(或INT1、或INT2)上的電平變化時(shí),MCU將會(huì)響應(yīng)相應(yīng)的中斷請求。
| 位 | 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)、通用中斷標(biāo)志寄存器——GIFR
通用中斷標(biāo)志寄存器GIFR的高3位為INT0、INT1和INT2的中斷標(biāo)志位。
| 位 | 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,叫做外部中斷標(biāo)志寄存器
ATmega328P EIFR - External Interrupt Flag Register 外部中斷標(biāo)志寄存器(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 |
當(dāng) INT2..0 引腳上的有效事件滿足中斷觸發(fā)條件后,INTF2..0 位會(huì)變成“1”。如果此時(shí) SREG 寄存器中 I = 1,以及 GICR 寄存器中的 INTn 被置為“1”,MCU 將響應(yīng)中斷請求,跳至相應(yīng)的中斷向量處開始執(zhí)行中斷服務(wù)程序,同時(shí)硬件自動(dòng)將 INTFn 標(biāo)志位清零。
注意:用戶可以使用指令將 INTFn 清除,清除的方式是寫邏輯“1”到 INTFn,將標(biāo)志清零。另外,當(dāng)INT0(INT1) 設(shè)置為低電平觸發(fā)方式時(shí),標(biāo)志位 INTF0(INTF1) 始終為“0”,這并不意味著不產(chǎn)生中斷請求,而是低電平觸發(fā)方式是不帶中斷標(biāo)志類型的中斷觸發(fā)。在低電平觸發(fā)方式時(shí),中斷請求將一直保持到引腳上的低電平消失為止。
| 在系統(tǒng)程序的初始化部分中對外部中斷進(jìn)行設(shè)置時(shí)(定義或改變觸發(fā)方式),應(yīng)先將GICR寄存器中該中斷允許位清零,禁止MCU響應(yīng)該中斷后再設(shè)置ISCn位(中斷觸發(fā)方式)。 在開放中斷允許前,一般應(yīng)通過向GIFR寄存器中的中斷標(biāo)志位INTFn寫入邏輯“1”,將該中斷的中斷標(biāo)志位清零,然后開放中斷。這樣可以防止在改變ISCn的過程中誤觸發(fā)中斷。 |
| GICR|=0xC0; //允許INT0、INT1中斷 1100 0000 MCUCR=0x0A; //INT0、INT1下降沿觸發(fā) 0000 1010 GIFR=0xC0; //清除INT0、INT1中斷標(biāo)志位 1100 0000 //全局中斷允許; |
/* 注: */
在ATmega328P中,EICRA - External Interrupt Control Register A、EIMSK -External Interrupt Mask Register 外部中斷屏蔽寄存器、EIFR -External Interrupt flag Register 外部中斷標(biāo)志寄存器。三個(gè)寄存器中,要觸發(fā)外部中斷,SREG.7全局中斷允許標(biāo)志位I為1,外部中斷屏蔽寄存器(外部中斷允許標(biāo)志位)中的對應(yīng)外部中斷位為1(中斷允許),EIFR外部中斷標(biāo)志位為1(中斷標(biāo)志位),即可觸發(fā)中斷。即:外部中斷滿足觸發(fā)條件EIFR(對應(yīng)位) = 1,,并且SREG.7 = 1 和 EIMSK(對應(yīng)位) = 1
總結(jié)
以上是生活随笔為你收集整理的嵌入式单片机,ATmega328P,外部中断INT0,INT1,INT2,中断标志位介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (十三)Packet socket 和
- 下一篇: 笔记本ubuntu20.04屏幕亮度问题