自学内容网 自学内容网

DSP28335学习笔记-4

中断部分我觉得写太多理论方面,也是很容易让人看不懂,望而却步。

下面写一些日常使用的代码

初始化配置过程,放在void EXTI1_init()中;

1、使能外设对应的PIE中断

根据下表来判断中断连接哪一组的哪一根线。

下面是常用的表单,对应每一个中断对应

INT1.1SEQ1INT(ADC)
INT1.2SEQ2INT(ADC)
INT1.4XINT1
INT1.5XINT2
INT1.6ADCINT(ADC)
INT1.7TINT0(CPU定时器0)
INT3.1ePWM1_INT(ePWM1)
INT3.2ePWM2_INT(ePWM2)
INT3.3ePWM3_INT(ePWM3)
INT3.4ePWM4_INT(ePWM4)
INT3.5ePWM5_INT(ePWM5)
INT3.6ePWM6_INT(ePWM6)
INT4.1eCAP1_INT(eCAP1)
INT4.2eCAP2_INT(eCAP2)
INT4.3eCAP3_INT(eCAP3)
INT4.4eCAP4_INT(eCAP4)
INT4.5eCAP5_INT(eCAP5)
INT4.6eCAP6_INT(eCAP6)

使能外部中断1

PieCtrlRegs.PIEIER1.bit.INTx4=1; //使能PIE组1的INT4

2、使能外设中断

该中断由外设相关中断使能位来控制,比如外部中断1由外部中断1的控制寄存器中相应中断使能位来控制。

XIntruptRegs.XINT1CR.bit.ENABLE=1; //使能XINT1

3、触发中断

XIntruptRegs.XINTCR1.bit.POLARITY=0;//下降沿触发中断

XIntruptRegs.XINTCR1.bit.ENABLE=1;//使能外部中断1

4、指定中断向量表中断服务函数地址

通过对PIE中断向量表寄存 器的相应位进行设置,中断服务函数名可自定义。中断函数名前需加上地址符“&”。对PIE中断向量表寄存器设置时要注意在程序前加入EALLOW,以修改被保护的寄存器;程序后加入EDIS,不允许修改被保护的寄存器。

EALLOW; 
PieVectTable.XINT1=&EXTI1_IRQn;//函数名需要添加&
 EDIS;

4、使能CPU中断及全局中断

通过对IER和EINT寄存器相应位设置进行使能或者无效。

配置外部中断程序如下

IER|=M_INT1;//使能CPU中断1
EINT;//开全局中断
ERTM;

5、配置中断服务程序

配置好中断后如果有触发,即会进入中断服务函数,中断服务函数名在步骤3定义好,在&之后的名字。前后保证一致,否则将不会进入中断服务函数内执行。在DSP28335 软件开发中,要在中断服务函数名前加上关键字interrupt。

外部中断1的 中断服务函数如下

interrupt void EXT1_IRQn(void)
{

   功能;
}

完整初始化函数程序如下

#include"exti.h"
#include"led.h"
#include"key.h"
void EXTI1_init()
{
   EALLOW;
   SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK=1;//GPIO输入时钟

   EDIS;


  EALLOW;
  GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;//将GPIO12设为通用IO
  GpioCtrlRegs.GPADIR.bit.GPIO12=0;//输入

  GpioCtrlRegs.GPAPUD.bit.GPIO12=0;//上拉电阻
  GpioCtrlRegs.GPAQSEL1.bit.GPIO12=0;//外部中断1和系统时钟同步
 EDIS;

  EALLOW;
   GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL=12;//XINT1对应GPIO12
  EDIS;
  
  EALLOW;
PieVectTable.XINT1=&EXTI1_IRQn;//中断向量表地址
EDIS;
PieCtrlRegs.PIEIER1.bit.INTx4=1;//由于外部中断1对应1.4
XIntruptRegs.XINT1CR.bit.POLARITY=0;//按下按钮,下降沿触发中断;
XIntruptRegs.XINT1CR.bit.ENABLE=1;//使能外部中断1;
IER|=M_INT1;//使能外部中断1;
EINT;//开全局中断
ERTM;}

interrupt void EXTI1_IRQn(void)
{
   Uint32 i;
    for(i=0;i<10000;i++);//消抖
   while(!KEY_H1)//等待按钮按下
    LED_TOGGLE;

   PieCtrlRegs.PIEACK.bit.ACK1=1;//执行后消除中断标志,ACK清0,PIE给CPU一个脉冲
}


  

主函数

void main()
{   int i;

    InitSysCtrl();
   InitPieCtrl();
    IER|=0x00;

    IFR|=0x00;
    InitPieVectTable();
    LED_Init();
   EXTI1_Init();

   while(1)
{  i++;

   if(i%2000==0)
{LED2_TOGGLE;//200ms闪烁一次
}
  delay_us(100);
}}


原文地址:https://blog.csdn.net/myjy1992/article/details/143655677

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!