ATmega16的中断系统

1991天前 · AVR单片机 · 889次阅读

默认情况下,AVR的程序存储区的最低端,即从Flash地址的0x0000开始用于放置中断向量,称作中断向量区。
各种型号的AVR中断向量区大小由下式决定:
中断向量区大小 = 中断源个数 × 每个中断向量占据字数
原则上讲,在不使用中断时,中断向量区与程序存储区的其他部分没有什么区别,可以用于放置普通的程序。但在正式的系统应用中,为了提高系统的抗干扰能力,通常应该在中断向量的位置上放置一条中断返回指令RETI。对应使用了一部分中断的情况,则应在未使用的中断向量处放置这样的指令。在用汇编语言进行开发时,应该注意这一点。
ATmega16共有21个中断源,由于ATmega16片内的Flash为8K字,因此每个中断向量占据了2个字(4字节)。ATmega16的中断向量区:

向量号Flash空间地址中断源中断定义说明
1$000RESET外部引脚电平引发的复位、掉电复位
检测、看门狗复位和JTAG AVR复位
2$002INT0外部中断请求0
3$004INT1外部中断请求1
4$006TIMER2 COMP定时/计数器2比较匹配
5$008TIMER2 OVF定时/计数器2溢出
6$00ATIMER1 CAPT定时/计数器1事件捕捉
7$00CTIMER1 COMPA定时/计数器1比较匹配A
8$00ETIMER1 COMPB定时/计数器1比较匹配B
9$010TIMER1 OVF定时/计数器1溢出
10$012TIMER0 OVF定时/计数器0溢出
11$014SPI STCSPI串行传输结束
12$016USART RXCUSART,接收结束
13$018USART UDREUSART,数据寄存器空
14$01AUSATR TXCUSART,发送结束
15$01CADCA/D转换结束
16$01EEE_RDYEEPROM就绪
17$020ANA_COMP模拟比较器
18$022TW1两线串行接口
19$024INT2外部中断请求2
20$026TIMER0 COMP定时/计数器0比较匹配
21$028SPM_RDY保存程序存储器内容就绪

用到一点代码减少工作量:

_ = [print("|{}|$0{}|||".format(i+1,hex(i*2)[2:].upper().zfill(2))) for i in range(21)]

在这21个中断中,RESET是非屏蔽中断,INT0、INT1、INT2是外部中断,其余17个是内部中断。
RESET是AVR中唯一不可屏蔽的中断,当ATmega16由于各种原因被复位后,程序将跳转到复位向量(默认为0x000)处,在该地址处通常放置一条跳转指令,跳转到主程序处继续执行。
INT0、INT1和INT2是3个外部中断源,他们分别由芯片外部引脚PD2、PD3和PB2上的电平变化或状态触发。

AVR中断响应过程

中断响应的过程

AVR在响应中断请求时,MCU会用4个时钟周期自动、顺序完成以下任务:

  • 清0状态寄存器SREG中的全局中断允许标志位1,禁止响应其他中断。
  • 将被响应中断的标志位清0(仅部分中断有此操作)。
  • 将中断断点的地址压入堆栈,并将SP寄存器中的堆栈指针减2。
  • 自动将相应的中断向量地址压入程序计数器PC,即强行转入执行中断入口地址处的指令。

因此AVR中断响应时间最少为4个时钟周期。

中断返回的过程

AVR一旦执行中断返回RETI指令,MCU便开始了中断返回的过程。在中断返回过程中,AVR也是经过4个时钟周期自动按顺序完成以下任务:

  • 从栈顶弹出2字节的数据,将这两个数据压入程序计数器PC中,并将SP寄存器中的堆栈指针加2。
  • 置位状态寄存器SREG中的全局中断允许标志位1,允许响应其他中断。

中断现场的保护

AVR的中断响应和返回过程主要都是由硬件自动完成的,而在整个过程中用户程序的作用在于:

  • 中断入口处的指令,用于指引MCU转移到中断服务程序
  • 中断服务程序。完成中断服务的功能。
  • 中断返回指令。指引MCU从中断服务程序中返回。

保护和恢复中断现场通常会利用堆栈进行,同时在中断程序中的其他地方也可能要用到堆栈。使用堆栈保护数据时应该特别谨慎,必须保证数据进栈和出栈的数量一致,以确保在进入中断程序和中断程序结束时堆栈指针的值相同。这是因为中断返回时,CPU会认为此时栈顶保存的值是被保护的断点,而将其放入PC中。如果堆栈使用不当,将造成程序流程的严重错误。

👍 0

none

最后修改于1990天前

评论

贴吧 狗头 原神 小黄脸
收起

贴吧

狗头

原神

小黄脸

目录

avatar

未末

迷失

126

文章数

275

评论数

7

分类