AVR 中断源较多,尤其是AT-mega128,一共有35个外部及内部中断源, 通常, Flash程序存储器空间 最低位置(0×0000~0×0045)定义为复位和中断向量空间, 在中断向量表中,处于低地址 中断向量所对应 中断拥有高优先级, 所以,系统复位RESET优先级最高,
一, 中断设计注意事项1.具备Bootloader功能 AVR, 其中断向量区可以在Flash程序存储器空间最低位置和Bootloader区 头部来回迁移,这主要用于配合Bootloadel程序 应用, 如果不使用Bootloadel-功能,
一般不使用中断向量区迁移,
2.Flash较小 AVR芯片, 其一个中断向量占据1个字 空间, 用于放置一条相对转移RJMP指令(范围-2k~+2k字),跳到中断服务程序, 对于不使用 中断, 在中断向量区中应放置1条中断返回指令RETI, 以增强程序 抗干扰性,
3.ATmega128 Flash空间为64k字节,因此它 一个中断向量占据2个字 空间, 用于放置一条绝对转移JMP指令(指令长度为2个字), 跳到中断服务程序, 对于不使用 中断,
在中断向量区中应连续放置2条中断返回指令RETI,以增强程序 抗干扰性, 当使用汇编语言编写系统程序时应注意,
4.当MCU响应一个中断时.其硬件系统会自动将中断返回地址压入系统堆栈, 并关闭全局中断响应(硬件将中断标志I位清0).清除该中断 中断标志位;执行中断返回指令RETI时,硬件会先允许全局中断响应(硬件将中断标志I位置1),然后从系统堆栈中弹出返回地址到程序计数器PC中,继续执行被中断 程序, 除此之外,MCU 硬件没有对中断保护做其他处理,
5.在编写中断服务程序时, 首先要编写中断现场保护程序, 如保护MCU 状态寄存器等, 在中断返回之前,不要忘记恢复中断现场,
6.如果设置和允许外部中断响应,
即使是外部INT0~INT7引脚设置为输出, 在引脚上 电平变化也会触发外部中断发生, 这一特性提供了使用软件产生中断 途径,
7.外部中断可选择采用上升沿触发, 下降沿触发, 电平变化(由高变低或由低变高)和低电平触发等方式,无外部高电平触发方式, 具体触发方式由外部中断控制寄存器EICRA(INT3:0)和EICRB(INT7:4)决定,
8.选择外部低电平方式触发中断时应注意:(1)引脚上 低电平必须一直保持到当前一条指令执行完成后才能触发中断, (2)低电平中断并不置位中断标志位, 即外部低电平中断 触发不是由于中断标志位引起 ,而是外部引脚上电平取反后直接触发中断(需要开放全局中断允许), 因此,在使用低电平触发方式时,中断请求将一直保持到引脚上 低电平消失为止, 即只要中断引脚 输入引脚保持低电平,则将一直触发产生中断, 所以,在低电平中断服务程序中,应有相应 操作命令,控制外部器件释放或取消加在外部引脚上 低电平,
二, 中断优先及中断嵌套处理1.AVR中断 优先级由该中断向量在中断向量区中 位置确定,处于低地址 中断向量所对应 中断拥有高优先级, 所以, 系统复位RESET拥有最高优先级,
2.当两个中断源同时申请中断时,
MCU先响应中断优先级高 中断, 低优先级 中断一般将保持中断标志位 状态(外部低电平中断除外),等待MCU响应处理,
3.MCU响应一个中断后,在进入中断服务前已由硬件自动清零全局中断允许位, 此时, 即使有更高优先级 中断请求,MCU也不会响应, 要等执行到RETI指令,从本次中断返回,并执行了一条指令后, 才能继续响应中断, 所以,在缺省情况下,AVR 中断不能嵌套, AVR中断 优先级只是在有多个中断同时发生时才起作用, 此时,MCU将首先响应高优先级 中断,
4.AVR中断嵌套处理是通过软件方式实现 , 如果在B中断服务中,需要MCU能及时响应A中断(不是等本次中断返回后再响应),B中断 服务程序应这样设计:
(1)B中断 现场保护;(2)屏蔽除A以外 其它中断允许标志;(3)用指令SEI开放允许全局中断;(4)B中断服务;(5)用指令CLI禁止全局中断;(6)恢复在本中断程序被屏蔽 中断允许标志;(7)B中断现场恢复;(8)B中断返回,
5.采用软件方式实现中断嵌套处理 优点, 是让程序员可以根据不同 实际情况和需要来决定中断 重要性,
有更加灵活 手段处理中断响应和中断嵌套,如让低优先级 中断(此时很重要)打断高优先级中断 服务等,
但同时也增加了编写中断服务程序 复杂性,
6.由于AVR 指令执行速度比较高,因此, 在一般情况下, 不建议使用中断嵌套 处理方法, 当然,这还需要用户在编写中断处理服务程序中,
应遵循中断服务程序要尽量短 原则,
三, 高级语言环境中, 中断服务程序 编写1.在高级语言开发环境中,都扩展和提供了相应编写中断服务程序 方法及模块, 但不同 高级语言开发环境中对编写中断服务程序 语法规则和处理方法是不同 ,
在编写中断服务程序前, 应当对所使用开发平台, 中断程序 编写方法, 中断 处理方法等有较好 了解,
2.使用ICCAVR, CVAVR, BASCOM-AVR等高级语言编写中断服务程序时, 通常不必考虑对中断现场保护和恢复 处理, 因为编译器在编译中断服务程序 源代码时,会在生成 目标代码中自动加入相应 中断现场保护和恢复指令,
3.如果用户要编写效率更高或特殊 中断服务程序, 可以采用嵌入汇编, 关闭编译系统 自动产生中断现场保护和恢复代码等措施, 但这需要对所使用 开发环境有更深 了解和掌握,
并具备较高 软件设计能力,
|