一、准备工作

1、KEIL C51编译环境

2、外部中断EINT示例代码-MC96F6332D

3、MC96F6332D 开发板

4、USB-OCD II仿真器

二、代码部分

1、现代单片机MC96F6332D提供了内部中断优先级设置的寄存器IP1和IP;如下图所示:

注意:默认的优先级为上图蓝色框图中所示,优先级呈“之”字形逐渐下降,其中Interrupt0/6//12/18为一组,Interrupt1/7/13/19为一组,以此类推,共计6组;其中最多可以设置4组的优先级,剩余的2组按照上图默认方式再进行排序。

2、在中断的方框图中也可以看出,有4级优先级可以进行配置:

3、根据MC96F6332D外部中断EINT的示例代码,此示例在外部中断的工程上进行修改。工程代码中采用了外部中断0和8两个外部中断,具体如下所示:

外部中断 引脚号 端口号

中断向量号

  Interrupt

EINT0 29 P02 5
EINT8 4 P52 6

4、在中断优先级默认的情况下,外部中断EINT8(Interrupt6)优先级高于外部中断EINT0(Interrupt5);所以EINT0(Interrupt5)的中断函数会被EINT8(Interrupt6)中断;故增加延时函数并修改中断服务函数,增加低优先级EINT0(Interrupt5)中断函数的执行时间;代码如下所示:

//延时函数
void delay_time(unsigned int  tt)
{unsigned int times;while(tt--){times = 1000;while(times--);}
}//中断函数修改如下
//======================================================
// interrupt routines
//======================================================void INT_Ext8() interrupt 6
{// External interrupt 8 sei();EXIT8_STA = 1;      //外部中断8标志使能printf("EXIT 8 Interrupt into.\r\n");delay_time(3267);a_break++;if(a_break >= 200)a_break = 0;printf("EXIT 8 Interrupt out.\r\n");}void INT_Ext0_7() interrupt 5
{// External interrupt 0 ~ 7//判断外部引脚0是否被按下sei();printf("EXIT 0 Interrupt into .\r\n");if(EIFLAG0 & 0x01){EIFLAG0 &= 0xFE;EXIT0_STA = 1;     //外部中断0标志使能}//  delay_time(3267);
//  a_break++;
//  if(a_break >= 200)
//      a_break = 0;printf("EXIT 0 Interrupt out.\r\n");}

5、工程代码编译时会提示有2个警告,是因为中断函数中调用了printf函数,此处忽略警告。把代码下载到MC96F6332D并进行仿真,红色方框中分别为两个中断函数的执行时间;

从仿真结果上可以看到EINT0(Interrupt5)的中断函数并没有被EINT8(Interrupt6)中断,这个是为什么???

6、尝试修改中断优先级寄存器的值,将Interrupt 6所在的这一组强制定义为最高优先级(按照“之”字形的优先级顺序,其实还是保持默认的高优先级);在Main函数最前端增加如下代码:

//重新定义优先级
IP1 = 0x01;
IP = 0x01;

7、将代码进行编译并下载;再进行程序的仿真,其代码仿真结果如下所示:

外部的EINT8(Interrupt6)成功将EINT0(Interrupt5)进行中断;程序运行结果符合预期设置;所以中断嵌套必须先进行优先级分组。

注意:在需要被中断的中断函数中必须增加sei();函数,否则程序的嵌套将得不到正确运行,在多级中断章节中有说明:(我也是踩坑爬过来的)

8、试想一下:高优先级可以打断低优先级的中断,那么高优先级的中断执行时,如果低优先级中断到来,这个时候低优先级的中断是否会被MCU丢弃?

答案:高优先级中断执行过程中,低优先级中断肯定不会中断高优先级的中断函数,但是低优先级的中断会在高优先级中断执行完毕后被响应;

如果低优先级中断在高优先级中断执行的过程到来了多次,最后也是仅仅保留一次的响应机会。大家可以自行验证,在原来程序上简单修改即可,下面直接上结果供大家参考:

三、实验总结:

1、中断函数在保持默认优先级的情况下不会进入中断嵌套,中断函数是根据中断顺序一个接一个的执行;如果高优先级的中断在执行过程中,低优先级的中断到来,高优先级中断函数执行完毕后,低优先级的中断将会被执行;

2、在中断嵌套的使用中:被中断的函数中需要增加sei();函数,否则不能进入中断的嵌套;

3、使用中断的嵌套必须先进行中断组优先级的配置(在中断组中,中断优先级的响应顺序不能被改变;例如中断组Interrupt0/6//12/18中0-->6-->12-->18的优先级顺序不能被改变);

4、具体的代码可以访问链接:https://share.weiyun.com/5E7eyoX;进行免费下载。


因为小编自己能力水平有限,文中难免有错误或表达失误的信息,还望广大阅读者留言批评指正,谢谢。

ABOV单片机内部中断优先级寄存器IP1x/IPx的设置代码实现讲解及示例代码-[MC96F6332D]相关推荐

  1. ABOV单片机内部定时器Timer1的定时器代码实现讲解及示例代码-[MC96F6332D]

    一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.内部定时器PWM代码生成 1.在CodeGen8 代 ...

  2. ABOV单片机内部看门狗WDT的代码实现讲解及示例代码-[MC96F6332D]

    一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.内部看门狗代码生成 1.在CodeGen8 代码生成 ...

  3. ABOV单片机内部WT时钟RTC的代码实现讲解及示例代码-[MC96F6332D]

    一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.内部WT时钟代码生成 1.在CodeGen8 代码生 ...

  4. ABOV单片机模数转换ADC部分代码实现讲解及示例代码-[MC96F6332D]

    一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.ADC的配置和代码生成 1.在CodeGen8 代码 ...

  5. ABOV单片机UART串口通讯实现讲解及示例代码-[MC96F6332D]

    一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.生成串口通讯代码 1.在CodeGen8 代码生成器 ...

  6. ABOV单片机端口引脚GPIO讲解及示例代码-[MC96F6332D]

    一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.生成GPIO的代码 1.在CodeGen8 代码生成 ...

  7. ABOV单片机UART串口通讯中Printf函数实现讲解及示例代码-[MC96F6332D]

    一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.生成串口代码 1.在CodeGen8 代码生成器的外 ...

  8. ABOV单片机外部引脚中断EINT实现讲解及示例代码-[MC96F6332D]

    一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.生成外部引脚中断的代码 1.在CodeGen8 代码 ...

  9. ABOV单片机时钟切换讲解及示例代码-[MC96F6332D]

    一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.生成系统时钟代码 1.在CodeGen8 代码生成器 ...

最新文章

  1. 参加LinuxCon Japan 2012
  2. Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析
  3. HihoCoder - 1591 锦标赛(最大费用最大流)
  4. 2种IO并发开发中的设计模式:Reactor and Proactor
  5. python 读中文乱码_python字符乱码的解决小结
  6. linux df和du常用命令
  7. java2的7次方怎么表示_一元二次方程常见题型之方程根的解法
  8. python读音有道-python利用有道翻译实现quot;语言翻译器”的功能
  9. AcWing 859. Kruskal算法求最小生成树(稀疏图)
  10. 2012年波兰乌克兰欧洲杯完全赛程(06.09-07.02)
  11. 手游最佳搭档:高续航音质卓越,高颜值精品蓝牙耳机推荐
  12. 大数据可以应用在哪些行业?
  13. 抖音电商广告后台分为哪些?它们其中又有什么区别?
  14. 微信群总是有人发广告?我用Python写个机器人消灭他!
  15. 人体的能量场是什么?
  16. linux 关于回程路由相关问题
  17. 计算机考试后的感想,计算机考试的感想
  18. Unity Shader入门精要第七章 基础纹理之遮罩纹理
  19. 【轴承故障分解】基于 ITD实现轴承故障信号分解含Matlab源码
  20. 用户数据报协议(UDP)

热门文章

  1. 英语中的名词复数结构
  2. Quartus如何设置虚拟管脚Virtual Pin(具体设置方法)
  3. php剪裁图片,PHP裁剪图片
  4. 目标跟踪 ATOM(ATOM: Accurate Tracking by Overlap Maximization)
  5. 计算机一级常用计算公式,(完整版)计算机一级word操作知识点
  6. Window atob()与btoa()方法
  7. php代码实现 人狼羊菜,让草根读懂“菜根”哲学:抛开“羊”与“狼”,做率真自在的人...
  8. OpenGl glScissor
  9. 方了,目前只有21%的德国人在家工作
  10. 基于vue和node.js的志愿者招募网站设计