精华内容
下载资源
问答
  • 当PIC16F 877单片机外部有多个中断源中断请求时,74LS148优先权编码器首先对这些中断源进行优先级排序,把优先级别高的中断送入单片机中断入口,让单片机响应中断级别高的中断请求,处理完这一中断后返回,等待下一轮中断...
  • 中断优先级

    千次阅读 2021-07-25 04:32:43
    为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程度,硬件将中断源分为若干个级别,称作中断优先级。在实际系统中,常常遇到多个中断源同时请求中断的情况,这时CPU必须确定首先为哪...

    为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程度,硬件将中断源分为若干个级别,称作中断优先级。

    在实际系统中,常常遇到多个中断源同时请求中断的情况,这时CPU必须确定首先为哪一个中断源服务,以及服务的次序。解决的方法是中断优先排队,即根据中断源请求的轻重缓急,排好中断处理的优先次序即优先级( Priority ),又称优先权,先响应优先级最高的中断请求。另外,当CPU正在处理某一中断时,要能响应另一个优先级更高的中断请求,而屏蔽掉同级或较低级的中断请求,形成中断嵌套。

    中文名

    中断优先级

    外文名

    Interrupt priority

    解决方法

    软件、硬件优先级排队作    用

    及时响应并处理发生的所有中断

    排序方法

    引起中断事件的重要性和紧迫程度

    依    据

    优先级

    中断优先级简介

    编辑

    语音

    微机系统中有多个中断源,有可能出现两个或两个以上中断源同时发出中断请求的情况。多个中断源同时请求中断时,CPU必须先确定为哪一个中断源服务,要能辨别优先级最高的中断源并进行响应。CPU在处理中断时也要能响应更高级别的中断申请,而屏蔽掉同级或较低级的中断申请,这就是中断优先级问题。[1]

    中断系统中,CPU一般根据各中断请求的轻重缓急分别处理,即给每个中断源确定一个中断优先级别,系统自动对它们进行排队判优,保证首先处理优先级别高的中断请求,待级别高的中断请求处理完毕后,再响应级别较低的中断请求。对多个中断源进行识别和优先级排队的日的就是要确定出最高级别的中断源,并形成该中断源的中断服务程序入口地址,以便CPU将控制转移到该中断服务程序去。[1]

    一般指以下两层含义:[2]

    ①若有2个或2个以上的中断源同时提出中断请求,微处理器先响应哪个中断源,后响应哪个中断源;[2]

    ②若一个中断源提出中断请求,微处理器给予响应并正在执行其中断服务程序时,又有1个中断源提出中断请求,后来的中断源能否中断前一个中断源的中断服务程序。[2]

    中断优先级分类

    编辑

    语音

    中断是用以提高计算机工作效率、增强计算机功能的一项重要技术。最初引入硬件中断,只是出于性能上的考量。如果计算机系统没有中断,则处理器与外部设备通信时,它必须在向该设备发出指令后进行忙等待(Busy waiting),反复轮询该设备是否完成了动作并返回结果。这就造成了大量处理器周期被浪费。引入中断以后,当处理器发出设备请求后就可以立即返回以处理其他任务,而当设备完成动作后,发送中断信号给处理器,后者就可以再回过头获取处理结果。这样,在设备进行处理的周期内,处理器可以执行其他一些有意义的工作,而只付出一些很小的切换所引发的时间代价。后来被用于CPU外部与内部紧急事件的处理、机器故障的处理、时间控制等多个方面,并产生通过软件方式进入中断处理(软中断)的概念。[3]

    中断可分为如下几种:

    中断优先级硬件中断

    (Hardware Interrupt)[3]可屏蔽中断(maskable interrupt)。硬件中断的一类,可通过在中断屏蔽寄存器中设定位掩码来关闭。[3]

    非可屏蔽中断(non-maskable interrupt,NMI)。硬件中断的一类,无法通过在中断屏蔽寄存器中设定位掩码来关闭。典型例子是时钟中断(一个硬件时钟以恒定频率—如50Hz—发出的中断)。[3]

    处理器间中断(interprocessor interrupt)。一种特殊的硬件中断。由处理器发出,被其它处理器接收。仅见于多处理器系统,以便于处理器间通信或同步。[3]

    伪中断(spurious interrupt)。一类不希望被产生的硬件中断。发生的原因有很多种,如中断线路上电气信号异常,或是中断请求设备本身有问题。[3]

    中断优先级软件中断

    (Software Interrupt)软件中断也叫内部中断,它是CPU执行中断指令INT n产生的中断。中断指令提供了直接调用中断服务程序的软件手段。[4]

    软件中断是以INT n指令的形式出现在程序中的,中断指令占用两个字节,第一个字节为指令码CDH,第二个字节为指令操作数n,即中断类型码。当软件中断时,CPU从指令流中读取中断类型码;当可屏蔽中断时,要在发出中断响应信号ITA后,才能从数据总线上读取中断类型码。可见,软件中断与外部中断有许多不同之处,它具有自身的一些特点,表现在以下几个方面。[4]

    (1)软件中断是以一条指令INT n而进入中断服务程序的,并且其中断类型码由指令的第二字节提供。[4]

    (2)软件中断不受中断允许标志IF的禁止,即无论正=1或0,对任何一个软件中断都不影响。其中,只有单步中断受单步标志TF的影响,即只有当TF=1时,才能执行单步中断。[4]

    (3)由于CPU从指令流中读取软件中断的中断类型码,因此,在软件中断进入中断后,不需要执行中断响应总线周期,也不必从数据总线上读取中断类型码。[4]

    (4)软件中断除类型0(除数为0的中断)外,都没有随机性,因为软件中断是以INT n指令的形式出现在程序中的,该指令放在程序的何处何时执行都是预先定好的,这就使得软件中断不会出现随机性。[4]

    中断优先级中断源种类

    编辑

    语音

    (1)设备中断:如键盘、打印机等设备的数据传送请求等。[1]

    (2)指令中断:为了方便用户使用系统资源或调试软件而设置的中断指令,由程序预先安排的中断指令(INT n)引起,如BIOS及DOS系统功能调用的中断指令等。[1]

    (3)故障中断:计算机内部设有故障自动检测装置,如电源掉电、奇偶校验错或协处理器中断请求等意外事件,都要求CPU进行相应的中断处理。[1]

    (4)实时时钟中断:在自动控制系统中,常遇到定时检测与时间控制,这时可采用外部时钟电路进行定时。CPU可发出命令启动时钟电路开始计时,待定时时间到,时钟电路就会向CPU发出中断申请,由CPU进行处理。[1]

    (5) CPU内部运算产生的某些错误所引起的中断:如除法出错、运算溢出、程序调试中设置断点等。[1]

    中断优先级中断响应原则

    编辑

    语音

    响应不同优先级中断的原则是:[5]CPU首先响应高优先级的中断请求;

    如果优先级相同,CPU按查询次序响应排在前面的中断;

    正在进行的中断过程不能被新的同级或低优先级的中断请求所中断;

    正在进行的低优先级中断过程,能被高优先级中断请求所中断。

    中断优先级响应流程

    编辑

    语音

    CPU在执行每一条指令的后期,要对所有的中断源进行检测。[5]

    在检测到中断请求前,程序计数器PC中存储的是下一条指令码的地址。如果CPU检测到某一中断请求并将响应该中断时,它要跳转到该中断服务程序处,即把PC的当前内容保存起来,再把该中断服务程序的入口地址送给PC,则其后CPU就执行该中断服务程序了。[5]

    b7240e5016ab5eacdf7d8c1f303e9f9b.png

    图1 CPU响应中断流程

    [5]在退出中断服务程序前,CPU要执行中断返回指令RETI,该指令把进入中断服务程序前保存的PC内容再写入PC,则其后CPU就从进入中断服务程序前的断点处向下执行指令,其流程如图1所示用C51编写中断服务函数时,并不需要在中断服务函数的最后编写RETI指令,该指令由编译器在编译中断服务函数时自动添加。

    中断优先级优先级排队

    编辑

    语音

    在实际系统中,常常遇到多个中断源同时请求中断的情况,这时CPU必须确定首先为哪一个中断源服务,以及服务的次序。解决的方法是中断优先排队,即根据中断源请求的轻重缓急,排好中断处理的优先次序即优先级( Priority),又称优先权,先响应优先级最高的中断请求。另外,当CPU正在处理某一中断时,要能响应另一个优先级更高的中断请求,而屏蔽掉同级或较低级的中断请求,形成中断嵌套。[6]

    中断源的优先级判别一般可采用软件优先级排队和硬件优先级排队两种方法。[7]

    中断优先级软件优先级排队

    948d699fb96c8f5dfd92f8ded619a179.png

    图2 软件査询接口电路如图2所示,优先级由查询顺序决定,先查询的中断源具有最高的优先级。[8]

    软件优先级排队是指各个中断源的优先权由软件安排。若干个外设的中断请求信号相“或”后,送至CPU的中断接收引脚(如INTR)。这样,只要任一外设有中断请求,CPU便可响应中断。在中断服务子程序前可安排一段优先级的查询程序,即CPU读取外设中断请求状态端口,然后根据预先确定的优先级级别逐位检测各外设的状态,若有中断请求就转到相应的Uo处理程序入口,为该外设服务。[7]

    71af1de55d112643a2b592e6e864456d.png

    软件查询程序流程用软件査询方法确定中断优先级是一种最简单的解决方法,主要依靠软件方法实现,不需要专门的优先级排队电路,可以通过修改查询顺序来修改中断优先级,不必更改硬件。但是当中断源个数较多时,由逐位检测査询到转入相应中断服务程序所耗费的时间较长,中断响应速度慢,服务效率低。[7]

    中断优先级硬件优先级排队

    dd8ec7437355aa01df587d6a172b5863.png

    菊花链优先级排队电路为提高中断处理效率,通常采用硬件处理中断优先权问题,即采用优先级排队电路或专用中断控制器等硬件电路来管理中断。其中,硬件优先权排队电路形式众多,有采用编码器组成的,有采用链式电路的。[1]

    利用外设连接在排队电路的物理位置来决定其中断优先权的,排在最前面的优先级最高,排在最后面的优先级最低。[6]

    中断优先级改变并发中断优先级的方法

    编辑

    语音

    在PC环境下,要改变并发中断优先级,实现理想的中断处理顺序,要从以下两个方面着手。

    (1)使低优先级的中断可中断高优先级的中断服务程序。

    通过研究发现,8259A 中的中断服务寄存器ISR。对中断处理顺序的改变起了非常重要的作用。当中断服务寄存器的相应位置 1时,8259A 自动禁止同级和较低级的中断请求。因此要改变中断的处理顺序,必须在CPU响应中断后,将8259A中的相应位清零的。这样,如果有新的中断请求,不论它的级别高低,只要CPU处于开中断状态,芯片就会马上再向CPU发出中断请求,即低优先级的中断就可能会中断高优先级的中断服务程序。而实现CPU响应中断后,将中断服务寄存器8259A中的相应位清零,有3种解决的办法。[9]

    (2)在中断处理程序中设置新的中断屏蔽字。

    为了能根据需要,改变实际的中断处理次序,很多机器都设置了中断屏蔽寄存器硬件,以决定是否让某级中断请求进入中断优先权电路进行优先权比较。级别高的中断请求优先得到响应。只要将每一类中断处理程序的各级中断屏蔽位设置成不同的状态,就可以得到所希望的中断处理次序。[9]

    中断优先级单级中断与多级中断

    编辑

    语音

    根据计算机系统对中断处理策略的不同,中断系统可以分为单级中断系统和多级中断系统,单级中断系统是中断结构中最基本的形式。[1]

    在单级中断系统中,所有的中断源都属于同一级,所有中断请求触发器排成一行,其优先次序是离CPU越近优先级越高。当响应某一中断请求时,CPU执行该中断源的中断服务程序,在此过程中,中断服务程序不允许被其他中断源所打断,即使优先级比它高的中断源也不例外,只有当该中断服务程序执行完毕之后,才能响应其他中断。[1]

    多级中断系统是指计算机系统中的多个中断源,根据中断事件的轻重缓急程度不同而分成若干个级别,每一个中断级分配一个优先级。一般而言,优先级高的中断级可以打断优先级低的中断服务程序,以中断嵌套方式进行工作。[1]

    在中断优先级已定的情况下,CPU总是首先响应优先级最高的中断请求。当CPU正在响应某一中断源的请求,即正在执行某个中断服务程序时,若有优先级更高的中断源申请中断,为使级别更高的中断源能及时得到服务,CPU就应暂停当前正在服务的级别较低的服务程序而转入新的中断源服务,等新的级别较高的中断服务程序执行完后,再返回到被暂停的中断服务程序继续执行,直至处理结束返回主程序,这种过程称为中断嵌套。CPU允许高优先级中断请求可以打断低优先级中断服务,使CPU对于急需处理的事件立即做出响应。[1]

    中断嵌套的出现,扩大了系统中断功能,进一步加强了系统处理紧急事件的能力。中断嵌套可以商多级。具体级数(即嵌套深度)原则上不限制,只取决于堆栈深度,实际上与要求的中断响应速度有关。[1]

    词条图册

    更多图册

    参考资料

    1.

    杨立,邓振杰,荆淑霞等编著.微型计算机原理与接口技术:中国铁道出版社,2016.02:第219页

    2.

    袁志勇,王景存主编;章登义,刘树波副主编.嵌入式系统原理与应用技术:北京航空航天大学出版社,2014.01:第146页

    3.

    张自军,蒋军,叶爱芹.微机原理与接口技术:中国科学技术大学出版社,2012.08:第205页

    4.

    李育贤.微机接口技术及其应用:西安电子科技大学出版社,2007.06:第73页

    5.

    王普斌.单片机接口与应用:冶金工业出版社,2016.04:第61页

    6.

    刘显荣主编;张元涛,吴云君副主编;汪德彪,常继彬,叶文,范苏参编.微机原理与嵌入式接口技术:西安电子科技大学出版社,2016.08:第129页

    7.

    万晓东,陈则王,孔德明编著.计算机硬件技术基础:南京航空航天大学,2013.01:第275页

    8.

    刘显荣主编;张元涛,吴云君副主编;汪德彪,常继彬,叶文,范苏参编.微机原理与嵌入式接口技术:西安电子科技大学出版社,2016.08:第130页

    9.

    陈燕俐, 洪龙, CHENYan-li, et al. 自由调整中断优先级的研究和实现[J]. 南京邮电大学学报(自然科学版), 2005, 25(6):35-39.

    展开全文
  • 多外部中断源系统设计

    4.9.1 定时器/计数器作为外部中断源的使用方法

    4.9.2 中断和查询结合的方法

    • 实际的应用中,两个外部中断请求源往往不够用,需对外部中断源进行扩充,如图4-11所示。系统有5个外部中断请求源IR0~IR4,高电平有效。
    • 最高级的请求源IR0直接接到AT89S52的一个外部中断请求输入端INT0*,其余4个请求源IR1~IR4通过各自的OC门(集电极开路门)连到AT89S52的另一个外中断源输入端 INT1* ,同时还连到P1口的P1.0~P1.3脚,供AT89S52查询。
    • 图4-11所示电路,除了IR0优先权级别最高外,其余4个外部中断源的中断优先权取决于查询顺序,中断优先权的高与低,取决于查询顺序。
    图4-11 中断和查询相结合的多外部中断请求源系统
    • 假设图4-11中的4个外设中有一个外设提出高电平有效的中断请求信号,则中断请求通过4个集电极开路OC门的输出公共点,即 INT1* 脚的电平就会变低。究竟是哪个外设提出的请求,要通过程序查询P1.0~P1.3引脚上的逻辑电平来确定
    • 本例假设某一时刻只能有一个外设提出中断请求,并设IR1~IR4这4个中断请求源的高电平可由相应的中断服务子程序清“0”,则中断服务子程序如下:
    • 查询法扩展外部中断源比较简单,但是扩展的外部中断源个数较多时,查询时间稍长。

    4.9.3 用优先权编码器扩展外部中断源

    • 当需要处理的外部中断源数目较多而又要求响应速度很快时,软件查询方法常常满足不了时间上的要求。因为在外部中断源很多的情况下,响应优先级最高和响应优先级最低的中断所需的查询时间可能相差很大。如果采用硬件对外部中断源进行优先级排队就可避免这个问题。下面介绍采用优先权编码器扩展外部中断源的方法。
    • 74LS148是一种优先权编码器,利用74LS148扩展AT89S52外部中断源的电路如图4-12所示,74LS148的真值表见表4-3。74LS148具有8个输入端“0~7”,用作8个外部中断请求IR0~IR7输入端,3个编码输出端A2~A0与单片机的P1.3~P1.1口线相连。
    图4-12 使用优先权编码器扩展8个外部中断源
    • 编码器输出控制端与单片机的外中断请求输入INT1*脚相连。在使能端为低电平的情况下,只要其8输入端中任一输入为低电平,就有一组相应的编码从A2~A0端输出,且同时编码器输出端输出低电平。
    • 如果8中断源IR0~IR7中有多个中断请求时(低有效),其优先权最高的一组编码就出现在单片机的P1.3~P1.1口线上,此时CS端为低电平,则AT89S52的INT1端就为低电平,若INT1*中断被允许,就可以响应外部中断源所提出的中断请求。
    • 例如,中断请求源IR1与IR4、IR6同时发出中断请求的情况下,GS端为低电平,向INT1发出中断请求,同时A2~A0端仅输出中断优先级最高的编码“001”,当单片机响应该中断请求信号后,进入INT1中断服务子程序,然后读入从P1.3~P1.1输入的编码“001”,从而去响应IR1*的中断请求。
    • 为了使程序转向各中断源的中断服务子程序,必须在AT89S52的INT1*的中断服务程序中编写如下引导程序:
    • 74LS148的输入端“7”(即IR0端)具有最高优先权,输入端“0”( IR7即端)优先权最低,这相当于给图中的8个外部中断请求源安排了一个中断优先级顺序。因此,当同时有多个中断源提出中断申请时,AT89S52只响应优先权最高的那个中断源的中断申请。
    • 上述电路结构简单,价格低廉,但该电路无法实现中断嵌套。即当一个中断申请正在被执行时,单片机不能响应别的中断源的中断申请(仅指IR0~IR7)。
    • 由于所扩展的外中断源都是向AT89S52提出中断申请,因此,这些外中断源在使用时应注意以下三个问题

      (1)中断响应时间
    • AT89S52的外中断响应时间在3~8个机器周期内,由于AT89S52在真正为所扩展的外中断源(IR0~IR7)服务之前需执行一段引导程序,因此对所扩展的外中断源而言,中断响应时间还要把执行引导程序所需的时间算在内。
      (2)中断申请信号低电平的宽度
    • 扩展的外部中断源,中断请求信号的低电平要有足够宽度,应一直保持到AT89S52将74LS148提供的编码取走为止,否则会出现错误。AT89S52读取这个编码要执行4条指令,需7个机器周期,若系统时钟频率为12MHz,则外中断请求信号低电平的宽度至少要大于15µs。
      (3)堆栈深度的问题
    • 由于AT89S52的堆栈只能设在片内RAM,字节有限,每次响应中断时都要把断点、现场的内容压入堆栈内,如果发生中断服务子程序中又调用子程序,则极容易发生堆栈溢出或侵占其它片内RAM内容,从而造成程序混乱,在使用中要特别注意。
    • 除上述3种方法外,还可采用可编程中断控制器接口芯片8259A来进行外部中断源的扩展,限于篇幅,不作介绍,读者可查阅相关资料。
    展开全文
  • 4.2 51单片机-中断

    2021-10-28 16:49:20
    4.2 中断 4.2.1 中断介绍 中断系统是为使CPU具有对...微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻

    4.2 中断

    4.2.1 中断介绍

    中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的

    当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完完后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断,实现这种功的部件称为中断系统,请示CPU中断的请求源称为中断源。

    微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别,CPU总是先响应优先级别最高的中断请求。

    当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求;如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后再回到原来低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。

    4.2.2 STC90C51RD系统中断源介绍

    STC90C51RC/RD+系列单片机提供了8个中断请源,它们分别是:外部中断0(INT0)、定时器0中断、外部中断1(INT1)、定时器1中断、定时器2中断、串口(UART)中断、外部中断2(INT2)、外部中断3(INT3)

    所有的中断都具有4个中断优先级,用户可以用关总中断允许位(EA/IE.7)或相应中断的允许位,屏蔽所有的中断请求,也可以打开相应的中断允许位使CPU响应相应的中断申请;每一个中断源可以用软件独立地控制开中断或关中断状态;每一个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。

    4.2.3 中断的优先级与中断结构图

    图4-2-1 中断优先级表

    通过设置新增加的特殊功能寄存器IPH中的相应位,可将中断优先级设为四级,如果设置IP或XICON,那么中断优先级就只有两级,与传统8051单片机两级中断优先级完全兼容。

    图4-2-2 中断结构图 

     

    图4-2-3 中断相关寄存器

    4.2.4 中断服务函数

    中断服务函数的名字只要符合C语言标识符的命名规则,可以随意取,需要注意的地方是: 中断服务函数没有返回值,没有形参,也不需要单独去声明,并且函数名称体的右边需要使用interrupt关键字声明,interrupt是中断特有的关键字,在interrupt关键字后面可以增加数字,这个数字是根据中断优先级编号来的(可以看4.2.3小节的中断优先级表)。

    使用C语言编程,中断查询次序号就是中断号,C51所有的中断服务函数编写如下:

    void EXTI0_IRQHandler(void) interrupt 0 //外部中断0
    {
        /*code block*/
    }
    void TIM0_IRQHandler(void) interrupt 1  //定时器0
    {
        /*code block*/
    }
    void EXTI1_IRQHandler(void) interrupt 2 //外部中断1
    {
        /*code block*/
    }
    void TIM1_IRQHandler(void) interrupt 3  //定时器1
    {
        /*code block*/
    }
    void UART_IRQHandler(void) interrupt 4  //串口
    {
        /*code block*/
    }
    void TIM2_IRQHandler(void) interrupt 5  //定时器2
    {
        /*code block*/
    }
    void EXTI2_IRQHandler(void) interrupt 6 //外部中断2
    {
        /*code block*/
    }
    void EXTI3_IRQHandler(void) interrupt 7 //外部中断3
    {
        /*code block*/
    }

    4.2.5 中断控制寄存器介绍

    51单片机CPU对中断源的开放或者屏蔽,每一个中断源是否被允许中断,是由内部的中断允许寄存器IE(地址为A8H)和XICON(地址为C0H)控制的,寄存器IE的格式如下:

    图4-2-4

    EA : CPU的总中断允许控制位, EA=1,CPU开放中断, EA=0, CPU屏蔽所有的中断申请。EA的作用是使中断允许形成两级控制。即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制。

    ET2: 定时/计数器T2的溢出中断允许位,ET2=1,允许T2中断; ET2=0,禁止T2中断。

    ES : 串行口1中断允许位。ES=1,允许串行口1中断; ES=0,禁止串行口1中断。

    ET1: 定时/计数器T1的溢出中断允许位。ET1=1,允许T1中断; ET1=0,禁止T1中断。

    EX1 : 外部中断1中断允许位。EX1=1,允许外部中断1中断; EX1=0,禁止外部中断1中断。

    ET0 : T0的溢出中断允许位。ET0=1,允许T0中断; ET0=0禁止T0中断。

    EX0 : 外部中断0中断允许位。 EX0=1,允许中断; EX0=0禁止中断。

    4.2.6 配置定时器0使用中断(8位模式)

    下面代码里配置51单片机的定时器0工作在8位定时器自动重装载模式,并开启了溢出中断,在自动重装载模式下,每次定时器溢出之后,会自动重装载,就省去了手动赋重装值的过程,比较方便,但是定时器的每次最大定时时间变短了,计数器到达255就会溢出。

    程序里封装了计算重装值的函数,方便调用,程序开启了溢出中断,定时器时间到达后会进入到中断服务函数,中断服务函数里使用了一个计数变量,用于记录定时器的超时次数,时间到达500毫秒时,就改变一次LED灯的状态。

    (硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

    示例代码:

    #include <reg51.h>
    int main()
    {
        Timer0_8bit_Init(100);  //配置定时器超时的时间为100us
        LED=0x00; //关闭所有灯
        while(1)
        {
            
        }
    }
    /*
    配置定时器0工作在8位自动重装载模式
    注意,时间不能超过定时器最大时间
    255*(12/11.059200)=276us
    */
    void Timer0_8bit_Init(u16 us)
    {   
        //当前实验板上的晶振实际频率为: 11.956MHZ
        u16 val=us/(12/11.956); //得到计数的时间,只要整数部分
        TMOD&=0xF0;     //清除配置
        TMOD|=0x02;     //配置定时器0工作在8位自动重载模式
        TL0=TH0=255-val;//得到重装载值;
        EA=1;           //开启总中断
        ET0=1;          //开启定时器0溢出中断
        TR0=1;          //启动定时器0
    }
    
    /*
    定时器0的中断服务函数
    */
    u32 cnt=0;
    void TIM0_IRQHandler(void) interrupt 1
    {
        //使用了中断,就不需要手动清除标志位,硬件会自动清除
        cnt++;//记录超时次数
        if(cnt==10*500) //500ms
        {
            cnt=0;
            LED=~LED;
    }
    }

    4.2.7 配置定时器1使用中断(16位模式)

    下面代码里配置51单片机的定时器1工作在16位定时器模式。程序封装了计算重装值的函数,方便调用,程序里开启了溢出中断,在中断服务函数里使用了一个计数变量,记录定时器超时的次数,时间到达1秒钟,就是改变一次LED灯的状态。

    (硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

    示例代码:

    #include <reg51.h>
    u16 T1_Update_data;//定时器1的初始值
    void Timer1_16bit_Init(u16 us)
    {   
        //当前实验板上的晶振实际频率为: 11.956MHZ
        u16 val=us/(12/11.956); //得到计数的时间,只要整数部分
        T1_Update_data=65535-val; //得到重装载值
        TMOD&=0x0F;            //清除配置
        TMOD|=0x10;            //配置定时器1工作在16位定时器模式
        TH1=T1_Update_data>>8; //定时器1高位重装值
        TL1=T1_Update_data;    //定时器1低位重装值
        EA=1;                   //开启总中断
        ET1=1;                  //开启定时器1溢出中断
        TR1=1;                 //启动定时器1
    }
    
    //定时器1的重装值更新函数
    void Timer1_Update(void)
    {
        TH1=T1_Update_data>>8; //定时器1高位重装值
        TL1=T1_Update_data;    //定时器1低位重装值
    }
    
    /*
    定时器1的中断服务函数
    */
    void TIM1_IRQHandler(void) interrupt 3  //定时器1
    {
        //使用了中断,就不需要手动清除标志位,硬件会自动清除
        Timer1_Update(); //更新重装载值
        //使用了中断,就需要手动清除标志位,硬件会自动清除
        cnt++;//记录超时次数
        if(cnt==1000) //1000ms
        {
            cnt=0;
            LED=~LED;
        }
    }
    int main()
    {
        Timer1_16bit_Init(1000);  //配置定时器超时的时间为1000us
        LED=0x00; //关闭所有灯
        while(1)
        {
            
        }
    }

    4.2.8 外部中断(EXTI)配置寄存器介绍

    STC90C51有4个外部中断源,分别是:外部中断0(P3.2),外部中断1(P3.3),外部中断2(P4.3),外部中断3(P4.2)。

    图4-2-5 外部中断1和0的IO口

    图4-2-6 外部中断2和3的IO口

    外部中断0和外部中断1的相关配置位在TCON寄存器里,TCON寄存器位如下表所示:

    图4-2-7 外部中断0和1的配置寄存器

    IE1外部中断1请求源(INT1/P3.3)标志。 当发生外部中断请求时 ,IE1会被CPU置1,在中断服务函数里需要将IE1清0。

    IT1外部中断1源中断源类型选位。IT1=0,INT1/P3.3引脚上的低电平信号可触发外部中断1;IT1=1,外部中断1为下降沿触发方式。

    IE0外部中断0请求源(INT0/P3.2)标志。 当发生外部中断请求时 ,IE0会被CPU置1,在中断服务函数里需要将IE0清0。

    IT0外部中断0中断源类型选择位。IT0=0,INT0/P3.2引脚上的低电平可触发外部中断0;IT0=1,外部中断0为下降沿触发方式。

    外部中断2和外部中断3的相关配置为在XICON寄存器里,XICON寄存器位如下表所示:

    图4-2-8 外部中断2和3的配置寄存器

    IE3 : 外部中断3中断请求标志位,中断条件成立后,IE3=1,可由硬件自动清零。

    IT3 : 当此位由软件置位时(IT3=1),外部中断3为下降沿触发中断;当此位由软件清零时(IT3=0),为低电平触发中断。

    IE2 : 外部中断2中断请求标志位,中断条件成立后,IE2=1,可由硬件自动清零。

    IT2 : 当此位由软件置位时(IT2=1),外部中断2为下降沿触发中断;当此位由软件清零时(IT2=0),为低电平触发中断。

    EX3 : 如被设置成1,允许外部中断3中断;如被清成0,禁止外部中断3中断。

    EX2 : 如被设置成1,允许外部中断2中断;如被清成0,禁止外部中断2中断。

    4.2.9 配置外部中断0下降沿触发示例

    下面代码配置外部中断0采用下降沿触发,在外部中断0的服务函数里改变LED灯的状态。

    外部中断0的复用IO是P3.2,在实验板上实验时,需要使用杜邦线把按键的一个引脚接在P3.2上,可以使用按键测试外部中断0的触发效果,由于实验板上的红外线遥控也是接的P3.2,为了不产生干扰,需要先将红外线遥控的跳线帽拔掉,再使用按键测试。

     图4-2-5

    (硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

    示例代码:

    #include <reg51.h>
    int main()
    {
        LED=0x00;
        EXTI0_Init();
        while(1)
        {
            
        }
    }
    /*
    配置外部中断0下降沿触发中断
    IO口: P3.2
    */
    void EXTI0_Init(void)
    {
       EA=1;  //开启总中断
       IT0=1; //外部中断0下降沿触发
       EX0=1; //允许外部中断0产生中断
    }
    /*
    外部中断0中断服务函数
    */
    void EXTI0_IRQHandler(void) interrupt 0
    {
        LED=~LED; //改变LED灯的状态
        IE0=0; //清除外部中断0的标志位
    }

    4.2.10 中断优先级配置

    传统8051单片机具有两个中断优先级,即高优先级和低优先级,可以实现两级中断嵌套。

    STC90C51RC/RD+系列单片机通过设置新增加的特殊功能寄存器(IPH)中的相应位,可将中断优先级设置为4个中断优先级;如果设置IP,那么中断优先级只有两级,与传统8051单片机两级中断优先级完全兼容。

    一个正在执行的低优先级中断能被高优先级中断所中断,但不能被另一个低优先级中断所中断。

    上所述可归纳为下面两条基本规则:

    1. 低优先级中断可被高优先级中断所中断,反之不能。

    2. 任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中断

    中断优先级的配置寄存器如下表所示:

    图4-2-6

    PX3H,PX3: 外部中断3优先级控制位:

    当PX3H=0且PX3=0时,外部中断3为最低优先级中断(优先级0)

    当PX3H=0且PX3=1时,外部中断3为较低优先级中断(优先级1)

    当PX3H=1且PX3=0时,外部中断3为较高优先级中断(优先级2)

    当PX3H=1且PX3=1时,外部中断3为最高优先级中断(优先级3)

    PX2H, PX2: 外部中断2优先级控制位:

    当PX2H=0且PX2=0时,外部中断2为最低优先级中断(优先级0)

    当PX2H=0且PX2=1时,外部中断2为较低优先级中断(优先级1)

    当PX2H=1且PX2=0时,外部中断2为较高优先级中断(优先级2)

    当PX2H=1且PX2=1时,外部中断2为最高优先级中断(优先级3)

    PT2H, PT2: 定时器2中断优先级控制位:

    当PT2H=0且PT2=0时,定时器2中断为最低优先级中断(优先级0)

    当PT2H=0且PT2=1时,定时器2中断为较低优先级中断(优先级1)

    当PT2H=1且PT2=0时,定时器2中断为较高优先级中断(优先级2)

    当PT2H=1且PT2=1时,定时器2中断为最高优先级中断(优先级3)

    PSH,PS: 串口1中断优先级控制位:

    当PSH=0且PS=0时,串口1中断为最低优先级中断(优先级0)

    当PSH=0且PS=1时,串口1中断为较低优先级中断(优先级1)

    当PSH=1且PS=0时,串口1中断为较高优先级中断(优先级2)

    当PSH=1且PS=1时,串口1中断为最高优先级中断(优先级3)

    PT1H, PT1: 定时器1中断优先级控制位:

    当PT1H=0且PT1=0时,定时器1中断为最低优先级中断(优先级0)

    当PT1H=0且PT1=1时,定时器1中断为较低优先级中断(优先级1)

    当PT1H=1且PT1=0时,定时器1中断为较高优先级中断(优先级2)

    当PT1H=1且PT1=1时,定时器1中断为最高优先级中断(优先级3)

    PX1H, PX1: 外部中断1优先级控制位:

    当PX1H=0且PX1=0时,外部中断1为最低优先级中断(优先级0)

    当PX1H=0且PX1=1时,外部中断1为较低优先级中断(优先级1)

    当PX1H=1且PX1=0时,外部中断1为较高优先级中断(优先级2)

    当PX1H=1且PX1=1时,外部中断1为最高优先级中断(优先级3)

    PT0H, PT0: 定时器0中断优先级控制位:

    当PT0H=0且PT0=0时,定时器0中断为最低优先级中断(优先级0)

    当PT0H=0且PT0=1时,定时器0中断为较低优先级中断(优先级1)

    当PT0H=1且PT0=0时,定时器0中断为较高优先级中断(优先级2)

    当PT0H=1且PT0=1时,定时器0中断为最高优先级中断(优先级3)

    PX0H, PX0: 外部中断0优先级控制位:

    当PX0H=0且PX0=0时,外部中断0为最低优先级中断(优先级0)

    当PX0H=0且PX0=1时,外部中断0为较低优先级中断(优先级1)

    当PX0H=1且PX0=0时,外部中断0为较高优先级中断(优先级2)

    当PX0H=1且PX0=1时,外部中断0为最高优先级中断(优先级3)

    中断优先级控制寄存器IP和IPH的各位都由可用户程序置“1”和清“0” 。但IP寄存器可位操作,所以可用位操作指令或字节操作指令更新IP的内容。而IPH寄存器的内容只能用字节操作指令来更新。

    STC90C51RC/RD+系列单片机复位后IPIPH均为00H,各个中断源均为低优先级中断

    4.2.11 配置外部中断0的优先级示例

    下面代码初始化了外部中断0和外部中断1,在外部中断0 的初始化代码里,配置外部中断0的优先级为最高,在外部中断1的中断服务函数里写了一个死循环。

    当外部中断1产生中断后,会卡死在中断服务函数里,这时可以触发外部中断0 ,测试外部中断0的中断服务函数是否可以执行(结果是可以执行的,因为外部中断0的优先级高于外部中断1的优先级,可以打断外部中断1的服务函数)。

    实验上的测试过程说明:

    外部中断0的复用IO是P3.2, 外部中断q的复用IO是P3.3,在实验板上实验时,需要使用杜邦线把按键1的引脚接在P3.2上,把按键2的引脚接在P3.3上,这样可以使用按键测试外部中断的触发效果,由于实验板上的红外线遥控接的是P3.2,为了不产生干扰,需要先将红外线遥控的跳线帽拔掉,再测试。

    (硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

    示例代码:

    #include <reg51.h>
    int main()
    {
        LED=0x00;
        EXTI0_Init();
        EXTI1_Init();
        while(1)
        {
            
        }
    }
    /*
    配置外部中断0下降沿触发中断
    IO口: P3.2
    */
    sfr IPH=0xB7; //定义特殊功能寄存器
    void EXTI0_Init(void)
    {
       IPH|=1<<0; //配置PX0H=1 
       PX0=1;     //当PX0H=1且PX0=1时,外部中断0为最高优先级中断(优先级3)
       EA=1;  //开启总中断
       IT0=1; //外部中断0下降沿触发
       EX0=1; //允许外部中断0产生中断
    }
    /*
    外部中断0中断服务函数
    */
    void EXTI0_IRQHandler(void) interrupt 0
    {
        LED=~LED; //改变LED灯的状态
        IE0=0; //清除外部中断0的标志位
    }
    
    /*
    配置外部中断1下降沿触发中断
    IO口: P3.2
    */
    void EXTI1_Init(void)
    {
       EA=1;  //开启总中断
       IT1=1; //外部中断1下降沿触发
       EX1=1; //允许外部中断1产生中断
    }
    /*
    外部中断1中断服务函数
    IO口: P3.3
    */
    void EXTI1_IRQHandler(void) interrupt 2
    {
        while(1){}  //死循环
        LED=~LED; //改变LED灯的状态
    IE1=0; //清除外部中断1的标志位
    }
    展开全文
  • 多重中断的处理及其中断源屏蔽字

    千次阅读 2021-01-08 19:25:09
    如果CPU在执行某一中断服务程序过程中,又遇到了新的更高级的中断请求,CPU暂停原中断的处理,而转去处理新的中断,待处理完毕后,再返回继续处理原来的中断,这种中断称为多重中断,也称中断嵌套。 2、多重中断的...
  • 本题为必选题,请在I、II两道试题中任选一题作答。I.对于学生在课堂上的违规行为,教师可能采用各种不同的办法进行处理。下面是5个实例:例一:学生张明在课堂上对邻座做鬼脸,引起对方发笑,老师对其注视片刻后,即...
  • 本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧...中文名中断外文名Interrupt Request分类中断装置和中断处理程序相关概念程序状态字和向量中断等系统功能实现中断响应和中断返回等中断定...
  • 51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。在说到中断之前,我先来定义一下优先级,明白了什么是优先级,后面的阐述...
  • 组成原理---中断

    千次阅读 2020-05-05 10:58:44
    文章目录中断的基本概念中断请求与判优中断响应中断服务与返回 中断系统是计算机中实现中断功能的软、硬件总称。一般在 CPU 中配置中断机构,在外设接口中配置中断控制器,在软件上设计相应的中断初始化程序和中断...
  • Q1:请教高人C51单片机C语言中的中断优先级怎么设置?C51中设置中断优先级,需要对中断寄存器IP进行配置。具体值需要根据用户需要的优先级顺序进行确定,具体的设置方法就是直接写如下C语言语句:IP = 06H;// 如果5...
  • stm32中断优先级概述

    2021-01-17 13:59:05
    stm32中断优先级概述一:综述STM32 目前支持的中断共...二:优先级判断STM32(Cortex-M3)中有两个优先级的概念——抢占优先级和响应优先级,其属性编号越小,则优先级别越高。有人把响应优先级称作“亚优先级”或“副...
  • demi 发布于:周三, 10/16/2019 - 15:15 ,关键词:51单片机包含五个中断源,两级中断优先级,优先级可编程设置,通过IP进行设置。● PX0(IP.0),外部中断0优先级设定位;● PT0(IP.1),定时/计数器T0优先级设定位;...
  • 《计算机组成原理 中断实验 实验五》由会员分享,可在线阅读,更多相关《计算机组成原理 中断实验 实验五(6页珍藏版)》请在技术文库上搜索。1、深深 圳圳 大大 学学 实实 验验 报报 告告 课程名称:课程名称: ...
  • configMAX_SYSCALL_INTERRUPT_PRIORITY 中断优先级设置问题 从CortexM角度 Cortex-M构架自身最多允许256级可编程优先级(优先级配置寄存器最多8位,所以优先级范围从0x00~0xFF), 是绝大多数微控制器制造商只是使用...
  • 要学习51单片机中断的朋友,拥有这一篇博文就够了,深入浅出,里面包含了寄存器,外部中断、定时器中断中断嵌套等的讲解,还有代码实战。快一万字,写得不容易,还请大家点赞支持一下,后续持续更新(一)寄存器1....
  • 单片机中断系统

    2021-08-29 10:55:31
    前言:中断系统是单片机非常重要的组成部分,是为了使单片机能够对外部或者内部随机发生的事件实时处理而设置的。 一:单片机的概念 一个高速主机和一个低俗外设连接时,效率极低,低俗外设工作时无端大量占用CPU...
  • 2)抢占优先级和响应优先级,其实是一个中断所包含的两个优先级,其中前者是抢占优先级之间的级别划分,后者是相同抢占优先级的优先级别的划分。中断A抢占优先级比B高,那么A的中断可以在B里面触发,忽略响应优先级;...
  • 中断详解

    千次阅读 2018-10-24 01:28:04
    1.中断的基本概念 程序中断是指在计算机执行现行程序的过场中,出现某些急需处理的异常情况或特殊请求,CPU暂停中断现行程序,而专区对这些异常情况或特殊情况进行处理,在处理完毕后CPU又自动返回到现行程序的断点...
  • stm32_中断优先级详解

    千次阅读 2021-01-30 09:57:19
    )前提条件1:组别优先顺序(第0组优先级最强,第4组优先级最弱):NVIC_PriorityGroup_0>NVIC_PriorityGroup_1>NVIC_PriorityGroup_2>NVIC_PriorityGroup_3>NVIC_PriorityGroup_4这里说的...
  • 单片机之中断优先级设置

    千次阅读 2020-09-14 17:39:35
    然而datashhet里STC12C5A60S2单片机复位后IP、IP2、IPH、IP2H均为00H,各个中断源都是低优先级=》不能被同级中断所中断 中断优先控制寄存器IP、IP2、IPH、IP2H 例如:想要实现外部中断1被中断0中断,设置外部中断0...
  • 1.机器校验中断:高速程序发生了设备故障,比如电源故障,主存出错等 ...4.外部中断:来自机器外部,包括定时器中断、外部信号中断中断中断等 5.IO中断:由IO控制器产生,用于发送信号通知操作完成 6.重启中断 ...
  • STM32中断—优先级设置

    千次阅读 2014-01-24 14:18:06
     STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。  (二)中断响应次序  (1)具有高抢占式优先级的...
  • 51单片机中断系统程序实例 (STC89C52RC)51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。中断优先级是可以给要做的事情排序。...
  • MCS-51单片机的中断系统

    千次阅读 2021-01-05 22:44:03
    单片机中断技术概述 在任何一款事件驱动型的CPU里面都应该会有中断系统,因为中断就是为响应某种事件而存在的。...单片机的中断系统有5个中断源、2个中断优先级,可实现两级中断服务程序嵌套。 如果单片机没有中
  • 计算机原理之中断简介

    千次阅读 2020-06-21 18:23:07
    中断的基本概念 ...首先中断源提出中断申请,在该中断允许的情况下,CPU首先响应优先级别高的中断源提出的中断请求,等处理完高优先级中断源的中断服务程序后再响应较低优先级别的中断请求;CPU暂停现
  • 中断概念是50年代中期提出的,在这以前,计算机虽然能自动运行程序,但有两个问题不能很好解决: 不能自动处理异常情况或特殊请求,如电源掉电等。 CPU与外设串行工作,CPU得不到充分利用。CPU是电子设备,基本...
  • 51单片机中断系统

    2021-10-04 12:51:24
    单片机中断系统的概念 什么是中断,我们从一个生活中的例程引入。 你正在家中看书,突然电话铃响了,你放下书本,去接电话,和来电话的人交谈,然后放下电话,回来继续看你的书。这就是生活中的“中断”的现象,...
  • 本文主要介绍什么是中断中断的基本概念、中断的处理过程、中断系统的结构和中断系统控制寄存器

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,727
精华内容 7,090
关键字:

中断源的优先级别