嵌入式系统(三)嵌入式中断
Published in:2023-12-04 | category: 嵌入式系统

1中断的概念和作用

1.1 概念

指CPU在执行当前程序的时候,由于系统中出现某种急需要处理的情况,CPU暂停正在执行的程序,转而执行别的一段特殊处理程序来处理出现的紧急事物,处理结束后,CPU自动返回原先暂停的程序中断继续

1.2 作用

1 提高工作效率

2 具备应对突发状况的能力

1.3 中断 其他概念

主程序 在发生中断前,CPU正常执行的处理程序。

中断源 引起中断的原因,或发生中断申请的来源

中断请求 中断源要求CPU提供服务的请求

断点 CPU响应中断后,主程序被打断的位置

中断处理函数 CPU响应中断后所执行的相应处理程序

中断向量 中断处理函数的入口地址,当CPU响应中断请求时,会跳转到该地址去 执行代码

CC2530的中断源如下

image-20240104172227718

中断是有优先级的,按照不同优先级可以看到如下的系统

2. CC2530的中断系统

CC2530将18个中断源划分成6个中断优先级组IPG0~IPG5, 每组包括3个中断源

image-20230927101249199

用户可以指定这6个中断优先组的优先级 (称作用户指定优先级)可以设置0~3级

其中0级属于最低优先级,3级为最高优先级。

为了保证中断系统的正常工作 还存在(自然优先级)的一些规则

1 如果多个组被设置成相同级别,则组号小的要比组 号大的优先级高。

2 同一组中包括的3个中断源,最左侧的优先级最高, 最右侧的优先级最低。

如何设置中断优先级?

通过IP1和IP0两个寄存器

由于每个组可能的情况一共是0,1,2三种情况,所以每个组需要2位来代表不同的优先级,那么至少需要两个寄存器,IP1是高位,IP0是低位,每个寄存器最高的2位空置不使用

从右到左,依次为0.1.2.3.4.5组

具体来说,比如我要设置0组优先级为3

IP0的[0]设置为0

IP1的[0]设置为1

再举例

要设置中断源的优先级为P0INT>P1INT>P2INT

查表可知

P0INT对应的组为 IPG5

P1INT对应的组为 IPG4

P2INT对应的组为 IPG1

则可使用以下代码实现。

1
2
IP1 = 0x30;   //IPG5级别为3,IPG4级别为2,IPG1级别为1,其他组级别为0
IP0 = 0x22;

3 中断编程

3.1 中断配置

3.1.1 使能端口组的中断功能

相当于是上面有18种终端,对应不同的端口

我们首先要打开端口组中断的开关,比如P0,P1,P2

寄存器IEN1和IEN2

需要通过IEN1和IEN2特殊功能寄存器。

image-20231001163605503

3.1.2 使能当前端口组有哪些端口引脚中断

实际上一个端口组对应多个引脚,所以我们需要指定

需要设置当前端口组中哪几个引脚具有外部中断功能,将不需要使用外部中断的引脚屏蔽掉。使用Px_IEN寄存器。

寄存器Px_IEN

image-20231001163623956

3.1.3 设置中断触发方式

用PICTL寄存器

触发方式有

1)电平触发

①高电平触发:输入信号为高电平时会引起中断请求

②低电平触发:输入信号为低电平时会引起中断请求

电平触发引起的中断,在中断处理完成后,如果输入电平 仍旧保持有效状态,则会再次引发中断请求,适用于连续 信号检测,如外接设备故障信号检测。

2)边沿触发

①上升沿触发:输入信号出现由低电平到高电平的跳变时 会引起中断请求。

②下降沿触发:输入信号出现由高电平到低电平的跳变时 会引起中断请求。

image-20231001163657255

4 设置外部中断优先级

用刚刚讲到的IP1和IP0两个寄存器

5 使能系统总中断

使用EA寄存器

除了各个中断源有自己的中断开关之外,中断系统还有一 个总开关。如果说各个中断源的开关相当于楼层各个房间 的电闸,则中断总开关相当于楼宇的总电闸。中断总开关 控制位是EA位,在IEN0寄存器中

IEN0寄存器可以进行位寻址,因此要使能总中断,可以直

接采用如下方法实现。

1
EA =1; //使能总中断

3.2 中断处理函数编写

刚刚进行了中断使能和初始化,接下来我们重点介绍中断后的检测

中断处理函数就是在中断后进行的操作

比如我想要按键之后亮灯

那么就可以在中断处理函数种进行亮灯的代码编写

3.2.1 基本编写格式

中断服务处理的编写格式具体如下

中断向量可以查上面的表

1
2
3
4
5
6
7
8
9
#pragma vector=<中断向量> //编译指示

__interrupt void <函数名称> (void)

{

/*编写中断处理程序*/

}

“__interrupt ”表示函数是一个中断处理函数,函数体

不能带参数或有返回值。注意: “interrupt”前面的“_”

是两个短下画线构成的。

3.2.2 识别触发外部中断的端口Port

寄存器用P0IF、P1IF和P2IF

先识别

P0、P1和P2口分别使用P0IF、P1IF和P2IF作为中断标志位,任何一个端口组的I/O口产生外部中断时,会将对应端口组的外部中断标志位自动置位。例如,本任务中当SW1按下后,P1IF会变成1,此时CPU将进入P1口中断处理函数中处理事件。

1
if(P1IF==1

注意使用后要清除中断标志

外部中断标志位不能自动复位,因此必须在中断处理

函数中手工清除该中断标志位,否则CPU将反复进入中断过

程。清除P1口外部中断标志位的方法如下。

1
P1IF=0;  // 清除P1口中断标志位

3.2.3 识别触发外部中断的引脚(Pin)

寄存器 P0IFG、P1IFG和P2IFG

先识别

•CC2530中有3个端口状态标志寄存器P0IFG、P1IFG和P2IFG,分别对应P0、P1和P2各引脚的中断触发状态。

•当被配置成外部中断的某个I/O口触发中断请求时,对应标志位会被自动置位,在进行中断处理时可通过判断相应寄存器的值来确定是哪个引脚引起的中断

image-20231001172709621

使用后清除引脚中断标志

1
2
3
4
5
6
7
8
9
10
11
12
if (P1IFG & 0x04) //如果P1_2引脚中断标志位置位
{
if(flag_Pause ==0)
{
flag_Pause =1;
}
else
{
flag_Pause =0;
}
P1IFG &=~0x04; //清除P1_2引脚(PIN)中断标志位
}
Prev:
数据库系统(四)中级和进阶SQL
Next:
数据库系统(三)SQL语句全解析