寄存器:
IRR:Interrupt Request Register,中断请求寄存器,共8bit,对应IR0~IR7 八个中断管
脚。当某个管脚的中断请求到来后,若该管脚没有被屏蔽,IRR 中对应的bit 被置一。
表示PIC 已经收到设备的中断请求,但还未提交给CPU。
ISR:In Service Register,服务中寄存器,共8bit,每bit 意义同上。当IRR 中的某个中
断请求被发送给CPU 后,ISR 中对应的bit 被置一。表示中断已发送给CPU,但CPU
还未处理完。
IMR:Interrupt Mask Register,中断屏蔽寄存器,共8bit,每bit 意义同上。用于屏蔽中
断。当某bit 置一时,对应的中断管脚被屏蔽。
PIC 的每个管脚具有优先级,以0 号管脚最高。也就说,连接号码较小
的设备具有较高的中断优先级。通过对PIC 的ICW 寄存器编程,可以设定起始vector 号,
以计算当前中断的vector。
过程:
1、一个或多个IR 管脚上产生电平信号,若对应的中断没有被屏蔽,IRR 中相应的bit 被置
一。
2、PIC 拉高INT 管脚通知CPU 中断发生。
3、CPU 通过INTA 管脚应答PIC,表示中断请求收到。
4、PIC 收到INTA 应答后,将IRR 中具有最高优先级的bit 清零,并设置ISR 中对应的bit。
5、CPU 通过INTA 管脚第二次发出脉冲,PIC 收到后计算最高优先级中断的vector,并将
它提交到数据线上。
6、等待CPU 写EOI。收到EOI 后,ISR 中最高优先级的bit 被清零。如果PIC 处于AEOI
模式,当第二个INTA 脉冲收到后,ISR 中最高优先级的bit 自动清零。
中断处理程序需要注意:
1,执行速度要快。所以代码要尽量简洁。
2,栈内存的使用要注意节约。