ATmega128中断向量的一些知识

木仔科技 2024-03-06 13:24:47

AVR有不同的中断源。每个中断和复位在程序空间都有一个独立的中断向量。所有的中断事件都有自己的使能位。当使能位置位,且状态寄存器的全局中断使能位 I 也置位的情况下,中断可以发生。根据不同的程序计数器 PC数值,在引导锁定位 BLB02 或 BLB12 被编程的情况下,中断可能自动禁止。这个特性提高了软件的安全性。可请参见 P267“存储器编程 ” 。

ATmega128的中断复位向量表:

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: (这里反复强调一下,很多人问我)

对于熔丝位, “1”表示未编程, “0”表示已编程。

对于熔丝位, “1”表示未编程, “0”表示已编程。

对于熔丝位, “1”表示未编程, “0”表示已编程。

ATmega128 典型的复位和中断设置如下:

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

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

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

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

• 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)

<ivce)out MCUCR, r16; 将中断向量转移到boot 区ldi r16, (1<<IVSEL)</ivce)

<ivce)<ivsel)out MCUCR, r16ret</ivsel)</ivce)

<ivce); 将中断向量转移到boot 区ldi r16, (1<<ivsel)out MCUCR, r16ret</ivsel)</ivce)C 代码例程void Move_interrupts(void){/* 使能中断向量的修改 */

MCUCR = (1<<IVCE);

<ivce);/* 将中断向量转移到boot 区 */MCUCR = (1<<IVSEL);<ivsel);</ivsel);</ivce);

<ivce);}<ivsel);</ivsel);</ivce);
0 阅读:0

木仔科技

简介:产品开发,方案设计,电路板设计,电路研发,程序研发!