AVR中断
一、中断信号往往是电信号的某种变化形式,如
脉冲的上升沿或下降沿
高电平或低电平
电平变化
二、中断向量
中断请求被cpu检测到之后,如果中断控制系统允许,cpu会自动转移,执行一个固定的程序空间地址的指令。
这个固定地址叫做中断入口地址,也叫中断向量。而这个地址是有单片机的硬件来决定的。
一般这个地址不放置具体的程序,只放置一条跳转指令,转向真正的中断服务程序。
三、AVR不支持软件改变中断优先级,即其优先级是固定的。
四、中断源分为三类
1.非屏蔽中断,如reset中断,无法屏蔽
2.屏蔽中断,大部分中断都是可屏蔽的
3.软件中断,AVR不支持,好像ARM里面有,可以作为操作系统的中断调用。
五、中断响应条件
响应A中断 = 全局中断允许标志 AND 中断A允许标志 AND 中断A标志
全局中断允许标志对于AVR就是其标志寄存器SREG的I位,SREG.7,gcc中打开和关闭的方法为sei()和cli()
中断允许标志,一般来说每个中断都会有单独的允许标志位,放置在某个相关的寄存器中,通过单独设置那一位可以打开或关闭相应的中断。
中断标志,一般说来这个标志都是硬件触发的,就是一旦满足那个条件,这个标志自动为1,不需要手动设置。
六、中断向量区大小 = 中断源个数 x 每个中断向量所占的字数
七、中断标志位一般会在cpu响应中断后自动清除,或在中断服务程序中通过读写专门的寄存器而自动清除。
当然也可以对其进行软件清除,清除方法是对其写1(这点比较怪)
八、中断标志会一直保持,如果中断被禁止或者是cpu不能马上响应的话。这是称作“挂起”,一旦cpu可以响应了,则马上按优先级处理中断。
九、个别中断不带中断标志,比如配置为低电平触发的外部中断。只要满足条件就会向cpu一直发送中断申请。
这里就会出现这样的问题:
1.cpu暂时没响应中断,低电平没有了,这样就少了一次服务
2.cpu响应了,响应完事,低电平还在,又多服务了一次
所以设计的时候要注意
一般这种低电平触发中断方式用于唤醒处于休眠模式的cpu,可参考具体方案。
十、AVR响应中断时会将全局中断允许位关掉,不响应其它中断,所以也就不允许中断的嵌套。
当然可以在中断服务程序中,将其开启,但是这样做是非常危险的,不提倡。
十一、中断响应的过程如下
1.清零全局中断
2.将具体被响应的中断标志位清零
3.中断断点地址压入堆栈,同时SP减2
4.自动将中断向量地址压入PC,强制执行。
以上均由硬件自动完成,软件需要做的事情如下:
1.中断入口处指令:rjmp reset
2.中断服务程序
3.返回指令 reti
十二、
非常要注意的是中断只保存和恢复了断点的PC值,对其它的寄存器均没有保护,所以如果在中断服务程序中要是改变了某些寄存器的值的话就容易出现问题。
所以,中断服务程序要尽量短,不做多余的操作,并且一旦对sreg有破坏的话,一定要在先将其压入堆栈。
十三、技巧
在使能一个中断允许位之前,最好将改中断的中断标志位清除,然后马上使能允许位。
这样可以避免一些不必要的错误,如果之前改标志为1的话,就会产生一个错误的中断。
再说一次,清除标志位的方法是对其写1
GCC的中断程序写法,这里不说了,参考相关书籍
AVR-MEGA16的外部中断
其它的cpu也大同小异
中断方式的设置在MCUCR和MCUCSR两个寄存器里,找到对应的INT的两位ISC1和ISC0,具体参考datasheet
中断允许在GICR寄存器里
中断标志位在GIFR寄存器中