外部中断的触发方式和特点
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 | --- | 无中断标志 |
这4种触发方式还有一些不同的特点:
- 低电平触发是不带中断标志类型的,即只要中断输入引起引脚PD2或PD3保持低电平,那么将一直会产生中断申请。
- MCU对INT0和INT1引脚上的上升沿或下降沿变化的识别(触发),需要I/O时钟信号的存在,属于同步边沿触发的中断类型。
- MCU对INT2引脚上的上升沿或下降沿变化的识别(触发)及低电平的识别(触发),是通过异步方式检测的,不需要I/O时钟信号的存在。
- 如果使用低电平触发方式的中断源作为唤醒源,那么MCU从掉电模式中被唤醒时,电平拉低后仍需要维持一段时间才能将MCU唤醒。
- 如果设置了允许响应外部中断的请求,那么即使引脚PD2、PD3和PB2设置为输出方式工作,引脚上的电平变化也会产生外部中断触发请求,这一特性为用户提供了使用软件产生中断的途径。
与外部中断相关的寄存器和标志位
在ATmega16中。除了寄存器SREG中的全局中断允许标志位1外,与外部中断有关的寄存器有4个,共有11个标志位。其作用分别是3个外部中断各自的中断标志位、中断允许控制位及用于定义外部中断的触发类型。
MCU控制寄存器MCUCR
MCU控制寄存器MCUCR的低4位为INT0(ISC01、ISC00)和INT1(ISC11、ISC10)中断触发类型控制位。MCUCR各位的定义如下:
位 | 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引脚上的一个脉宽大于一个时钟周期的脉冲变换将触发中断,过短的脉冲则不能保证触发中断。如果选择低电平触发中断,那么低电平必须保持到当前指令执行完成才能触发中断。如果是低电平触发方式,则中断请求将一直保持到引脚上的低电平消失为止。
MCU控制和状态寄存器MCUCSR
MCU控制和状态寄存器MCUCSR中的第6位(ISC2)为INT2的中断触发类型控制位,MCUCSR定义如下:
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
$34($0054) | JTD | ISC2 | - | JTRF | WDRF | BORF | EXTRF | PORF |
读/写 | R/W | R/W | R | R/W | R/W | R/W | R/W | R/W |
初始化值 | 0 | 0 | 0 | 5个 | RESET | 复位 | 标志 |   |
INT2的中断触发方式定义:
ISC2 | 中断触发方式 | |
---|---|---|
0 | INT2的下降沿产生一个异步中断请求 | |
1 | INT2的上升沿产生一个异步中断请求 |
通用中断控制寄存器GICR
通用中断控制寄存器GICR的高3位为INT0、INT1和INT2的中断允许控制位。如果SREG寄存器中的全局中断I位为“1”,而且GICR寄存器中相应的中断允许位置1,那么当外部INT0、INT1或INT2中断触发时,MCU将会响应相应的中断请求。GICR各位定义如下:
位 | 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 |
通用中断标志寄存器GIFR
通用中断标志寄存器GIFR的高3位为INT0、INT1和INT2的中断标志位。GIFR各位定义如下:
位 | 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 |
当INT2、INT1和INT0引脚上的有效事件满足中断触发条件后,INTF2、INTF1和INTF0位会变成“1”。如果此时SREG寄存器中的I位为“1”,GIFR寄存器中的INTn置1,则MCU响应中断请求。跳至相应的中断向量处开始执行中断服务程序,同时硬件自动将INTFn标志位清0。(用户可以使用指令将INTFn清除,清除的方式是写逻辑“1”到INTFn,将标志清0)