一、概述
处理器的外部中断主要用于捕抓外部输入的高低电平。本篇文章将介绍DSP28335的外部中断的使用。
二、DSP28335外部中断介绍
DSP28335处理器共支持7个外部中断XINT1XINT7,其中XINT1XINT2只能对GPIO0GPIO31配置;XINT3XINT7只对GPIO32~GPIO63配置。每一个外部中断可以被选择为正边沿或负边沿触发。DSP28335的中断系统框图为:
图1 DSP中断系统
DSP28335中断分为三级,分别为:外设级、PIE级、CPU级。如下图所示:
图2 DSP28335的三级中断机制
DSP28335的三级中断机制可以这样理解(以外部中断为例):外设级为像外部引脚输入高低电平时,同时外设级的中断使能了,这时候外设级会产生一个中断标志位,PIE级检测到该中断标志位,同时PIE自己的中断使能了,这时候PIE会产生一个中断标志位,PIE的中断标志位给CPU,当CPU的中断使能位打开了,就会响应这个中断。总的概况:一个外部中断要得到CPU响应,要越过外设级中断使能、PIE中断使能、CPU中断使能。
图3 DSP28335中断过程
从图3可以看出,只有一道一道开关闭合,才能把中断送到CPU,让CPU去响应中断。
三、外部中断涉及相关寄存器
1. 外部中断控制寄存器---XINTnCR【外设级】
图4 外部中断控制寄存器---XINTnCR
外部中断控制寄存器用于控制上升沿触发还是下降沿触发,中断使能。
2. PIE这一级的寄存器【PIE级】
(1)PIE中断使能寄存器----PIEIERx[x=1~12]
图5 PIE中断使能寄存器
(2)PIE中断标志寄存器----PIEIFRx[x=1~12]
图6 PIE中断标志寄存器
(3)PIE中断应答寄存器----PIACK
图6 PIE中断应答寄存器
3.CPU这一级寄存器【CPU级】
(1)CPU中断标志寄存器---IFR
图7 CPU中断标志寄存器
(2)CPU中断使能寄存器---IER
图8 CPU中断使能寄存器
四、DSP28335外部中断实现
DSP28335外部中断实现主要有以下步骤:
(1)失能CPU级中断,并初始化PIE控制器和PIE中断向量表;
(2)使能IO口时钟,配置IO口为输入;
(3)设置IO口与中断线的映射关系;
图9 中断映射表
本次使用的是GPIO17,映射到XINT1,即INT1.4
(4)指定中断向量表中断服务函数地址;
(5)使能外设对应的PIE中断**[PIE级使能];**
(6)设置外部中断触发方式并使能中断**[外设级使能];**
(7)使能CPU级中断及全局中断**[CPU级使能];**
(8)编写外部中断服务函数。
编程实现:
//外部中断配置步骤
//1。失能CPU级中断,并初始化PIE控制器寄存器和PIE中断向量表
//2.使能IO时钟,配置IO口为输入
//3.设置IO口与中断线的映射关系
//4.指定中断向量表中断服务函数地址
//5.使能外设对应的PIE中断
//6.设置外部中断触发中断触发方式并使能中断
//7.使能CPU级中断及全局中断
void EXTI_Init(void)
{
// 步骤 1. 失能CPU级中断,并初始化PIE控制器寄存器和PIE中断向量表
DINT; // 禁止CPU全局中断
InitPieCtrl();
IER = 0x0000; // 禁止CPU中断和清除所有CPU中断标志
IFR = 0x0000;
InitPieVectTable(); //初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
//步骤 2.使能IO时钟,配置IO口为输入
EALLOW;//关闭写保护
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; //开启GPIO时钟
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 0; //配置为通用IO口
GpioCtrlRegs.GPADIR.bit.GPIO17 = 0; //配置为输入
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; //配置为上拉
EDIS;//打开写保护
//步骤3:设置IO口与中断线的映射关系
EALLOW;
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 17;//XINT1 对应 GPIO17脚(GPIO0-31配置XINT1、2;GPIO32-63配置XINT3~7)
EDIS;
//步骤 4. 指定中断向量表中断服务函数地址
EALLOW;
PieVectTable.XINT1 = &EXTI_IRQ;
EDIS;
//步骤 5.使能外设对应的PIE中断
PieCtrlRegs.PIEIER1.bit.INTx4 = 1;//使能PIE 1 组 4通道 (这里需要查询PIE的中断矢量表 来确定使能的位)
//6.设置外部中断触发中断触发方式并使能中断
XIntruptRegs.XINT1CR.bit.POLARITY = 0;//下降沿触发有效
XIntruptRegs.XINT1CR.bit.ENABLE = 1;//使能外部中断
//步骤 7. 使能CPU级中断及全局中断
IER |= M_INT1;//使能INT1中断通道 (对应的变量值在 DSP2833x_Device.h中已进行宏定义。要用|或符号赋值,防止改变其他位)
EINT;//打开全局中断
ERTM;//当使用仿真器调试时 开启DEBUG中断
}
int CNT=0;
//步骤 8. 编写中断函数,在中断函数结束前写1清零PIEACK对应位
interrupt void EXTI_IRQ(void)
{
GpioDataRegs.GPCTOGGLE.bit.GPIO75 = 1;
CNT = CNT+1;
// DELAY_US(5000);//延时
PieCtrlRegs.PIEACK.bit.ACK1 = 1;//写1清零PIEACK对应位
}
主函数为:
void main(void)
{
InitSysCtrl();
GIOP_Init();
EXTI_Init();
while(1)
{
// GpioDataRegs.GPCSET.bit.GPIO75 = 1;
}
}
通过上面的程序就能使用按键使得一个LED灯翻转。
*五、总结
本篇文章介绍了DSP28335的外部中断的使用,使用一个按键作为外部输入,触发LED灯进行翻转。
全部0条评论
快来发表一下你的评论吧 !