时间:2024年3月29日09点50分
在学习DSP28335过程中,对于中断没有很好的理解,因此重新通过一天的时间学习了以下中断的内容。下面就就是学习过程中的思路。
我们以前也学过stm32的中断,与stm32的中断类似,28335的中断也是需要设相应的寄存器。以普中的教学视频为例,使用按键key1 kye4 触发中断。我们先看看按键对应的原理图。

)

从上图可以看出,TZ1和TZ2分别对应GPIO12和GPIO13,ECAP5对应GPIO48。首先我们设置GPIO48为低电平,这样就相当于接地,由于矩阵按键设置了上拉电阻,因此在按键key1 key4未按下时,TZ1,TZ2对应高电平,只有当按键按下,TZ1,TZ2的输入为低电平,当按键再次松开时又被拉回高电平。关于上拉电阻的知识请看这篇文章。链接
根据上述对GPIO的分析我们先看看对应的GPIO端口如何配置:
void EXTI1_Init(void)
{
EALLOW;//允许对寄存器写操作
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clock
EDIS;//不允许对寄存器写操作
EALLOW;
//KEY端口配置
GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;//将gpio12设置成通用输入输出功能
GpioCtrlRegs.GPADIR.bit.GPIO12=0;//将gpio12设置成输入模式
GpioCtrlRegs.GPAPUD.bit.GPIO12=0;//使能gpio12的上拉功能
GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0; // 设置gpio12的不采样
GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;//将gpio48设置成通用输入输出功能
GpioCtrlRegs.GPBDIR.bit.GPIO48=1;//将gpio48设置成通用输出输出功能
GpioCtrlRegs.GPBPUD.bit.GPIO48=0;//使能gpio48的上拉功能
GpioDataRegs.GPBCLEAR.bit.GPIO48=1;//将gpio48设置成低电平
EDIS;
EALLOW;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12; // XINT1是GPIO12
//选择GPIO的
EDIS;
EALLOW; // 修改被保护的寄存器,修改前应添加EALLOW语句
PieVectTable.XINT1 = &EXTI1_IRQn;//中断函数的名称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;
}
由于是初次接触,我们一点一点的分析代码的含义:
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clock 开启GPIO时钟
为什么这段代码这样写,如此就能开启GPIO的时钟吗?答案是可以的,我们看一下说明:
![]()

通过SysCtrlRegs结构体,我们可以看出SysCtrlRegs包含PCLKCR3

PCLKCR3这个联合体前16位预留,PCLKCR3_BITS中的GPIOINENCLK可以使能GPIO的输入时钟。
因此就有了这行代码SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clock 开启GPIO时钟
接着往下看这行代码:GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;
一个GPIO引脚有多个功能我们以GPIO7为例(为什么以7为例呢,因为参考手册上就是以7为例,我为了方便也以7为例):从下面两个图中可以知道,GPIO7是14,15位,将此位设置成 00 则默认通用输入输出功能,将其设置成01则设置为EPWM功能,将其设置成MCLKRA功能(我也不知道这是啥功能,有啥用QAQ),将其设置成11则设置成ECAP功能


再看看GpioCtrlRegs(GPIO控制寄存器)


也就是说GpioCtrlRegs可以控制GPIOA B C三个端口,共96个引脚,这个96很熟悉啊,在后面中断的学习中会再次见到。
接下来我们先看GPIOA的这一部分的内容

GPACTRL 寄存器将为输入引脚指定采样周期,GPACTRL 为输入引脚 0-31 指定采样周期,GPACTRL 位功能描述如下:

英文原版:

GPAQSEL
GPAQSEL1 寄存器用来配置采样数,也可以认为是滤波数,当干扰信号持续采样周期小于该寄存器设置的采样周期数时,干扰信号被滤除,该寄存器各位功能如下:

英文原版:

说实话 看不太懂,虽然我看不懂,但有人懂GPIO寄存器详细描述。
00:为同步时钟输入,不采样。(我理解的采样是把数据存储到GPIODATA寄存器,虽然此时GPIO12也是输入功能,但不采样)
01:3采样
10:6采样
11:设置模式为外设时提供异步时钟信号,如果是设置为普通IO口输入则和设置为00具有相同的效果
我理解的采样是把数据存储到GPIODATA寄存器,虽然此时GPIO12也是输入功能,但不采样。所以代码GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0; 就是再GPIO12为输入模式下,不采样。
GPADIR 寄存器
GPxDIR 寄存器用来配置 GPIO 的输入输出方向,GPADIR 寄存器各位功能描述如下所示:

这个就不多解释了,因此这行代码GpioCtrlRegs.GPADIR.bit.GPIO12=0;的功能就是设置GPIO12引脚为输入功能
2025年4月17日11点23分
重新看了一下以前写的中断笔记,非常杂乱且毫无逻辑。现重写一下:
中断就是打断现有进程,进入中断服务函数;
此过程我们可以分为以下几步
第一 我们如何进入中断;
以DSP28335为例,在下面程序中 我们设置中断源为GPIO12,触发模式为下降沿触发,也就是当GPIO12从高电平转为低电平时触发中断,进入中断服务函数。
第二 如何让CPU知道中断服务程序的入口
答:通过将中断服务函数的地址 写到中断向量表中,即可让CPU知道当中断来的时候,从哪儿开始执行中断服务函数(本质上就是程序压栈)
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;
}
通过以上方法即可实现中断,下面有几个问题
问题1: GPIO12可以作为中断源,那么GPIO13 14 15 …63这些都可以作为中断源吗?、
答:是可以的,但是由于CPU只有12根 用户可使用的中短线,因此要想扩展这么多中断源,我们就需要加设PIE外部中断扩展模块,通过PIE外部中断扩展模块可实现中断线的复用。
F28335 共 支 持 7 个 外 部中 断 XINT1-XINT7 , 其 中 XINT1-XINT2 只 能 对GPIO0-GPIO31 配置;XINT3-XINT7 只对 GPIO32-GPIO63 配置。
问题2:我要是想使用GPIO55作为中断源,肯定要使用GPIOXINT3SEL、GPIOXINT4SEL、GPIOXINT5SEL、GPIOXINT6SEL、GPIOXINT7SEL,但是GPIOSEL只定义了5bit 5bit寻址 只能有32个数,那应该如何赋值55
//----------------------------------------------------
// GPIO Xint1/XINT2/XNMI select register bit definitions */
struct GPIOXINT_BITS { // bits description
Uint16 GPIOSEL:5; // 4:0 Select GPIO interrupt input source
Uint16 rsvd1:11; // 15:5 reserved
};
本文讲述了作者在学习DSP28335时对中断的理解,通过分析GPIO配置和矩阵按键的原理,详细讲解了EXTI1初始化过程,包括GPIO的时钟开启、输入输出模式设置以及中断触发机制。


被折叠的 条评论
为什么被折叠?



