DSP28335外部中断的使用

描述

一、概述

处理器的外部中断主要用于捕抓外部输入的高低电平。本篇文章将介绍DSP28335的外部中断的使用。

二、DSP28335外部中断介绍

DSP28335处理器共支持7个外部中断XINT1XINT7,其中XINT1XINT2只能对GPIO0GPIO31配置;XINT3XINT7只对GPIO32~GPIO63配置。每一个外部中断可以被选择为正边沿或负边沿触发。DSP28335的中断系统框图为:

DSP28335

图1 DSP中断系统

DSP28335中断分为三级,分别为:外设级、PIE级、CPU级。如下图所示:

DSP28335

图2 DSP28335的三级中断机制

DSP28335的三级中断机制可以这样理解(以外部中断为例):外设级为像外部引脚输入高低电平时,同时外设级的中断使能了,这时候外设级会产生一个中断标志位,PIE级检测到该中断标志位,同时PIE自己的中断使能了,这时候PIE会产生一个中断标志位,PIE的中断标志位给CPU,当CPU的中断使能位打开了,就会响应这个中断。总的概况:一个外部中断要得到CPU响应,要越过外设级中断使能、PIE中断使能、CPU中断使能。

DSP28335

图3 DSP28335中断过程

从图3可以看出,只有一道一道开关闭合,才能把中断送到CPU,让CPU去响应中断。

三、外部中断涉及相关寄存器

1. 外部中断控制寄存器---XINTnCR【外设级】

DSP28335

图4 外部中断控制寄存器---XINTnCR

外部中断控制寄存器用于控制上升沿触发还是下降沿触发,中断使能。

2. PIE这一级的寄存器【PIE级】

(1)PIE中断使能寄存器----PIEIERx[x=1~12]

DSP28335

图5 PIE中断使能寄存器

(2)PIE中断标志寄存器----PIEIFRx[x=1~12]

DSP28335

图6 PIE中断标志寄存器

(3)PIE中断应答寄存器----PIACK

DSP28335

图6 PIE中断应答寄存器

3.CPU这一级寄存器【CPU级】

(1)CPU中断标志寄存器---IFR

DSP28335

图7 CPU中断标志寄存器

(2)CPU中断使能寄存器---IER

DSP28335

图8 CPU中断使能寄存器

四、DSP28335外部中断实现

DSP28335外部中断实现主要有以下步骤:

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

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

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

DSP28335

图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灯进行翻转。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分