ABOV单片机内部中断优先级寄存器IP1x/IPx的设置代码实现讲解及示例代码-[MC96F6332D]
一、准备工作
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]相关推荐
- ABOV单片机内部定时器Timer1的定时器代码实现讲解及示例代码-[MC96F6332D]
一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.内部定时器PWM代码生成 1.在CodeGen8 代 ...
- ABOV单片机内部看门狗WDT的代码实现讲解及示例代码-[MC96F6332D]
一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.内部看门狗代码生成 1.在CodeGen8 代码生成 ...
- ABOV单片机内部WT时钟RTC的代码实现讲解及示例代码-[MC96F6332D]
一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.内部WT时钟代码生成 1.在CodeGen8 代码生 ...
- ABOV单片机模数转换ADC部分代码实现讲解及示例代码-[MC96F6332D]
一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.ADC的配置和代码生成 1.在CodeGen8 代码 ...
- ABOV单片机UART串口通讯实现讲解及示例代码-[MC96F6332D]
一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.生成串口通讯代码 1.在CodeGen8 代码生成器 ...
- ABOV单片机端口引脚GPIO讲解及示例代码-[MC96F6332D]
一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.生成GPIO的代码 1.在CodeGen8 代码生成 ...
- ABOV单片机UART串口通讯中Printf函数实现讲解及示例代码-[MC96F6332D]
一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.生成串口代码 1.在CodeGen8 代码生成器的外 ...
- ABOV单片机外部引脚中断EINT实现讲解及示例代码-[MC96F6332D]
一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.生成外部引脚中断的代码 1.在CodeGen8 代码 ...
- ABOV单片机时钟切换讲解及示例代码-[MC96F6332D]
一.准备工作 1.KEIL C51编译环境 2.CodeGen8 代码生成器 3.MC96F6332D 开发板 4.USB-OCD II仿真器 二.生成系统时钟代码 1.在CodeGen8 代码生成器 ...
最新文章
- 参加LinuxCon Japan 2012
- Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析
- HihoCoder - 1591 锦标赛(最大费用最大流)
- 2种IO并发开发中的设计模式:Reactor and Proactor
- python 读中文乱码_python字符乱码的解决小结
- linux df和du常用命令
- java2的7次方怎么表示_一元二次方程常见题型之方程根的解法
- python读音有道-python利用有道翻译实现quot;语言翻译器”的功能
- AcWing 859. Kruskal算法求最小生成树(稀疏图)
- 2012年波兰乌克兰欧洲杯完全赛程(06.09-07.02)
- 手游最佳搭档:高续航音质卓越,高颜值精品蓝牙耳机推荐
- 大数据可以应用在哪些行业?
- 抖音电商广告后台分为哪些?它们其中又有什么区别?
- 微信群总是有人发广告?我用Python写个机器人消灭他!
- 人体的能量场是什么?
- linux 关于回程路由相关问题
- 计算机考试后的感想,计算机考试的感想
- Unity Shader入门精要第七章 基础纹理之遮罩纹理
- 【轴承故障分解】基于 ITD实现轴承故障信号分解含Matlab源码
- 用户数据报协议(UDP)
热门文章
- 英语中的名词复数结构
- Quartus如何设置虚拟管脚Virtual Pin(具体设置方法)
- php剪裁图片,PHP裁剪图片
- 目标跟踪 ATOM(ATOM: Accurate Tracking by Overlap Maximization)
- 计算机一级常用计算公式,(完整版)计算机一级word操作知识点
- Window atob()与btoa()方法
- php代码实现 人狼羊菜,让草根读懂“菜根”哲学:抛开“羊”与“狼”,做率真自在的人...
- OpenGl glScissor
- 方了,目前只有21%的德国人在家工作
- 基于vue和node.js的志愿者招募网站设计