时间: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引脚为输入功能