DSP28335学习笔记:外部中断

外部中断(注重实际如何使用,具体寄存器等原理暂不详细记录)

一、F28335 中断概述


F28335 有很多资源很多外设,这些外设与相关资源都有可能发布新的任务让内核来判断与处理,也就是说 F28335 的可能中断源有很多。F28335 的中断源可分为片内外设中断源,比如 PWM、CAP、QEP、定时器等片外中断源,外部中断输入引脚 XINT1、XINT2 引入的外部中断源。这些中断源将中断请求信号传递给内核就需要中断线,F28335 的中断线是有限的

F28335 内部有 16 个中断线,其中包括 2 个不可屏蔽中断(RESET 和 NMI)与14 个可屏蔽中断可屏蔽中断通过相应的中断使能寄存器使用或者禁止产生的中断,在这 14 个可屏蔽中断中,其中 TIM1 和 TIM2 产生的中断请求通过 INT13、INT14 中断线到达 CPU,这两个中断已经预留给了实时操作系统,因此剩下的 12 个可屏蔽中断可供外部中断和处理器内部单元使用F28335 的外设中断源远远不止 12 个,共用 58 个

二、F28335 中断机制


F28335 的中断采用的是 3 级中断机制,分别是外设级中断PIE 级中断CPU级中断,最内核部分为 CPU 级中断,即 CPU 只能响应从 CPU 中断线上过来的中断 请求,但 F28335 中断源很多,CPU 没有那么多中断线,在有限中断线的情况下, 只能安排中断线进行复用,其复用管理就有了中间层的 PIE 级中断,外设要能够成功产生中断响应,就要首先外设级中断允许,然后经 PIE 允许最终 CPU做出响应

三、中断分配表(非常重要)


四、F28335外部中断


F28335 外部中断有 7 个外部中断 1-7,其中外部中断 1 和 2 只能对 GPIO0-GPIO31 配置外部中断 3 和 4、5、6、7 只对 GPIO32-GPIO63 配置

F28335 共 支 持 7 个 外 部中 断 XINT1-XINT7 , 其 中 XINT1-XINT2 只 能 对GPIO0-GPIO31 配置XINT3-XINT7 只对 GPIO32-GPIO63 配置XINT13 还有一个不可屏蔽的外部中断 XNMI 共用中断源每一个外部中断可以被选择为正边沿负边沿触发。

五、外部中断配置步骤(最重要一节)


1.失能 CPU 级中断,并初始化 PIE 控制器寄存器和 PIE 中断向量表

//==========1.中断控制配置函数==========//
        InitPieCtrl();        //初始化PIE控制寄存器
        IER = 0x0000;         //失能全部CPU中断
        IFR = 0x0000;         //清除CPU中断标志
        InitPieVectTable();  //初始化PIE中断向量表

2.配置void EXTI1_Init(void)函数

void EXTI1_Init(void)
{
//========2.使能 IO 口时钟=========//
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;    // GPIO input clock
    EDIS;
//==========3.配置IO口为输入输出===========//
    EALLOW;
    //KEY端口配置
    GpioCtrlRegs.GPAMUX1.bit.GPIO13=0;          //普通IO
    GpioCtrlRegs.GPADIR.bit.GPIO13=0;           //输入
    GpioCtrlRegs.GPAPUD.bit.GPIO13=0;           //使能GPIO上拉电阻
    GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 0;       // 外部中断1(XINT1)与系统时钟SYSCLKOUT同步
    EDIS;
//==========4.设置 IO 口与中断线的映射关系===========//
    EALLOW;
    GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 13;   // XINT1是GPIO13
    EDIS;
//==========5.指定中断向量表中断服务函数地址==========//
​
    EALLOW; // 修改被保护的寄存器,修改前应添加EALLOW语句
    PieVectTable.XINT1 = &EXTI1_IRQn;
    EDIS;   // EDIS的意思是不允许修改被保护的寄存器
​
//==========6.使能外设对应的 PIE 中断==========//
    PieCtrlRegs.PIEIER1.bit.INTx4 = 1;          // 使能PIE组1的INT4
​
//==========7.设置外部中断触发方式并使能中断==========//
    XIntruptRegs.XINT1CR.bit.POLARITY = 0;      // 0下降沿触发中断  1上升沿触发中断
    XIntruptRegs.XINT1CR.bit.ENABLE= 1;        // 使能XINT1
​
//==========8.使能 CPU 级中断及全局中断==========//
    IER |= M_INT1;                              // 使能CPU中断1(INT1)
    EINT;                                       // 开全局中断
    ERTM;
}

3.配置中断服务函数 interrupt void EXTI1_IRQn(void)

interrupt void EXTI1_IRQn(void)
{
        .......中断中的功能
PieCtrlRegs.PIEACK.bit.ACK1=1;  //在中断函数执行完成前一定要记得将相应的PIEACKx 清零,
                                    //否则下次将不再进入中断
}

4.配置 void main(void)函数

void main()
{
        InitSysCtrl();
//==========1.中断控制配置函数==========//
        InitPieCtrl();        //初始化PIE控制寄存器
        IER = 0x0000;         //失能全部CPU中断
        IFR = 0x0000;         //清除CPU中断标志
        InitPieVectTable();  //初始化PIE中断向量表
        
//==========下载Flash==========//
        MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
        InitFlash();
        
        EXTI1_Init();   //中断函数初始化
    
​
        while(1)
        {
            
        }
​
}

六、具体代码图片(中断服务函数中为自己的功能)


main函数:

exti.c文件

void EXTI1_Init(void)函数


interrupt void EXTI1_IRQn(void)


exti.h文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值