一般结束方式和固定优先级设置,中断服务stm8 寄存器 中断ISR的值是10001000,这说明是中断源 嵌套了中断源 。

6211人阅读
8051 系列 MCU 的基本结构包括:32 个 I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的 64K 字节可寻址数据和代码区。中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务&
处理程序。中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。8051的中断向量表如下:&
中断源 中断向量&
---------------------------&
上电复位 0000H&
外部中断0 0003H&
定时器0 溢出 000BH&
外部中断1 0013H&
定时器1 溢出 001BH&
串行口中断 0023H&
定时器2 溢出 002BH&
interrupt 和 using 都是 C51 的关键字。C51 中断过程通过使用 interrupt 关键字和中断号(0 到 31)来实现。中断号指明编译器中断程序的入口地址中断序号对应着 8051中断使能寄存器IE 中的使能位,对应关系如下:&
IE寄存器 C51中的 8051的&
的使能位 中断号 中断源&
--------------------------------&
IE.0 0 外部中断0&
IE.1 1 定时器0 溢出&
IE.2 2 外部中断1&
IE.3 3 定时器1 溢出&
IE.4 4 串口中断&
IE.5 5 定时器2 溢出&
有了这一声明,编译器不需理会寄存器组参数的使用和对累加器A、状态寄存器、寄存器B、数据指针和默认的寄存器的保护。只要在中断程序中用到,编译器会把它们压栈,在中断程序结束时将他们出栈。C51 支持所有 5 个 8051 标准中断从 0 到 4 和在 8051 系列(增强型)中多达 27 个中断源。&
using 关键字用来指定中断服务程序使用的寄存器组。用法是:using 后跟一个0 到3 的数,对应着 4 组工作寄存器。一旦指定工作寄存器组,默认的工作寄存器组就不会被压栈,这将节省 32 个处理周期,因为入栈和出栈都需要 2 个处理周期。这一做法的缺点是所有调用中断的过程都必须使用指定的同一个寄存器组,否则参数传递会发生错误。因此对于using,在使用中需灵活取舍。&
关于using:&
您在文中说明“这一做法的缺点是所有调用中断的过程都必须使用指定的同一个寄存器组”是不是这个意思?&
举个例子来说:&
定义一个函数&
void func(unsigned char i) {&
if(++i==0x12) {&
有如下一个中断函数&
void int_0(void) interrupt 0 using 1 {&
在默认状态下,func使用寄存器组0(BANK0),那么当int_0调用func时是否存在当传递参数时会造成参数传递错误?&
如果在中断服务函数 ISR 中使用寄存器,那么必须处理好 using 的使用问题:&
1、中断服务函数使用 using 指定与主函数不同的寄存器组(主函数一般使用 Register bank 0)。&
2、中断优先级相同的ISR 可用 using 指定相同的寄存器组,但优先级不同的 ISR 必须使用不同的寄存器组,在 ISR 中被调用的函数也要使用 using 指定与中断函数相同的寄存器组。&
3、如果不用 using 指定,在 ISR 的入口,C51 默认选择寄存器组0,这相当于中断服务程序的入口首先执行指令:
MOV PSW #0&
这点保证了,没使用 using 指定的高优先级中断。可以中断使用不同的寄存器组的低优先级中断。&
4、使用 using 关键字给中断指定寄存器组,这样直接切换寄存器组而不必进行大量的 PUSH 和 POP 操作,可以节省RAM空间,加速 MCU 执行时间。寄存器组的切换,总的来说比较容易出错,要对内存的使用情况有比较清晰的认识,其正确性要由你自己来保证。特别在程序中有直接地址访问的时候,一定要小心谨慎!至于“什么时候要用到寄存器组切换”,一种情况是:当你试图让两个(或以上)作业同时运行,而且它们的现场需要一些隔离的时候,就会用上了。在
ISR 或使用实时操作系统RTOS 中,寄存器非常有用。&
寄存器组使用的原则:&
1、8051 的最低32 个字节分成 4 组 8 寄存器。分别为寄存器R0 到R7。寄存器组由PSW 的低两位选择。在 ISR 中,MCU 可以切换到一个不同的寄存器组。对寄存器组的访问不可位寻址,C51 编译器规定使用 using 或 禁止中断的函数(#pragma disable)均不能返回 bit 类型的值。&
2、主程序(main函数)使用一组,如 bank 0;低中断优先级的所有中断均使用第二组,如 bank 1;高中断优先级的所有中断均使用再另外一组,如 bank 2。显然,同级别的中断使用同一组寄存器不会有问题,因为不会发生中断嵌套;而高优先级的中断则要使用与低优先级中断不同的一组,因为有可能出现在低优先级中断中发生高优先级中断的情况。编译器会自动判断何时可使用绝对寄存器存取。&
3、在 ISR 中调用其它函数,必须和中断使用相同的寄存器组。当没用 NOAREGS 命令做明确的声明,编译器将使用绝对寄存器寻址方式访问函数选定(即用 using 或 REGISTERBANK 指定)的寄存器组,当函数假定的和实际所选的寄存器组不同时,将产生不可预知的结果,从而可能出现参数传递错误,返回值可能会在错误的寄存器组中。&
举一例子:当需要在中断内和中断外调用同一个函数,假定按照程序的流程控制,不会出现函数的递归调用现象,这样的调用会不会出现问题?若确定不会发生重入情况,则有以下两种情况:&
1、如果 ISR 和主程序使用同一寄存器组(主程序缺省使用BANK 0,若 ISR 没有使用 using 为其指定寄存器区,则缺省也使用 BANK 0),则不需其他设置。&
2、如果 ISR 和主程序使用不同的寄存器组(主程序缺省使用BANK 0,ISR 使用 using 指定了其他 BANK),则被调用函数必须放在:&
#pragma NOAREGS&
#pragma AREGS&
控制参数对中,指定编译器不要对该函数使用绝对寄存器寻址方式;或者也可在 Options-&C51,选中“Don't use absolute register accesses”,使所有代码均不使用绝对寄存器寻址方式(这样,执行效率将稍有降低)。不论以上的哪一种情况,编译器均会给出重入警告,需手工更改 OVERLAY 参数,做重入说明。&
3、还有一种办法:如果被调用函数的代码不是很长,还是将该函数复制一份,用不同的函数名代替,这种情况适合ROM有足够多余的空间。&
因此,对using关键字的使用,如果没把握,宁可不用,交给编译系统自己去处理好了。
interrupt xx using y&
跟在interrupt 后面的xx 值得是中断号,就是说这个函数对应第几个中断端口,一般在51中&
0 外部中断0&
1 定时器0&
2 外部中断1&
3 定时器1&
4 串行中断&
&&& 其它的根举相应得单片机有自己的含义,实际上c载编译的时候就是把你这个函数的入口地址方到这个对应中断的跳转地址&
&&&&&& using y 这个y是说这个中断函数使用的那个寄存器组就是51里面一般有4个 r0 -- r7寄存器,如果你的终端函数和别的程序用的不是同一个寄存器组则进入中断的时候就不会将寄存器组压入堆栈返回时也不会弹出来节省代码和时间
一般只有using 0,1,2,3
单片机中断响应可以分为以下几个步骤:1、停止主程序运行。当前指令执行完后立即终止现行程序的运行。2、保护断点。把程序计数器PC 的当前值压入堆栈,保存终止的地址(即断点地址),以便从中断服务程序返回时能继续执行该程序,3、寻找中断入口。根据5 个不同的中断源所产生的中断,查找5 个不同的入口地址。4、执行中断处理程序。这就不讲了;5、中断返回。执行完中断处理程序后,就从中断处返回到主程序,继续往下执行。
以上工作是由计算机自动完成的,与编程者无关,在这5 个入口地址处存放有中断处理的程序(这是程序编写时放在那儿的,如果没把中断处理程序放在那儿可就错了,因为中断程序无法被执行到)。有点复杂是吗?没关系,继续往下看。
五个中断源的自然优先级由高到低的排列顺序为外中断0→定时器0→外中断1→定时器1→串口中断。如果我们不对其进行设置,单片机就按照此顺序不断的循环检查各个中断标志(就像我们生活中按照习惯处理事物一样),但有时我们需要人工设置高、低优先级,也就是说由编程者来设定哪些中断是高优先级、哪些中断是低优先级(当然由于只有两级,所以必然只有一些中断处于优先级别,而其他的中断则处于同一级别,处于同一级别的中断顺序就由自然优先级来确定,这一点请大家务必搞清楚了)。
既然可以设定人工优先级,那么它又是如何来设置的呢?其实很简单,我们只要把IP 寄存器的对应位置“1”就可以了,看下面的表:
× × × PS PT1 PX1 PT0 PX0
串口 T1 INT1 T0 INT0
开机时,每个中断都处于低优先级,我们可以用指令来对优先级进行设置。例如:现在有如下要求,将T0、INT1 设为高优先级,其它为低优先级,求IP 的值。
IP 的首3 位没用,可任意取值,设为000,后面根据要求写:,即IP=06H,看下面的表。
× × × PS PT1 PX1 PT0 PX0
0 0 0 0 0 1 1 0
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:237998次
积分:2392
积分:2392
排名:第16265名
原创:45篇
转载:55篇
评论:22条
(1)(1)(1)(1)(2)(8)(5)(2)(3)(2)(2)(1)(5)(2)(1)(2)(1)(1)(12)(4)(2)(2)(10)(3)(3)(1)(5)(3)(3)(3)(1)(1)(5)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
输入输出及中断.ppt 71页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:100 &&
输入输出及中断
你可能关注的文档:
··········
··········
* * * * * * * * * * * * * *
程序查询方式
CPU利用查询命令(OCW3中D2=1)获得当前请求服务的优先级。此时8259A内部仍进行8级中断请求的判优和屏蔽管理。查询命令发出后,执行一条输入指令,可得到查询字。 D7=1
有中断请求 D7=0
无中断请求 当前发出中断请求级别最高的中断信号 * 5. 中断结束命令?
根据不同的工作方式8259A可以有几种不同的结 束方法。 (1)自动中断结束方式(AEOI) 特点:中断服务寄存器ISR的相应位清零是由硬件自动完成的。当某一级中断被CPU响应后,CPU送回第一个INTA中断响应信号,使ISR的相应位置1,当第二个INTA负脉冲结束时,自动将ISR的相应位置0。 实现方法:通过将ICW4的D1位设置为1实现。 使用环境:适用不要求中断嵌套的情况。 * (2)非自动中断结束方式(EOI) 特点:中断返回前,必须用指令向8259A发中断结束命令,即使ICW4的D1=0。若级连,发2个。 方法:首先将ICW4的D1=0,定为正常中断结束方式,然后用OUT向8259A的偶地址端口输出OCW2操作控制字(OCW2的D7D6D5=001),实现自动结束命令。 使用环境:一般的中断结束方式只能应用于全嵌套方式下,不能用于优先级自动循环方式和优先级特殊循环方式。因为一般中断结束方式结束的中断是尚未处理完的级别最高的中断。若中断级别改变,会使整个中断过程混乱。 *
(3)特殊中断结束方式 特点:通过用指令发一中断结束命令,同时给出结束中断的中断源是哪一级,使该中断源的中断服务寄存器ISR的相应位置0。 使用环境:可应用在任何情况下,但要在中断处理中给出中断结束命令。 使用方法:首先将ICW4的D1=0,定为正常中断结束方式,然后通过将OCW2的D7D6D5=011或111,D2D1D0位指出结束中断处理的中断源号,使该中断源在中断服务寄存器ISR中的相应位清零。
读8259A 的状态
8259A的IRR、ISR、IMR的状态,可通过读命令读入CPU,供用户了解8259A的工作情况。
(1) 在读命令之前,输出一个OCW3,令其RR=1,RIS=0(D1D0=10),可利用读命令读入中断请求寄存器IRR的状态。若RR=1,RIS=1(D1D0=11),可利用读命令读入中断服务寄存器ISR的状态。
(2) 对奇地址端口(A0=1)进行读操作,可读得中断屏蔽寄存器IMR的值。 * 7. 5.5
由多片8259A组成的主从式中断系统
在一个系统中若中断源多于8个,必须采用多片8259A进行级连。其中有一片主8259A,若干片从8259A,可把中断源扩展到64个。
8259A的编程实例
1.初始化编程
例7-1:对IBM PC/XT机中使用的8259A初始化编程。硬件连 接如图。
7 * 设置ICW1为边沿触发,单片8259A需要ICW4。
AL,13H OUT
20H,AL 设置ICW2
类型码为 (IR0) MOV
AL,08H OUT
21H,AL 设置ICW4,全嵌套方式,缓冲方式,正常EOI 。
AL,0DH OUT
21H,AL 根据系统要求初始化编程如下:
在IBM PC机中,只有一片8259A,可接外部8级中断,8259A的端口地址为20H和21H。对8259A的初始化规定:边沿触发方式,缓冲方式,中断结束为EOI命令方式,中断优先权管理采用全嵌套方式。8级中断源类型码为08H-0FH。 *
初始化完成后,8259A处于全嵌套工作方式,可以响应外部中断。根据要求设置8259A的操作命令字OCW1~OCW2 (1)如允许时钟,键盘,异步通信卡(COM1)中断,设置OCW1为0ECH(屏蔽字)。
(2)由于正常EOI,因此在中断服务程序结束后,返回断点前必须对OCW2写入H作结束中断操作命令。
;设置OCW2的值为20H?
;中断返回?
* 欢迎辞 * * * * * * * * * * * * * * * * * * * * * * * 例:中断类型码为20H(32)的中断源所对应的中断服务程序首址存放在0000∶0
正在加载中,请稍后...中断优先级安排原则与stm32优先级 - 的博客 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
中断优先级安排原则与stm32优先级
已有 1510 次阅读 21:48
中断是获取异步事件的重要手段,中断源优先级的安排如下:1、紧迫性:触发中断的事件越紧迫,优先级要安排的越高!紧迫事件允许耽搁的时间短,如模拟信号的采集,采样耽误的时间越短,越真实!2、关键性:触发中断的事件越关键,设定优先级应该越高。3、频繁性:触发中断的事件越频繁,设定优先级越高!频繁事件的周期短,需及时处理!4、快捷性:在上述条件相同相近时,ISR处理的越快捷,设定的优先级越高。在发生ISR中断嵌套时,如果非快捷的ISR嵌套在快捷的ISR里面会使得快捷的ISR迟迟得不到运行,使得系统实时性降低。正确的做法是使快捷的ISR嵌套在非快捷的ISR里面,因为快捷的ISR处理时间短不会使得被嵌套的事件迟迟得不到运行!中断服务程序要尽可能的简单,只要将获取的异步事件交给相关联的任务即可,在关联任务中进行相对复杂的处理即可!stm32中断优先级设置、优先级分组的概念(转载):一:综述STM32 目前支持的中断共为 84 个(16 个内核+68 个外部), 16 级可编程中断优先级的设置(仅使用中断优先级设置 8bit 中的高 4 位)和16个抢占优先级(因为抢占优先级最多可以有四位数)。二:优先级判断STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。三:优先级分组既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位在NVIC应用中断与复位控制寄丛器(AIRCR)的中断优先级分组域中,可以有8种分配方式,如下:所有8位用于指定响应优先级最高1位用于指定抢占式优先级,最低7位用于指定响应优先级最高2位用于指定抢占式优先级,最低6位用于指定响应优先级最高3位用于指定抢占式优先级,最低5位用于指定响应优先级最高4位用于指定抢占式优先级,最低4位用于指定响应优先级最高5位用于指定抢占式优先级,最低3位用于指定响应优先级最高6位用于指定抢占式优先级,最低2位用于指定响应优先级最高7位用于指定抢占式优先级,最低1位用于指定响应优先级这就是优先级分组的概念。Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位(AIRCR高四位),这4个寄存器位的分组方式如下:第0组:所有4位用于指定响应优先级第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级第4组:所有4位用于指定抢占式优先级可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:NVIC_PriorityGroup_0 =& 选择第0组NVIC_PriorityGroup_1 =& 选择第1组NVIC_PriorityGroup_2 =& 选择第2组NVIC_PriorityGroup_3 =& 选择第3组NVIC_PriorityGroup_4 =& 选择第4组中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄丛器的高四位分配各个优先级数字所占的位数。在一个程序中只能设定一次四:中断源的优先级接下来就是指定中断源的优先级,中断源优先级是在中断优先级寄存器中设置的,只能设置及高四位,必须根据中断优先级分组中设置好的位数来在该寄存器中设置相应的数值。假如你选择中断优先级分组的第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级,那么抢占式优先级就有000-111共八种数据选择,也就是有八个中断嵌套,而响应优先级中有0和1两种,总共有8*2=16种优先级。中断源优先级具体的设置了该中断源的优先级别在一个程序中可以设定多个(最多16个)优先级,每个中断源只能设定的一个。每写一个关于中断优先级的程序必须包含下列两个函数:&(1)void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)中断分组设置(2)void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)中断优先级设置
作者的其他最新博客
评论 ( 个评论)
Powered by
供应链服务
商务及广告合作
Jeffery Guo
关注我们的微信
供应链服务 PCB/IC/PCBA
版权所有 (C) 深圳华强聚丰电子科技有限公司}

我要回帖

更多关于 中断屏蔽寄存器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信