DSP28335——中断学习笔记

本文讲述了作者在学习DSP28335时对中断的理解,通过分析GPIO配置和矩阵按键的原理,详细讲解了EXTI1初始化过程,包括GPIO的时钟开启、输入输出模式设置以及中断触发机制。

时间: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
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值