三个外部中断INT0,INT1,INT2;对应由芯片外部引脚PD二、PD三、PB2上的电平的变化或状态做为中断触发信号。
INT0、INT一、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 时钟信号均是处在暂停状态的。
▋若是设置了容许响应外部中断的请求,那么即使是引脚PD二、PD三、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(ISC十一、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(或INT一、或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