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


程序存储区的最低地址缺省为复位向量和中断向量。完整的向量列表请参见 P43“中断”。列表也决定了不同中断的优先级。向量所在的地址越低,优先级越高。RESET 具有最高的优先级,第二个为INT0 – 外部中断请求0。通过置位MCU 控制寄存器 (MCUCR) 的IVSEL,中断向量可以移至引导Flash的起始处。编程熔丝位BOOTRST也可以将复位向量移至引导Flash的起始处。具体参见P234“支持引导装入程序 – 在写的同时可以读(RWW,Read-While-Write) 的自我编程能力”。

任一中断发生时全局中断使能位I 被清零,从而禁止了所有其他的中断。用户软件可以在中断程序里置位I 来实现中断嵌套。此时所有的中断都可以中断当前的中断服务程序。执行RETI 指令后I 自动置位。

从根本上说有两种类型的中断。第一种由事件触发并置位中断标志。对于这些中断,程序计数器跳转到实际的中断向量以执行中断处理程序,同时硬件将清除相应的中断标志。中断标志也可以通过对其写”1” 的方式来清除。当中断发生后,如果相应的中断使能位为“0”,则中断标志位置位,并一直保持到中断执行,或者被软件清除。类似的,如果全局中断标志被清零,则所有已发生的中断都不会被执行,直到I 置位。然后挂起的各个中断按中断优先级依次执行。

第二种类型的中断则是只要中断条件满足,就会一直触发。这些中断不需要中断标志。若中断条件在中断使能之前就消失了,中断不会被触发。

AVR 退出中断后总是回到主程序并至少执行一条指令才可以去执行其他被挂起的中断。要注意的是,进入中断服务程序时状态寄存器不会自动保存,中断返回时也不会自动恢复。这些工作必须由用户通过软件来完成。

使用CLI 指令来禁止中断时,中断禁止立即生效。没有中断可以在执行CLI 指令后发生,即使它是在执行CLI 指令的同时发生的。下面的例子说明了如何在写EEPROM 时使用这个指令来防止中断发生以避免对EEPROM 内容的可能破坏。


汇编代码例程
in r16, SREG ; 保存SREG
cli ; 禁止中断
sbi EECR, EEMWE ; 启动 EEPROM 写操作
sbi EECR, EEWE
out SREG, r16 ; 恢复SREG (I 位)

C 代码例程
char cSREG;
cSREG = SREG; /* 保存SREG */
/* 禁止中断*/
_CLI();
EECR |= (1<EECR |= (1<SREG = cSREG; /* 恢复SREG (I 位) */

使用SEI 指令使能中断时,紧跟其后的第一条指令在执行任何中断之前一定会首先得到执行。 

汇编代码例程
sei ; 置位全局中断使能标志
sleep ; 进入休眠模式,等待中断发生
; 注意: 在执行任何被挂起的中断之前MCU 将首先进入休眠模式

C 代码例程
_SEI(); /* 置位全局中断使能标志*/
_SLEEP(); /* 进入休眠模式,等待中断发生*/
/* 注意: 在执行任何被挂起的中断之前MCU 将首先进入休眠模式*/

AVR 中断响应时间最少为4 个时钟周期。4 个时钟周期后,程序跳转到实际的中断处理例程。在这4 个时钟期期间PC 自动入栈。在通常情况下,中断向量为一个跳转指令,此跳转需要3 个时钟周期。如果中断在一个多时钟周期指令执行期间发生,则在此多周期指令执行完毕后MCU 才会执行中断程序。若中断发生时MCU 处于休眠模式,中断响应时间还需增加4 个时钟周期。此外还要考虑到不同的休眠模式所需要的启动时间。这个时间不包括在前面提到的时钟周期里。

中断返回需要4 个时钟。在此期间PC( 两个字节) 将被弹出栈,堆栈指针加二,状态寄存器SREG 的I 置位。

关键字:ATmega16  复位  中断处理 引用地址:ATmega16 复位与中断处理

上一篇:ATmega16 Flash程序存储器
下一篇:ATmega16 指令执行时序

推荐阅读

ts.c源码:#include "linux/module.h"#include "linux/init.h"#include "linux/fs.h"#include "linux/interrupt.h"#include "linux/irq.h"#include "linux/sched.h"#include "linux/pm.h"#include "linux/sysctl.h"#include "linux/proc_fs.h"#include "linux/delay.h"#include "linux/platform_device.h"#include "linux/input.h"#include "...
参考资料:王宏波老师的PPTMSP430F6638用户手册王宏波老师实验教程本章最新更新日期:2018.12.22第四章 WDT寄存器4.1 WDTCTL4.2 SFRIE1 & SFRIFG1
根据网友投稿,字节跳动旗下智能硬件公司北京得特创新科技有限公司(坚果手机微信公众号账号主体)的一款显示器通过了 3C 认证,可能会与坚果新机一同发布。  据介绍,该显示器型号为 DT2003C/DT2003A,与坚果新机相对应,支持最高 11V 5A 共 55W 功率的供电。这款设备的代工厂和坚果手机一样,都是广东以诺通信有限公司,预计这是一款类似 TNT...
上次写的是用STM8单片机中的8位定时器作为软件延时,采用的是查询方式。在实际系统中,定时器的应用,更多的是采用中断方式,下面的代码就给出8位定时器在中断方式下的应用。实验程序首先初始化驱动LED的端口,然后初始化8位的定时器4,最后启动中断允许,要记住,一定要将中断服务程序的入口地址填写到中断向量表中,并且要根据中断向量号在正确的位置上...

史海拾趣

问答坊 | AI 解惑

值得注意的单片机控制板的设计原则

单片机控制板的设计需要遵循的原则规则都很简单关键是大家需要理解 …

查看全部问答∨

新手必经历的控制方式概念

一 操作方式的说明 自动工作方式大致可分为:连续、单周期、单步工作方式 1 连续工作方式:按下启动按钮,机器从初始状态(原点)工作一个周期后又进行           &nb ...…

查看全部问答∨

菜鸟求助:基于FPGA的超声波流量计电路图与程序源码

紧急求教版主及各路高手,毕业设计老师逼的急,能不能提供下整机电路图,能有原理及源代码更好,跪谢!!!!!!…

查看全部问答∨

6月6号TI会议下载资料

本帖最后由 paulhyde 于 2014-9-15 09:45 编辑 C2000参赛资料报告(简易数字频率计,三相正弦波变频电源) Training PPTs 完整德州仪器高性能模拟器件在大学生创新设计中的应用及选型指南 关于TI杯获奖作品选编论坛已有,就不多手了   ...…

查看全部问答∨

如何删除wince的密码以及拨号等组件?

请大家帮忙,下面红框的组件怎么删除的,例如密码设置组件 ———————————————————————————————————— 我刚开始以为是下面这个,可惜不是。删除后密码组件还在 麻烦大家指点一下。…

查看全部问答∨

求 windows mobile 6.0 c++语言开发的入门经典书籍

如题,我在网上没找到靠谱的书籍介绍, 希望各位高手能指点,多谢多谢。 …

查看全部问答∨

做STM32IAP的时候,下载后不能引导应用程序运行

请教:做STM32 IAP的时候,用官方的例子下载后可以引导应用程序运行,自己写的不行 同一个bin文件,都是从0x8002000地址处编程 现在想读出来看看是不是我的根官方的编进去的数据不一样,有什么工具可以读出flash里的数据吗?&n ...…

查看全部问答∨

求解 同相放大与反相放大

我先简单说一下我的理解,同相放大即输入与输出是同极性的信号,反向放大即时:输入与输出极性相反。 我的问题:同相放大与反相的区别,是不是没有相位要求的情况下可以互换呢 在什么场合下用同相放大,什么场合下用反相放大呢?望大虾们指点。…

查看全部问答∨

DSP的可变长度数组申请

我有个压缩算法,在windows下运行是完全OK的,但移植到DSP下,遇到内存问题,下面我大概说下问题结构: 大概有结构如下 typedef struct _COMPRESSED_DATA_{  int width;  int height;  BYTE  m_Data[0];    ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved