F28069M_外部中断

F28069M_外部中断

首先

今天开头没有鸡汤,直接开始进入正题。
不要忘记,本文为精简版,文章最后有PDF完全版。
不要忘记有PDF版

代码秀一波

#include "DSP28x_Project.h"

void gpio_setup(void);                    //端口初始化函数
interrupt void xint1_isr(void);            //中断函数
int a = 0;    


void main()
{
    InitSysCtrl();
    DINT;
    InitPieCtrl();
    IER=0x0000;
    IFR=0x0000;
    InitPieVectTable();
    EALLOW;                                //使能写操作
    PieVectTable.XINT1=&xint1_isr;        //服务子函数存入相应向量地址
    EDIS;                                //禁止写操作
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;    //除Reset复位向量外的所有向量都从PIE向量列表中提取
    PieCtrlRegs.PIEIER1.bit.INTx4 = 1;    //分配XINT1为PIE组1第4位
    IER |= M_INT1;                        //使能INT1中断
    EINT;                                //使能全局中断INTM
    gpio_setup();
    while(1)
    {
        //等待中断产生
    }

}

void gpio_setup(void)
{
    //初始化GPIO,上篇已详细介绍
    EALLOW;
    GpioCtrlRegs.GPBMUX2.bit.GPIO54=0;
    GpioCtrlRegs.GPBPUD.bit.GPIO54=0;
    GpioCtrlRegs.GPBDIR.bit.GPIO54=1;
    GpioDataRegs.GPBDAT.bit.GPIO54 = 1; 
    EDIS;
    EALLOW;
    GpioCtrlRegs.GPAMUX2.bit.GPIO23=0;
    GpioCtrlRegs.GPAPUD.bit.GPIO23=0;
    GpioCtrlRegs.GPADIR.bit.GPIO23=1;
    GpioDataRegs.GPADAT.bit.GPIO23 = 1;
    EDIS;
    
    //外部中断输入I/O配置
    EALLOW;
    GpioCtrlRegs.GPAMUX2.bit.GPIO21=0;            //设置数字模式
    GpioCtrlRegs.GPADIR.bit.GPIO21=0;            //设置输出模式
    GpioCtrlRegs.GPAQSEL2.bit.GPIO21=0;            //与SYSCLKOUT同步
    GpioCtrlRegs.GPACTRL.bit.QUALPRD3 = 0xff;    //设置采样周期
    EDIS;
    EALLOW;
    GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 0x15;//配置GPIO21位XINT1输入引脚
    EDIS;
    XIntruptRegs.XINT1CR.bit.POLARITY = 0;        //配置为下降沿触发
    XIntruptRegs.XINT1CR.bit.ENABLE = 1;        //使能中断
}



interrupt void xint1_isr(void)                    //中断处理函数
{
    for(a=0;a<100;a++)
    {
    GpioDataRegs.GPADAT.bit.GPIO23=0;
    DELAY_US(100000);
    GpioDataRegs.GPADAT.bit.GPIO23=1;
    DELAY_US(100000);
    }
    PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;        //中断已应答,可接收更多中断
}

怎么开始

首先你需要有前面章节的基础,本章节默认你已有基础,直接讲外部中断的初始化。

  1. 首先分析一下代码,感觉代码标注已经很明白了,这个就是基本初始化步骤

    EALLOW;                                //使能写操作
    PieVectTable.XINT1=&xint1_isr;        //服务子函数存入相应向量地址
    EDIS;                                //禁止写操作
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;    //使能PIE模块
    PieCtrlRegs.PIEIER1.bit.INTx4 = 1;    //分配XINT1为PIE组1第4位
    IER |= M_INT1;                        //使能INT1中断
    EINT;                                //使能全局中断INTM
  2. 既然是外部中断,肯定要初始化GPIO啊

    //外部中断输入I/O配置
    EALLOW;
    GpioCtrlRegs.GPAMUX2.bit.GPIO21=0;            //设置数字模式
    GpioCtrlRegs.GPADIR.bit.GPIO21=0;            //设置输出模式
    GpioCtrlRegs.GPAQSEL2.bit.GPIO21=0;            //与SYSCLKOUT同步
    GpioCtrlRegs.GPACTRL.bit.QUALPRD3 = 0xff;    //设置采样周期
    EDIS;
    EALLOW;
    GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 0x15;//配置GPIO21位XINT1输入引脚
    EDIS;
    XIntruptRegs.XINT1CR.bit.POLARITY = 0;        //配置为下降沿触发
    XIntruptRegs.XINT1CR.bit.ENABLE = 1;        //使能中断
  3. 怎么把代码贴上之后,感觉一切都那么明了那,不需要什么介绍了,

相关寄存器

这个是我写作中最慢的地方,但是也是最有用的地方,上面代码怎么根据自己的需要定制,全靠这里面的知识了啊。一般教程都有流程图什么的,那种任何书上都有,我就不重复了,写这个就是为了囤干货,不为造轮子而生,只为轮子找好归宿。

首先说一下本代码用的寄存器

  1. PIECTRL
  2. PIEIERx(x=1~12)
  3. GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 0x15
  4. XIntruptRegs.XINTnCR(n=1~7)
  5. IER

其他寄存器

  1. PIEACK
  2. PIEIFRx(x=1~12)
  3. IFR
  4. DBGIER(仿真模式下中断)
  5. XNMICR

最后

每一次,后面都需要有一段鸡汤,这篇教程我写的比较长,写了好几天,真实的想法不能说,哎。这篇后面有几个不常用的,需要可以自己查,我写这个目的是让你更好的复习,记住上一篇说的这个是给有基础的你,学习这东西是需要真金白银投资的。什么书啦,开发板啦不该少就不能少,希望你可以把钱花在刀印上。

还有好多话要说,感觉是时候写一篇随想了。

还有个下载地址

PDF版下载

最后修改:2019 年 02 月 04 日 09 : 31 AM
如果觉得我的文章对你有用,请随意赞赏

发表评论