微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > AVR单片机中的中断嵌套

AVR单片机中的中断嵌套

时间:11-24 来源:互联网 点击:
AVR响应中断后,由硬件自动清零全局中断标志位,此时任何中断都无法响应。直到中断响应程序执行完毕后,全局中断自动打开。因此,若不作特别处理,AVR单片机是无法实现中断嵌套的。

但,如果在中断服务程序中开放全局中断,一旦有中断(包括中断级别较低的,或者是自己本身)申请,AVR将立即响应中断,打断当前正在执行的任何程序(包括正在执行中断服务程序),进入新的中断服务程序,从而实现中断嵌套。此时如有多个中断申请同时存在,MCU响应高优先权的中断。

可见,AVR单片机中,若软件合理设计,即可实现中断嵌套。

和MCS51特别不同的是,AVR中断嵌套不仅可处理优先级更高的中断,也可以处理同优先级甚至优先级较低的中断。这能满足一些特殊的设计,但是也容易引起混乱。在软件设计过程中,这一点设计者需特别注意。

具体实验:

interrupt [iv_INT1] void USB_Link_Int(void)

{

//显示提示信息,提示进入INT1中断处理程序

DispScreen(scr_info_of_int1,true,null);

//延迟3秒,使得屏幕提示可以看清

//注意:延迟过程中产生iv_TIMER0_COMP中断,该中断的优先级低于iv_INT1

Timer0_Start(0,3); //注:此函数中使用sei()开放中断

while (Timer0_IsRun());

Timer0_Stop();

//允许INT3(ENTER)键按下产生中断

EIMSK &= 0xf7; //禁止INT3产生中断

EICRA |= 0x80;

EICRA &= 0xbf; //INT3中断方式:下降沿产生异步中断

EIFR |= 0x08;//清INT3中断标志

EIMSK |= 0x08;//允许INT3产生中断

//禁止INT1,防止重入,专等INT3

EIMSK &= ~( 1 < INT1 );//禁止INT1产生中断

//等待INT3中断

//注意:iv_INT3中断的优先级低于iv_INT1

while(true);

}

//按ENTER键后产生INT3中断

interrupt [iv_INT3] void EnterKey_Int(void)

{

//显示提示信息,提示进入INT3中断处理程序

DispScreen(scr_info_of_int3,true,null);

//延迟3秒,使得屏幕提示可以看清

//注意:延迟过程中产生iv_TIMER0_COMP中断,该中断的优先级低于iv_INT3

Timer0_Start(0,3); //注:此函数中使用sei()开放中断

while (Timer0_IsRun());

Timer0_Stop();

//启动看门狗,等待复位

watch_dog_reset_cpu();

}

实验结果:iv_TIMER0_COMP中断、iv_INT3中断如期发生。

由此可见,AVR单片机中,进入中断处理程序适时开放全局中断,不仅可以使用中断嵌套,而且高级别中断中可响应任何级别(包括更低级别的)的中断。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top