AVR有不同的中断源。每个中断和复位在程序空间都有独立的中断向量。所有的中断事件 都有自己的使能位。当使能位置位,且状态寄存器的全局中断使能位 I 也置位时,中断可以发生。
ATtiny2313 的程序存储区的最低地址缺省为复位向量和中断向量。完整的向量列表请参见P40“中断” 。 列表也决定了不同中断的优先级。向量所在的地址越低,优先级越高。RESET 具有最高的优先级,第二个为 INT0 – 外部中断请求 0。
任一中断发生时全局中断使能位 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 置位。
关键字:ATtiny2313 复位 中断处理
引用地址:
ATtiny2313 复位与中断处理
推荐阅读最新更新时间:2024-11-18 21:20
带中断MSP430G2553控制程序和错误处理
MSP430G2553板LED在P1.0和P1.6,和P1.3连着一个按钮开关,可以对其进行中断编程。 #include MSP430G2553.h int ms,k,i; char jj ={ 0x01,0x00,0x40,0x00,0x01,0x00,0x40,0x00,0x40,0x00,0x01, 0x00,0x40,0x00,0x01,0x00,0x41,0x00,0x41,0x00,0x41,0x00 }; void delay(int ms) { while(ms--) { for(i=0;i 120;i++); } } int main( void ) { // S
[单片机]
STM32F1/F4复位的实现方式有哪些
共有三种类型的复位,分别为系统复位、电源复位和备份域复位。 系统复位: 除了时钟控制寄存器CSR中的复位标志和备份域中的寄存器外,系统复位会将其他全部寄存器都复位为复位值。 只要发生以下事件之一,就会产生系统复位: 1.NRST引脚低电平(外部复位) 2.窗口看门狗计数结束(WWDG复位) 3.独立看门狗计数结束(IWDG复位) 4.软件复位(SW复位) 5.低功耗管理复位 软件复位: 可通过查看RCC时钟控制和状态寄存器(RCC_CSR)中的复位标志确定。 要对器件进行软件复位,必须将Cortex™-M4F应用中断和复位控制寄存器中的SYSRESETREQ位置1。 低功
[单片机]
单片机的两个外围电路:复位电路和时钟电路
一般的单片机都要具备两个外围电路:时钟电路和复位电路 时钟电路 主要由一个晶振和两个电容组成。晶振的大小决定这单片机的时钟信号 (按我的理解就是:单片机编程时,同一个延时函数,晶振决定着它们的延时时间长短) 复位电路 分为上电复位和按键复位 主要由一个电阻、一个电容,如果按键复位的话,就再加个微动开关就成。都是为了把电路初始化到一个确定的状态,一般来说,单片机复位电路作用是把一个例如状态机初始化到空状态,而在单片机内部,复位的时候单片机是把一些寄存器以及存储设备装入厂商预设的一个值。 至于怎么连接,我就直接上图(仿真软件) 连接着单片机的XTAL1和XTAL2的是时钟电路,单片机实物两个引脚是在左侧第18和19两个
[单片机]
基于FPGA的微处理器内核设计与实现
与传统投片实现ASIC相比,FPGA具有实现速度快、风险小、可编程、可随时更改升级等一系列优点,因而得到了越米越广泛的应用。MCS-51应用时间长、范围广,相关的软硬件资源丰富,因而往往在FPGA应用中嵌人MCS-51内核作为微控制器。但是传统MCS-51的指令效率太低,每个机器周期高达12时钟周期,因此必须对内核加以改进,提高指令执行速度和效率,才能更好地满足FPGA的应用。 通过对传统MCS-51单片机指令时序和体系结构的分析,使用VHDL语言采用自顶向下的设计方法重新设计了一个高效的微控制器内核。改进了的体系结构,可以兼容MCS-51所有指令,每个机器周期只需1个时钟周期,同时增加了硬件看门狗和软件复位功能,提高了指令执行
[嵌入式]
利用555定时器构成白光LED电压调节器的方法
本文以一个555定时器为主要器件构成电压调节电路(如图所示),用来控制一个或多个白光LED。定时器IC1与R1、R2、C2构成了可复位非稳态多谐振荡器。 首次输入电压V S 后,D1将使存储电容器C1充电直到其电压略低于V S 。最初,晶体管Q2处于截止状态,IC1的复位输入为高电平,输出端(OUTPUT)为高电平,以让电流能经过R1给C2充电。 这段时间内,R4拉动放电端(DISCHARGE)导通晶体管Q1,电感L1中的电流I L 开始斜线增大。由于Q1饱和,因此D3和LED都处于反向偏压状态。 当C2的电压超过IC1中管脚6的极限电压(THRESHOLD)时,输出端(OUTPUT)与放电端(DISCHARGE)都变为低电平
[工业控制]
TMS320F24x的实时多中断任务处理
摘要:TMS320F240是TI公司定点DSP芯片F24x系列中具有代表性的一种。在分析其多中断源共享DSP内核同一中断级原理的基础上,探讨该系列芯片在实时多中断任务处理的软件编程过程中的实现方法,并给出具体的应用实例。
关键词:TMS320F240 实时多中断任务 ISR GISR SISR
引言
TMS320F240内部集成了完善的外围设备,包括2个10位的A/D转换器和1个串口通信接口模块(SCI),以及其独有的、可提供3个16位的定时器,3个单比较单元和3个全比较单元的事件管理器(event manager)单元。F240芯片采用多个中断源共享DSP内核同一中断级的中断结构,与常用的数学控制芯片相比,它提供了更多的中
[嵌入式]
MPC850中复位逻辑和CPM协议的CPLD实现
1 引言 近年来,微处理器(MPU)在嵌入式系统研发中所占地位越来越重要,很多应用场合对MPU的处理速度、集成密度也提出了更高的要求。Power PC系列MPU是Motorola公司推出的面向嵌入式应用的专用MPU,它在片内集成了基于RISC体系的微处理器的内核和支持多种通信协议的通信处理器(CPM),具有强大的通信和网络协议处理能力,可广泛应用于通信和网络产品中。CPLD(Complex Programmable Logic Device)是一种复杂的用户可编程逻辑器件,和FPGA相比,由于采用连续连接结构,易于预测延时,从而使电路仿真更加准确。近年来,由于采用先进的集成工艺和大批量生产,CPLD器件成本不断下降,集成密度、速度
[单片机]
中断处理函数的注意事项
中断又叫异步中断,由硬件触发。而异常又称为同步中断,由软件触发。 中断服务 程序 (中断处理函数)是一种处理中断响应的函数,它是一种遵循特定原型声明的C函数,它运行在中断上下文中,也称为原子上下文, 代码 运行在此上下文中是不能被阻塞的。中断服务程序必须运行非常快,它最基本的工作就是告诉硬件已经收到了它发出的中断,但通常还执行大量其他的工作。为此,一般中断服务程序分为两半,一半是中数据恢复处理函数,称为上半部,它只执行那些可以很快执行的代码,如向硬件确认已经收到中断号等,其他的工作要延迟到下半部去执行。 执行在中断上下文中的代码需要注意的一些事项: 中断上下文中的代码不能进入休眠。比如ssleep(), mslee
[单片机]