以下资料参考马潮老师的中文手册,由微雪电子整理并发布,转载请注明出处:www.waveshare.net,否则追究相应责任!
|
本节说明ATmega128 的中断处理。更一般的AVR 中断处理请参见 P 12“ 复位和中断处理” 。

Notes:
1. 当熔丝位BOOTRST被编程时,复位后程序跳转到Boot Loader。请参见 P 255“ 支持引导装入程序 – 在写的同时可以读(RWW, Read-While-Write) 的自我编程能力” 。
2. 当寄存器MCUCR的IVSEL置位时,中断向量转移到Boot区的起始地址。此时各个中断向量的实际地址为表中地址与Boot 区起始地址之和。
3. 地址为$0030 - $0044 的中断在ATmega103 兼容模式中不存在。
Table 24给出了不同的BOOTRST/IVSEL设置下的复位和中断向量的位置。如果程序永远不使能中断,中断向量就没有意义。用户可以在此直接写程序。同样,如果复位向量位于应用区,而其他中断向量位于Boot 区,则复位向量之后可以直接写程序。反过来亦是如此。

Note: Boot 区复位地址列P 266Table 112 。对于熔丝位BOOTRST,“1” 表示未编程, “0” 表示已编程。
ATmega128 典型的复位和中断设置如下:

当熔丝位BOOTRST 未编程, Boot 区为8K 字节,且中断使能之前寄存器MCUCR 的 IVSEL 置位时,典型的复位和中断设置如下:

当熔丝位BOOTRST 已编程,且Boot 区为8K 字节时,典型的复位和中断设置如下:

当熔丝位BOOTRST 已编程, Boot 区为8K 字节时,且中断使能之前寄存器MCUCR 的 IVSEL 置位时,典型的复位和中断设置如下:

在应用区和Boot 区之间移动中断
通用中断控制寄存器决定中断向量表的放置地址。
MCU 控制寄存器- MCUCR

• Bit 1 – IVSEL: 中断向量选择
当IVSEL 为"0“ 时,中断向量位于Flash 存储器的起始地址;当IVSEL 为"1“ 时,中断向量转移到Boot 区的起始地址。实际的Boot 区起始地址由熔丝位BOOTSZ 确定。具体请参考P 255“ 支持引导装入程序 – 在写的同时可以读(RWW, Read-While-Write) 的自我编程能力” 。为了防止无意之间改变中断向量表,修改IVSEL 时需要遵照如下过程:
1. 置位中断向量修改使能位IVCE。
在紧接的4 个时钟周期里将需要的数据写入IVSEL,同时对IVCE 写”0”。
执行上述序列时中断自动被禁止。其实,在置位IVCE 时中断就被禁止了,并一直保持到写IVSEL 操作之后的下一条语句。如果没有IVSEL 写操作,则中断在置位IVCE 之后的4 个时钟周期保持禁止。状态寄存器的位I 不受此序列的影响。
Note:
若中断向量位于Boot区,且Boot锁定位BLB02被编程,则执行应用区的程序时中断被禁止;若中断向量位于应用区,且Boot 锁定位BLB12 被编程, 则执行Boot 区的程序时中断被禁止。有关Boot 锁定位的细节请参见 P 255“ 支持引导装入程序 – 在写的同时可以读(RWW, Read-While-Write) 的自我编程能力” 。
• Bit 0 – IVCE: 中断向量修改使能
改变IVSEL 时IVCE 必须置位。在IVCE 或IVSEL 写操作之后4 个时钟周期, IVCE 被硬件清零。如前面所述,置位IVCE 将禁止中断。代码如下:
| 汇编代码例程 |
Move_interrupts:
; 使能中断向量的修改
ldi r16, (1<<IVCE)
out MCUCR, r16
; 将中断向量转移到boot 区
ldi r16, (1<<IVSEL)
out MCUCR, r16
ret |
| C 代码例程 |
void Move_interrupts(void)
{
/* 使能中断向量的修改 */
MCUCR = (1<<IVCE);
/* 将中断向量转移到boot 区 */
MCUCR = (1<<IVSEL);
} |
|
可作为如下AVR的参考资料: ATtiny13 ATtiny24 ATtiny44 ATtiny84 ATtiny2313 ATtiny26 ATmega48
ATmega88 ATmega168 ATmega8 ATmega16 ATmega32 ATmega64 ATmega128 ATmega162
ATmega169 ATmega169P ATmega8515 ATmega8535
| ATtiny13 |
ATtiny24 |
ATtiny44 |
ATtiny84 |
ATtiny26 |
ATtiny2313 |
| ATmega48 |
ATmega88 |
ATmega168 |
ATmega8 |
ATmega16 |
ATmega32 |
| ATmega64 |
ATmega128 |
ATmega162 |
ATmega169 |
ATmega8515 |
ATmega8535 |
ATmega128 中断向量
——