1. 中断的理解
1.1轮询和中断
内核与外设之间的主要交互方式有两种:轮询和中断。
轮询:指的是你知道紧急事件未来会来到某一个地方需要你处理,但是你不知道它什么时候来,因此你会每隔十分钟或者你设定的其他时间,去发生紧急事件的位置查看,看紧急事件是否会来到。
中断:指的是你知道或不知道紧急事件未来会来到某一个地方需要你处理,但是这种情况下,紧急事件来到时会给你一个中断信号,当你收到中断信号时,你就可以放下手头的事情,到那个地方先处理完紧急事件,再回来继续做你手头的事情。如下图所示
因此,轮询更加效率低下。
1.2 中断术语的理解
以下例子是广东职业技术学院 欧浩源老师在一篇博文中给的例子,我觉得说的很好,所以引用在这里。【蓝桥杯单片机07】彻底理解51单片机的中断系统 - - 21ic电子技术开发论坛
你正在追电视剧《神雕侠侣》,正看得入迷的时候,电话响了,你暂停电视剧,去接电话,在接电话的过程中,门铃又响了,你暂时放下电话,去把门打开。如果追电视剧是在执行主程序,那么电话就是中断源,电话铃响了就是中断请求,暂停电视就是现场保护,接电话就是中断响应,门铃响了是更高一级的中断请求,去把门打开,那就是中断嵌套。开完门回来接着聊电话,那是中断返回,接完电话把电视剧暂停打开就是现场恢复。
2 蓝桥杯中断程序的使用
2.1 中断程序代码编写的结构
中断程序代码由两部分组成:中断初始化函数+中断服务函数
void 函数名()
{
中断初始化函数主要写一些中断程序的初始化变量。
}
void 函数名() interrupt 中断号
{
中断服务函数就是写中断执行什么,即紧急事件是什么。(但是为了中断的实时性,有时只写只写中断状态的标志,紧急事件用另一个函数来写,后续实践篇代码有讲)
}
注意:(1)中断初始函数名是自定义的,但往往这样写比较清楚易懂: Init_+中断源 (比如:Init_Time0就表示是定时器0的中断初始函数。)
(2)中断号 即后续说到的中断查询次序(每个中断源(中断请求源)都有对应的一个查询次序)。
2.2 各中断组成部分
以下各部分组成查看了蓝桥杯单片机的用户指南。以下为整个中断的结构图,只截取了部分。
2.2.1 中断源(中断请求源)
中断源即结构图中的”开始部分”,(未列全)如图:
在蓝桥杯单片机中,IAP15F2K60S2总共有14个中断源(这里IAP和STC我也不知道为什么分开叫,但是查资料或者写代码的时候都是STC单片机)
这里比较常用的就是前几个。
有必要说明一下外部中断0(INT0)和外部中断1(INT1)就是对应S5和S4两个独立按键。
除此之外,每个中断源的触发类型也是可以选择的,即你想要在程序运作到上升沿还是下降沿或其他的时候开始进行外部中断:
即结构图以下部分:注意有些中断源是可以选择的,有些则不行。
2.2.2 中断请求标志位:
即结构图中的如下等位置:
中断请求标志位即判断中断源是否发出了中断请求。
2.2.3 中断允许控制位
即如下结构图所示部分,当中断请求来了的时候,你要么接受要么拒绝,接受后就会形成中断响应,即如果拒绝的话,是没有中断响应的,而这个接受与否就由中断允许控制位来控制。
中断允许控制位总共分两部分,一个是总开关EA,另一部分就是各个中断源的控制开关。
只有当总开关EA和对应中断源的控制开关同时闭合,中断程序才能运行。闭合时为1.
2.2.4 中断优先级等...
中断的优先级是可以控制的,由寄存器来控制,当有多个中断请求时,优先级越高的越先响应并执行。这里了解的不多就不详细介绍了。
可查看指南了解:以下截取部分
还有同优先级时各中断源的查询次序等都在指南中表格可以看到:
值得注意的是,代码编写结构中的中断号就是表格里的查询次序。
比如,INT0的中断号就是0,写函数时应该是:void 函数名() interrupt 0
2.3 中断程序的使用
1. 以INT0中断源为例,要存在以下通路才能实施中断程序
(1)选择触发类型。(有的中断源只有一种类型不需要选择)
(2)控制开关和总开关闭合
而这些条件就是在中断初始化函数中体现。
2. 其次还要查看对应的中断号。
比如,以INT0下降沿触发为例:
void Init_INT0()
{
ITO = 1;
EX0 = 1;
EA = 1;
}
void Dispaly() interrupt 0
{
......
}
欢迎指正。