历史上的今天
返回首页

历史上的今天

今天是:2025年01月03日(星期五)

正在发生

2020年01月03日 | AVR 嵌入式单片机芯片的中断系统介绍

2020-01-03 来源:eefocus

中断源和中断向量:


缺省情况下,AVR的程序存储区的最低端,即从Flash地址的0x0000开始用于放置中断向量,称做中断向量区。中断向量区大小 = 中断源个数 * 每个中断向量占据字数。对于Flash比较小的AVR处理器,每个中断向量占据一个字的空间,用于放置一条相对转移指令 rjmp(跳转范围-2K~+2K),而Flash较大的AVR,每个中断向量占据两个字空间,用于放置一条绝对转移指令 jmp,用于跳转到相应中断的中断服务程序的起始地址。

 

在这21个中断中,包含1个非屏蔽中断(RESET)3个外部中断(INT0、INT1、INT2)和17个内部中断。

RESET $000INT0 $002INT1 $004INT2 $024

INT0、INT1和INT2是3个外部中断源,它们是分别由芯片外部引脚PD2、PD3、PB2上的电平变化或状态触发的。通过对控制寄存器MCUCR和控制与状态寄存器MCUCSR的配置,外部中断可以定义为由PD2、PD3、PB2引脚上的电平的下降沿、上升沿、逻辑电平变化,或者低电平触发(INT2仅支持电平变化的边沿触发),这为外部硬件电路和设备向AVR申请中断服务提供了很大的方便。


**关于计数器的中断寄存器:TIMER2 COMP、TIMER2 OVF、TIMER1 CAPT、TIMER1 COMPA、TIMER1 COMPB、TIMER1 OVF、TIMER0 OVF、TIMER0 COMP这8个中断是来自于ATmega16内部的3个定时计数器触发的内部中断。定时器处在不同的工作模式下时,这些中断的发生条件和具体意义是不同的。



ATmega16的中断控制:

1)、中断优先级的确定


AVR单片机中,一个中断在中断向量区中的位置决定了它的优先级,位于低地址的中断优先级高于位于高地址的中断。所以 RESET 具有最高优先级。


AVR单片机采用固定的硬件优先级方式,不支持通过软件对中断优先级的重新设定。当有多个中断源向MCU申请中断的情况中,MCU根据中断优先级的不同,把低优先级的中断挂起,首先响应中断优先级最高的那个中断。待优先级最高的中断服务程序执行完成返回后,再顺序响应低优先级的中断。


2)、中断标志


AVR有两种机制不同的中断:带有中断标志的中断(可挂起)和不带中断标志的中断(不能挂起)。在 AVR 中,大多数的中断都属于带中断标志的中断。所谓的中断标志,是每个中断源在其 I/O 空间寄存器中具有自己的一个中断标志位。AVR 的硬件系统在每个时钟周期内都会检测(接受)外部(内部)中断源的中断条件。一旦中断条件满足,AVR 的硬件就会将置位相应的中断标志位(置为“1”),表示向 MCU 提起中断请求。


3)、中断屏蔽与管理


AVR 对中断采用两级控制方式。两级控制是指 AVR 有一个中断允许的总控制位 I(既 AVR 标志寄存器 SREG 中的 I 标志位“SREG.7”),通常称为全局中断允许控制位。同时 AVR 为每一个中断源都设置了独立的中断允许位,这些中断允许位分散位于各中断源所属模块的控制寄存器中。

▋AVR响应一个可屏蔽中断源(假定为A中断)的中断的条件是:
    响应A中断 = 全局中断允许标志 AND 中断A允许标志位 AND 中断A标志
    当某个中断条件成立后,硬件会自动将该中断的标志位置"1",表示中断产生,同时也作为申请中断服务的请求信号。如果该中断的允许位为"1",同时AVR的全局中断允许位 I 也是"1"时,那么MCU在执行完当前一条指令之后就会响应该中断。
▋AVR复位后,各个中断允许位以及全局中断允许位均被清零,这保证了程序在开始执行时(一般程序开头是对芯片内部以及外围系统的初始化设置)不会受到中断的干扰。
▋AVR复位后的用户初始化程序中,需要先对需要使用的中断源进行必要的配置,待系统初始化过程结束后在置位 I ,使系统进入正常的工作状态,开始响应中断请求。

4)、中断嵌套


AVR在响应一个中断的过程中通过硬件将 I 标志位自动清零,这样就阻止了MCU响应其它中断。通常情况下,AVR是不能自动实现中断嵌套的。如果系统中必须要实现中断嵌套的应用,用户可以在中断服务程序中使用指令将全局中断允许位开放,通过间接的方式实现中断的嵌套处理。


滥用中断嵌套会造成程序流程的不确定性。因此建议只有当某中断确实需要得到实时响应时才考虑使用中断嵌套处理,一般情况下尽量不要采用中断嵌套,因为 AVR 本身是高速单片机,它运行速度是能足够快速的将中断服务程序执行完的。当然,用户编写中断服务程序时,应遵循尽量短小的原则。


AVR的中断响应过程:

1)、中断响应的过程

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

▶ 清零状态寄存器SREG中的全局中断允许标志位 I ,禁止响应其他中断。

▶ 将被响应中断的标志位清零(这个只是部分中断有此操作)。

▶ 将中断断点的地址(即当前程序计数器PC的值)压入堆栈,并将SP寄存器中的堆栈指针减二。

▶ 自动将相应的中断向量地址压入程序计数器PC,即强行转入执行中断入口地址处的指令。

中断响应过程全部由硬件自己实现,不需要用户干预。

2)、中断返回的过程

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

▶ 从栈顶弹出2个字节的数据,将这两个数据压入程序计数器PC中,并将SP寄存器中的堆栈指针加2。

▶ 置位状态寄存器SREG中的全局中断允许标志位I,允许响应其他中断。

中断返回后,会检测中断标志,如果存在其他被挂起的中断,则AVR在中断返回后还需执行一条指令,被挂起的中断才会得到响应。

3)、中断现场的保护

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

▶ 中断入口处的指令。用于指引MCU转移到中断服务程序。

▶ 中断服务程序。完成中断服务的功能。

▶ 中断返回指令。指引MCU从中断服务程序中返回。

  为了提高中断响应的实时性,AVR在中断响应和返回过程中,硬件上的处理仅仅保护和恢复了中断的断点(PC值)。而对中断现场没有采取任何处理。
  因此,中断现场的保护工作需要用户在自己编写的中断服务程序中通过软件完成,以保证主程序在被打断时所使用的标志位和临时寄存器等不会被中断服务程序改变,例如,对状态寄存器SREG的保护等!



中断服务程序编写:(三个框架)中断向量区部分、主程序部分和中断服务程序部分。

1)、中断向量区部分


缺省情况下,AVR的中断向量区在Flash程序存储器的最低端。最开始的0x0000是不可屏蔽的复位上电的中断向量,此处有一条转移到主程序开始处的跳转指令。


2)、主程序部分


单片机主程序的开始阶段通常要对整个系统已经芯片本身进行初始化设置,然后才能进入正常的工作流程中。分为:堆栈指针的初始化、中断源设置、开放全局中断、各中断源相应的中断允许设置。

  开放中断源本身的中断允许位之前,最好先使用指令将该中断的中断标志位清除,然后马上将中断允许位置“1”。
  在开放中断前清楚可能存在的中断标志,保证了中断开放后不会形成一次“多余”的中断,这个“多余”的中断有时会造成致命的错误。因为在对中断源进行设置过程中,或中断源对应的硬件模块在工作中都有可能改变中断标志位。

3)、中断服务程序

由于在中断向量处通常放置一条转移指令,用于再次跳转到中断服务程序的开始处,所以中断服务程序可以放置在FLASH空间的任何地方。

中断服务程序中要考虑被中断现场的保护和恢复问题。中断的产生和响应是随机的,而且在中断服务程序中经常要使用一些寄存器,或对RAM中的变量进行操作,也会有判断和跳转的操作,这些指令可能会改变SREG中的标志位,所以必须确保当从中断服务程序返回时,被中断服务程序改变的现场全部正确的恢复,这样当中断返回后,主程序才能正确继续运行下去。


除了一些必须在中断中完成的工作外,对于那些不需要马上处理的工作,如键盘处理、扫描显示等应该放在主程序中完成,也就是说,中断服务程序应尽可能的短。中断服务程序短,不是程序指令少,而是执行一次中断服务程序所需要的时间短。尽量减少中断服务程序的执行时间有以下优点:

▋可以不必采用中断嵌套技术。AVR的硬件不支持自动的中断嵌套处理,因此中断执行时间短的话能够尽快的响应其他被挂起的中断,提供系统总体的实时响应速度。

▋能够防止丢失周期性中断或其它短时中断。列如,当系统有一个1ms产生一次的周期型中断源,你的中断服务程序就必须在1ms完成,否则将会造成下一个中断的“丢失”。

  有很多情况下,中断仅仅表示外围设备或内部功能部件的工作过程已经达到某种状态,但不需要马上去处理,或者允许在一个比较充裕的限定时间内处理,这就可以将它们的处理工作放到主程序中完成。在这种情况下,最好的方式就是定义和使用信号量或标志变量,在中断服务程序中只是简单的对这些信号量或标志量进行必要的设置,不做其他处理就马上返回主程序,由主程序中根据这些信号量或表质量的值进行和完成处理工作。
  这样做的另一个好处是,可以大大减少中断服务程序中的对中断现场保护和恢复的工作,从而又减少了中断程序的执行时间,同时也节省了堆栈空间和FLASH空间(代码少了)。
推荐阅读

史海拾趣

Aeroflex公司的发展小趣事

在发展过程中,Aearo Technologies经历了一次重要的收购事件。3M公司看中了Aearo在能量控制领域的领先地位和技术实力,于XXXX年将其收购。收购后,Aearo Technologies成为了3M旗下的一家子公司,继续保留其品牌和技术优势。通过业务整合和资源共享,Aearo Technologies在3M的支持下实现了更快速的发展。

AOS公司的发展小趣事

进入20世纪,AOS公司开始将目光投向热水领域。1936年,公司研发出了著名的“金圭特护内胆”技术,这一创新在热水器行业中引起了革命性的变化。金圭内胆不仅提高了热水器的耐用性和安全性,也大幅提升了产品的能效。这一技术的推出使AOS公司迅速成为热水领域的领先者,并奠定了其在全球热水器市场的领导地位。

BURGESS公司的发展小趣事

BURGESS公司于1975年3月13日在伦敦正式成立,这标志着它在游艇经纪行业的起点。创立之初,BURGESS就凭借其专业的知识和敏锐的市场洞察力,在短短四年内成功进驻摩纳哥这一游艇行业的重镇。更令人瞩目的是,在同一年,BURGESS成功售出了当时世界上最大的游艇,这一成就不仅彰显了其卓越的实力,也为其在行业内赢得了极高的声誉。

HALO Electronics公司的发展小趣事

2001年对BURGESS来说是具有重要意义的一年。在这一年,BURGESS荣获了女皇赏,这是对其卓越业绩和贡献的极高认可。同时,BURGESS还售出了由Lurssen船厂制造的当时世界上最大的私人超级游艇,这一成就再次证明了其在游艇经纪行业的卓越地位。

Datatronic公司的发展小趣事

随着全球化趋势的加速,Datatronic公司开始将目光投向国际市场。公司通过参加国际展览、设立海外办事处等方式,积极拓展海外市场。同时,公司还加强了与国际企业的合作,引进先进的技术和管理经验。这些努力使得Datatronic公司在国际市场上逐渐获得了认可,品牌影响力得到了提升。

Azoteq公司的发展小趣事

2013年,Azoteq发布了第三条产品线——PowerSense™。这一产品系列主要包括一系列交流LED照明解决方案,为照明行业带来了全新的技术突破。PowerSense™的推出,不仅进一步巩固了Azoteq在半导体行业的地位,也为其在未来的市场竞争中赢得了更多机会。

问答坊 | AI 解惑

用感光板制作电路板全程图解 (一)

用感光板制作电路板全程图解   在业余电子制作及电子产品开发中常常需要做电路板,手工制作电路板的方法多种多样,每种制作的方法也是各有优缺点。我使用的较多的是利用感光板来制作电路板,今天就给大家来个用感光板制作电路板的全程图解。 ...…

查看全部问答>

8962里的时钟到底时怎么控制的,库函数好像有问题

按照周立功的说明,外部晶振频率经过锁相环倍频到200M,再由SYSDIV分频。 周立功开发板使用6M外部晶振,在如下配置情况下 SysCtlClockSet( SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_ ...…

查看全部问答>

友善 2440 回复对cam的驱动

友善mini 2440不支持wince下的Camera,尽管内核中打包了camera.dll,但是查看过bsp的源码,觉得不对,就说初始化吧,Camera_Initialize()在上电的时候对摄像头做初始化,初始化中断,但 IIC_InterruptEvent = CreateEvent(NULL, FALSE, FALSE,NULL ...…

查看全部问答>

事件的问题求助

请问各位高手: 创建两个返回不同句柄的事件,关联同一USB插拔事件 hEventUsb = CreateEvent(0,FALSE,FALSE,L\"_USB_CableEvent_\"); hEventIdle = CreateEvent(0,FALSE,FALSE,L\"_USB_CableEvent_\"); 在程序中     WaitForSingleO ...…

查看全部问答>

USB驱动 蓝屏 bhound5.sys 错误怎么回事?

用DeviceIOControl写数据时,蓝屏,出现 STOP:0X0000008E (0XC0000005, 0XF771745B, 0XF5BEA580,0X00000000) bhound5.sys - address F771745b base at F7717000, Datestamp 3f8bbffd USB驱动程序和应用程序哪里会出问题?…

查看全部问答>

win ce 软件

求一个能在windows ce net 5.0 上能使用的手写输入软件…

查看全部问答>

今天你吃芦苇了吗

农民培育出株高达1.55米水稻  荆楚网消息 (楚天都市报见习记者满达)武汉市新洲区李集街高中村的李湘应最近心情很激动:经过5年时间,他终于培育出株高达1.55米的“高杆水稻”。   7日下午,李湘应站在田间,水稻植株高过了他的颈部。李湘 ...…

查看全部问答>

【M4 开发板入门】EKK-LM4F232探索一

该文件基于LM4F232的E文PDF,借助翻译工具弄出来的。 有些部分没有摘录出来的可以直接参看LM3S9B96的PDF   文档需要不断的修改更新。 [ 本帖最后由 蓝雨夜 于 2011-10-10 23:07 编辑 ]…

查看全部问答>

为什么程序老是进入死循环

这个是我根据一个lm3s_lib_interrupt.pdf,写的一个关于LM3S9B96按键中断的程序,可是进不了中断,不过按键查询可以。按键中断却不行,为什么呢?哪个大侠帮忙看下。…

查看全部问答>

Error[Li005]: no definition for "__write" 哪位高手能解释一下?

EWARM5.41版本编译链接出错 Error[Li005]: no definition for \"__write\" [referenced from putchar.o(dl7M_tl_in.a)]  看到以前一个帖子里说 “IARARM520的ewp文件中Release版本的GenLowLevelInter ...…

查看全部问答>