F28335-外部实验中断

本文介绍F28335芯片的7个外部中断XINT1-XINT7配置方法,详细讲解了使用外部中断1通过按键控制LED灯的流程。包括配置IO口、设置中断触发方式及中断服务函数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

F28335外部中断有7个,外部中断1-7,其中外部中断1和2只能对GPIO0-31配置;外部中断3、4、5、6、7只能对GPIO32-63配置,配置它们的方法是一样的,所以只要学会一个即可掌握所有的外部中断。

本章所要实现的功能是:使用外部中断 1 功能通过按键 K1 控制 D2 亮灭,K4 按键控制D3亮灭 , D1 指 示 灯 闪 烁 提 示 系 统 运 行 状 态 。

一、外部中断介绍

1.1 外部中断简介

F28335共支持7个外部中断XINT1~XINT7,其中XINT1-XINT2只能对GPIO0-GPIO31进行配置;XINT32-XINT63配置。XINT13还有一个不可屏蔽的外部中断XNMI共用中断源。

每一个中断可以被选择为正边沿或负边沿触发,也可以被使能或者禁止(包括XNMI)。可屏蔽中断单元包括一个16位增计数器,该计数器在检测到有效中断边沿时复位为0,同时用来准确记录中断发生时间。

其结构框图如下图所示:

在这里插入图片描述

1.2 外部中断相关寄存器

1) 外部中断控制寄存器(XINTnCR)

F28335 共支持 7 个外部中断 XINT1-XINT7,XINT13 还有一个不可屏蔽的外部 中断 XNMI 共用中断源。每一个外部中断可以被选择为正边沿或负边沿触发,也 可以被使能或者禁止(包括 XNMI)。可屏蔽中断单元包括一个 16 位增计数器, 该计数器在检测到有效中断边沿时复位为 0,同时用来准确记录中断发生的时间。

外部中断控制寄存器(XINTnCR n=1-7)各位信息如下图所示:

在这里插入图片描述

2) 外部NMI中断控制寄存器(XNMICR)

外部 NMI 中断控制寄存器(XNMICR)各位信息如下图所示:
在这里插入图片描述

3) 外部中断x计数器(XINTxCTR)

外部中断 x 计数器(XINTxCTR)(只读寄存器)各位信息如下图所示:

在这里插入图片描述

二、外部中断配置步骤

1) 失能 CPU 级中断,并初始化 PIE 控制器寄存器和 PIE 中断向量表;

在前面学习中断章节中,我们知道 F28335 的外设中断需通过 PIE 控制器来 管理,因此需要初始化 PIE 相应的寄存器和中断向量表。TI 公司已经提供了对应的函数来完成这些操作。分别是 InitPieCtrl()和 InitPieVectTable()。从函 数名即可明白它的功能,所以在开发 F28335 程序时不需要准确记住函数,知道 其含义然后查找即可。这两个函数分别在 DSP2833x_PieVect.c、 DSP2833x_GlobalVariableDefs.c 文件中。
此步代码如下:
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();

2) 使能 IO 口时钟,配置 IO 口为输入;

由于使用开发板上按键 IO 口作为外部中断输入线,因此需要使能对应的 IO 口时钟及配置 IO 口模式,把对应 IO 口设置为输入模式。

3) 设置IO口与中断线的映射关系;

前面说过,F28335 共支持 7 个外部中断 XINT1-XINT7,其中 XINT1-XINT2 只 能对 GPIO0-GPIO31 配置;XINT3-XINT7 只对 GPIO32-GPIO63 配置。所以需要选 择对应的外部中断线及 IO 口配置,比如我们 K1 它是连接在 GPIO12 上,要使用 外部中断功能可以是外部中断 1 或者外部中断 2,假如使用外部中断 1,其代码如下:

EALLOW;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12; // XINT1 是 GPIO12
EDIS;

4) 指定中断向量表中断服务函数地址;

这个通过对 PIE 中断向量表寄存器的相应位进行设置,中断服务函数名可自 定义,但是要符合 C 语言标识符命名规则,在中断函数名前需加上地址符“&”。 在对 PIE 中断向量表寄存器设置时要先声明 EALLOW,修改完成后还要声明 EDIS。 比如外部中断 1,其设置如下:

EALLOW; // 修改被保护的寄存器,修改前应添加 EALLOW 语句
PieVectTable.XINT1 = &EXTI1_IRQn;
EDIS; // EDIS 的意思是不允许修改被保护的寄存器

5) 使能外设对应的 PIE 中断;
由于外设中断较多,它们是由 PIE 统一管理,所以要根据你所使用的外设中 断选择对应的组和该组内的通道,比如外部中断 1,它是由 PIE 组 1 的第 4 通道 连接,这个在前面中断介绍时讲解过。因此可由 PIE 控制寄存器中相应中断使能 位来控制。其实现代码如下所示:
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能 PIE 组 1 的 INT4

6) 设置外部中断出发方式并使能中断;

我们知道外部中断的触发方式有上升沿触发(正边沿)和下降沿触发(负边 沿),根据自己的需求来选择。当按键按下时,我们是让其输入一个低电平到 IO 口,而默认处于高电平,所以按键按下时会产生一个下降沿,因此选择下降 沿触发。外部中断的触发方式及中断使能是由 XIntruptRegs 寄存器控制,具体 实现代码如下:
XIntruptRegs.XINT1CR.bit.POLARITY = 0; // 下降沿触发中断
XIntruptRegs.XINT1CR.bit.ENABLE= 1; //使能 XINT1

7) 使能CPU级中断及全局中断,这个通过对IER和EINT寄存器相应位设置进行使能或者失能。其代码如下:
IER |= M_INT1; // 使能 CPU 中断 1
(INT1) EINT; // 开全局中断
ERTM;// 当使用仿真器调试时可开启DEBUG中断,即使用ERTM语句

8) 编写外部中断服务函数

配置好中断后如果有触发,即会进入中断服务函数,中断服务函数名在前面 已定义好,所以要保证一致,否则将不会进入中断服务函数内执行。在 DSP28335 软件开发中,要在中断服务函数名前加上关键字 interrupt。例如外部中断 1 的 中断服务函数:
interrupt void EXTI1_IRQn(void)
{
…功能程序
}

在中断执行结束前要清除相应的中断标志位,以等待下次中断的到来。

三、程序设计

步骤如下:

1) 初始化对应端口的外部中断功能;
2) 编写外部中断函数;
3) 编写主函数;

3.1 外部中断初始化函数

要使用外部中断,我们必须先对它进行配置。其初始化代码如下:

void EXTI1_Init(void)
{
EALLOW;
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clock
EDIS;

EALLOW;
//KEY 端口配置
GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;
GpioCtrlRegs.GPADIR.bit.GPIO12=0;
GpioCtrlRegs.GPAPUD.bit.GPIO12=0;
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0; // 外部中断 1 (XINT1)与系统时钟 SYSCLKOUT 同步

GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;
GpioCtrlRegs.GPBDIR.bit.GPIO48=1;
GpioCtrlRegs.GPBPUD.bit.GPIO48=0;
GpioDataRegs.GPBCLEAR.bit.GPIO48=1;
EDIS;

EALLOW;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12; // XINT1 是 GPIO12
EDIS;

EALLOW; // 修改被保护的寄存器,修改前应添加 EALLOW 语句
PieVectTable.XINT1 = &EXTI1_IRQn;
EDIS; // EDIS 的意思是不允许修改被保护的寄存器

PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能 PIE 组 1 的 INT4
XIntruptRegs.XINT1CR.bit.POLARITY = 0; // 下降沿触发中断
XIntruptRegs.XINT1CR.bit.ENABLE= 1; // 使能 XINT1

IER |= M_INT1; // 使能 CPU 中断 1 (INT1)
EINT; // 开全局中断

ERTM;
}

在 EXTI1_Init()函数中,首先开启 GPIO 时钟,并初始化 GPIO12 为输入状态, 然后选择 GPIO12 为外部中断 1 功能,设置外部中断入口函数,使能 PIE 中断, 最后选择外部中断触发方式为下降沿触发,并开启外部中断功能和总中断。这些 配置是按照前面介绍的步骤完成,除了时钟外,其他顺序可以调换。 其实如果你会配置外部中断 1,那么其他外部中断都是类似的。

3.2 外部中断服务函数

初始化外部中断后,中断就已经开启了,当指定按键按下后会触发一次中断, 这时程序就会进入中断服务函数执行,所以我们还需要编写对应的 外部中断函 数,这里我们以 GPIO12 管脚的 K1 按键进行讲解,其他的按键的中断函数类似, 具体代码如下:
interrupt void EXTI1_IRQn(void)
{
Uint32 i;
for(i=0;i<10000;i++); //键盘消抖动
while(!KEY_H1);
LED2_TOGGLE;
PieCtrlRegs.PIEACK.bit.ACK1=1;
}

在 F28335 中断服务函数中,需要在中断服务函数名前加上一个关键字 “interrupt”标识为中断函数。进入中断函数后,还需要对按键进行消抖处理, 每当 K1 按键按下,D2 指示灯都会状态取反一次。最后特别注意,在中断函数执 行完成前一定要记得将相应的 PIEACKx 清零,否则下次将不再进入中断。可通过 PIE 控制寄存器的 PIEACK 中的 ACK1 写 1 来完成清零操作。

3.3 主函数

void main()
{
int i=0;
InitSysCtrl();
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
LED_Init();
EXTI1_Init();
EXTI2_Init();
while(1)
{
i++;
if(i%2000==0)
{
LED1_TOGGLE;
}
DELAY_US(100);
}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值