PAGE1
PAGE1
中断处理机制
中断的概念与作用
中断是嵌入式系统中一个非常重要的概念,它允许单片机在执行当前任务时,响应外部或内部事件,并暂时中断当前任务,转而执行特定的中断服务程序(InterruptServiceRoutine,ISR)。处理完中断事件后,单片机会恢复到被中断前的状态,继续执行原任务。中断机制可以显著提高系统的实时性和响应能力,使得单片机能够及时处理外部输入或内部错误。
在AVR单片机中,中断源可以是外部引脚、定时器、ADC、UART等多种硬件设备。每个中断源都有对应的中断向量,中断向量表存储了所有中断的入口地址。当某个中断源触发时,单片机会自动跳转到相应的中断向量地址,执行ISR。
中断向量表
中断向量表是单片机内部的一个固定地址表,每个中断源都有一个对应的向量地址。当某个中断源被触发时,单片机会跳转到这个地址,执行ISR。AVR单片机的中断向量表位于闪存的起始地址处,具体地址因单片机型号而异。
中断向量表的结构
以下是ATmega328P的中断向量表(部分):
中断向量|地址|描述|
—|—|—|
RESET|0x0000|复位中断|
INT0|0x0001|外部中断请求0|
INT1|0x0002|外部中断请求1|
PCINT0|0x0003|通用中断请求0|
PCINT1|0x0004|通用中断请求1|
PCINT2|0x0005|通用中断请求2|
WDT|0x0006|看门狗定时器中断|
TIM2_OVF|0x0007|定时器2溢出中断|
TIM2_COMPB|0x0008|定时器2比较匹配B中断|
TIM2_COMPA|0x0009|定时器2比较匹配A中断|
TIM1_CAPT|0x000A|定时器1捕获中断|
TIM1_COMPA|0x000B|定时器1比较匹配A中断|
TIM1_COMPB|0x000C|定时器1比较匹配B中断|
TIM1_OVF|0x000D|定时器1溢出中断|
TIM0_OVF|0x000E|定时器0溢出中断|
TIM0_COMPB|0x000F|定时器0比较匹配B中断|
TIM0_COMPA|0x0010|定时器0比较匹配A中断|
SPI_STC|0x0011|SPI传输完成中断|
USART_RX|0x0012|USART接收完成中断|
USART_UDRE|0x0013|USART数据寄存器空中断|
USART_TX|0x0014|USART传输完成中断|
ADC|0x0015|ADC转换完成中断|
EE_READY|0x0016|EEPROM操作完成中断|
ANA_COMP|0x0017|模拟比较器中断|
TWI|0x0018|TWI中断|
SPM_RDY|0x0019|存储器编程操作完成中断|
中断使能与配置
要使能中断,需要配置相应的中断使能寄存器和中断标志寄存器。这些寄存器通常位于单片机的特殊功能寄存器(SpecialFunctionRegister,SFR)中。使能中断的具体步骤如下:
全局中断使能:通过设置SREG寄存器的I位,使能全局中断。
局部中断使能:通过设置相应的中断使能寄存器,使能特定的中断源。
清除中断标志:在ISR中清除中断标志位,防止中断被重复触发。
全局中断使能
全局中断使能通过设置SREG寄存器的I位来实现。SREG寄存器的I位控制着所有中断的使能状态。当I位为1时,所有中断使能的中断源都可以触发中断;当I位为0时,所有中断源被屏蔽。
//全局中断使能
sei();
局部中断使能
局部中断使能需要根据不同的中断源配置相应的寄存器。例如,使能外部中断INT0需要设置EIMSK寄存器的INT0位,并配置EICRA寄存器中的中断触发方式。
//使能外部中断INT0
EIMSK|=(1INT0);//设置EIMSK寄存器的INT0位
EICRA|=(1ISC00)|(1ISC01);//配置EICRA寄存器,选择INT0的触发方式(例如:低电平触发)
sei();//全局中断使能
清除中断标志
在ISR中,通常需要清除相应的中断标志位,以防止中断被重复触发。例如,清除定时器0溢出中断的标志位: