外部中断
本节介绍
📝本节您将了解 中断的概念,以及了解 F28P550 的中断系统,通过图形化代码生成工具配置引脚的中断功能实现中断的方式处理程序。
🏆本章⽬标
1️⃣了解中断概念。
2️⃣了解主控 F28P550 的 中断系统。
3️⃣了解如何通过图形化代码生成工具 sysconfig 配置引脚的中断。
4️⃣应用以上知识配置KEY按键的引脚开启外部中断,并通过中断服务函数实现 LED 状态翻转,亮变灭,灭变亮。
什么是中断
在微处理器或微控制器的世界中,中断是一种特殊的事件,它会打断和暂时挂起当前正在执行的程序,以便处理一个特定的状况或者事件。例如按下按钮、到达定时器时间或收到序列口数据。中断是一个非常重要的计算机系统概念,它通过异步的方式对这些特定情况做出响应。这里举一个例子,比如我们正在敲代码,突然有一个电话打过来,这时我 们停止敲代码转而去接电话,然后在电话聊完事情之后继续敲代码。这里面的电话就相当于一个中断,打断我们当前做的事情,接电话聊事情就相当于中断需要去执行的事情,也就是中断服务程序。
中断可以分为硬件中断和软件中断两种类型。
硬件中断通常由外部设备的物理事件引发,如按下按钮、达到定时器的时间、或数据到达串行端口。当这些事件发生时,微处理器会立即暂停其当前的任务,并跳转到一个预先定义的中断服务程序(ISR)来响应该事件。
软件中断则是由软件指令引发,通常用于更复杂的处理任务。像操作系统的系统调用就使用了软件中断。
外部中断
在 GPIO使用 章节,我们在做按键实验时,虽然能实现读取 GPIO口输入功能,但代码是一直在检测IO输入口的变化,如果我们后续加入了大量的代码,就需要花费很长的时间才能轮询到按键检测部分,因此效率不高。特别是在一些特定的场合,比如某个按键,可能 1 天才按下一次去执行相关功能,这样我们就浪费大量时间来实时检测按键的情况。为了解决这样的问题,我们引入外部中断概念,顾名思义,就是当按键被按下(产生中断)时,才去执行相关功能。这大大节省了 CPU 的资源,因此中断在实际项目中应用非常普遍。
外部中断是硬件中断的一种,它由微控制器外部的事件引发。微控制器的某些引脚被设计为对特定事件的发生做出响应,例如按钮的按压、传感器的信号改变等。这些指定的引脚通常被称为“外部中断引脚”。
在发生外部中断事件时,当前的程序执行会被立即停止,并跳转到对应的中断服务程序(ISR)进行处理。处理完毕后,程序会返回到被中断的地方继续执行。
对于嵌入式系统、实时系统来说,外部中断的使用是非常重要的,能帮助系统对外部事件进行即时响应,大大提高了系统的效率和实时性。提供了许多引脚作为可用的外部中断引脚,可以通过配置这些引脚来进行外部中断实验。
外部中断的作用和优势
外部中断功能在开发中具有以下作用和优势:
- 实时响应外部事件:外部中断功能可以让你在检测到外部事件触发时立即作出响应。这些外部事件可以是来自传感器、按钮、开关、接收到的信号等等。通过外部中断,就可以实时地捕捉到这些事件并执行相应的操作,而无需频繁地轮询或等待。
- 节省计算资源:外部中断允许你将处理外部事件的任务转移给芯片的硬件,从而节省了处理器的计算资源。相比于软件轮询方式,外部中断可以降低对处理器的负担,使其可以更有效地利用其他资源进行更复杂的任务。
- 精确的事件捕捉:外部中断功能能够以非常精确的方式捕捉外部事件的触发。你可以通过配置中断触发方式(如上升沿、下降沿、任意电平等)来适应不同的外部事件,并在事件发生时立即中断当前程序的执行,转而执行中断服务函数。
- 高优先级处理:外部中断可以设置为高优先级处理,优先于当前正在执行的程序。这对于需要立即响应的重要事件非常有用,如紧急通知、传感器检测等。当外部事件触发时,处理器将立即转移到中断服务函数执行,确保及时、准确地处理相关操作,避免对处理程序的延迟。
- 多路中断处理:支持多路外部中断,你可以将多个外部事件与不同的中断引脚相连,从而实现对多个事件的并行处理。这使得你可以处理多个传感器、开关等外部事件,提高系统的灵活性和扩展性。
总之,外部中断功能提供了实时响应、节省计算资源、精确事件捕捉、高优先级处理和多路中断处理等优势。它为我们提供了更加灵活、高效的方式来处理外部事件,并帮助构建更强大、可靠的应用。
F28P550的中断系统
C28x CPU 有 14个 外围中断线。其中两个中断(INT13和INT14)分别直接连接到CPU定时器1和2。其余的12个中断通过增强型外设中断扩展模块(ePIE,或简称PIE)连接到外设中断信号。PIE将多达16个外设中断复用到每个CPU中断线,并扩展向量表以允许每个中断具有ISR(中断服务程序)。这使得CPU能够支持大量外设。
中断路径分为3个阶段:外设(peripheral)、PIE 和 CPU。每个阶段都有启用寄存器和标志位寄存器。系统允许CPU处理一个中断,让其他中断等待,在软件中就可以实现优先级嵌套中断,并在某些关键任务期间禁用中断。下图给出了F28P550的中断架构。
![]() |
---|
在上图中,可以发现,TMS320F28P550 GPIO中断,只有5个通道 XINT1 ~ XINT5,在引脚中断上支持边沿触发(上升沿、下降沿或双边沿),用于快速响应外部事件(如按键、传感器信号等)。中断触发后,CPU 会暂停当前任务,跳转到中断服务程序(ISR)执行,完成后恢复原程序。
案例实验介绍
本次的教程中,将使用KEY按键触发蓝色LED灯点亮和熄灭,软件上将KEY按键的引脚配置使用CPU外部中断的方式。
工程创建
![]() | ![]() |
---|---|
工程配置
配置工程选项,将我们后面写好的代码烧录到 FLASH 中,并且使用的烧录模式是 cJTAG(1149.7)2-pin 模式。
![]() | ![]() |
---|---|
外部中断的配置
打开工程下的 .syscfg 文件。配置KEY按键的引脚为GPIO输入模式,并开启外部中断,配置为下降沿触发中断。
![]() |
---|
选项说明
序号 | 名称 | 功能 |
---|---|---|
1 | Name | 为当前配置的引脚起一个名字 |
2 | Analog Mode | 引脚的模拟模式,不过GPIO只能用于数字信号的 digital 数字模式 |
3 | GPIO Direction | 引脚的方向,有输入 input 和输出模式 output |
4 | Pin Type | 引脚类型,有8种模式,具体说明GPIO实验章节的说明 |
5 | Qualification Mode | 限定模式,对输入信号进行噪声过滤和同步处理,有四个选项,分别是与系统时钟同步、采样3次确定是否稳定、采样6次确定是否稳定、不使用同步和滤波。 |
6 | Use Interrupts | 是否使用中断,打勾为开启 |
7 | XINT Instance | 中断线的选择,一共有5个选项 |
8 | Interrupt Edge | 配置中断的边沿触发方式,Interrupt on falling edge为下降沿触发中断、Interrupt on rising edge为上升沿触发、Interrupt on both edges为双边沿触发 |
9 | Enable Interrupt | 配置是否使能中断,打勾为开启使能 |
10 | Register Interrupt Handler | 配置是否注册中断服务函数,打勾为开启 |
11 | Interrupt Handler | 配置中断服务函数的名称 |
12 | Enable Interrupt in PIE | 使能PIE,打勾为开启 |
13 | Core Select | 运行核心选择,选择是在CPU运行还是在CLA运行 |
14 | PinMux | 外设引脚的配置,选择对应的引脚 |
![]() | ![]() |
---|---|
双边沿即上升沿时触发一次,下降沿时又触发一次。
配置开启了中断服务函数的配置后,后面在写代码时,需要根据配置的中断服务函数名称编写对应的中断程序。根据上图的配置,到时候在代码中加入外部中断函数即可:
//KEY引脚的外部中断服务函数
__interrupt void INT_GPIO_KEY_XINT_ISR(void)
{
//要在中断实现的功能
//清除中断标志位
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
2
3
4
5
6
7
8
LED的配置
因为案例中用到了蓝色LED灯用来展示状态,所以还需要配置LED灯的引脚为输出模式。
![]() |
---|
相关函数介绍
//*****************************************************************************
//
//! 翻转指定引脚的电平状态。
//!
//! \param pin 为指定GPIO引脚的数字编号。
//!
//! 此函数会切换由 \e pin 参数指定的输出引脚的电平状态(高变低/低变高)。
//! 若引脚配置为输入模式,调用此函数无效。
//!
//! 引脚通过数值编号指定,例如:GPIO34 对应的 \e pin 参数值为 34。
//!
//! \return 无返回值。
//
//*****************************************************************************
static inline void GPIO_togglePin(uint32_t pin);
//*****************************************************************************
//
//! 确认并清除PIE中断组标志
//!
//! \param group 指定需要确认的中断组
//!
//! 该函数用于确认指定的中断组,并清除该组内所有中断标志位。
//!
//! \e group参数必须是以下值的逻辑 或 组合:
//! \b INTERRUPT_ACK_GROUP1, \b INTERRUPT_ACK_GROUP2, \b INTERRUPT_ACK_GROUP3
//! \b INTERRUPT_ACK_GROUP4, \b INTERRUPT_ACK_GROUP5, \b INTERRUPT_ACK_GROUP6
//! \b INTERRUPT_ACK_GROUP7, \b INTERRUPT_ACK_GROUP8, \b INTERRUPT_ACK_GROUP9
//! \b INTERRUPT_ACK_GROUP10, \b INTERRUPT_ACK_GROUP11,
//! \b INTERRUPT_ACK_GROUP12.
//!
//! \return 无返回值
//
//*****************************************************************************
static inline void Interrupt_clearACKGroup(uint16_t group);
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
案例验证
更新主函数代码
更新工程的 empty_driverlib_main.c 文件为以下代码:
#include "driverlib.h"
#include "device.h"
#include "board.h"
#include "c2000ware_libraries.h"
void main(void)
{
Device_init();
Device_initGPIO();
Interrupt_initModule();
Interrupt_initVectorTable();
Board_init();
C2000Ware_libraries_init();
EINT;
ERTM;
while(1)
{
}
}
//按键的中断服务函数
__interrupt void INT_GPIO_KEY_XINT_ISR(void)
{
//蓝色LED灯状态翻转
GPIO_togglePin(GPIO_BLUE);
//清除中断标志位
Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
下载器连接
XDS110下载器 | 开发板 |
---|---|
SWD | SWD/TMS |
CLK | CLK/TCK |
GND | GND |
5V | 5V |
代码烧录
GIF 动图
案例现象
每按一次按键,LED灯的状态就会翻转一次,亮变灭,灭变亮。