2. 学习DSP28377外部中断

        中断是一个信号,它使CPU暂停当前的执行,并转移到另一段被称为中断服务例程(ISR)的代码。这是种用于处理外围事件的有用机制,与寄存器轮询相比,它涉及更少的CPU开销或程序复杂性。但是,由于中断对程序流是异步的,因此必须注意避免在中断和主程序代码中访问的资源上发生冲突。

        中断通过一系列标志传播到CPU并启用寄存器。标志寄存器存储中断,直到它被处理。使能寄存器阻止中断的传播。当一个中断信号到达CPU时,CPU从一个叫做向量表的列表中获取适当的ISR地址。

        如下图所示,器件支持五个外部中断(XINT1 到 XINT5),这些中断可以映射到任何 GPIO 引脚上。

              

        在此器件中,16 个 ePIE 块中断分组为 1 个 CPU 中断。共 12 个 CPU 中断组,每组 16 个中断。12个通过增强型外设中断扩展模块 (ePlE,或简称PLE)连接到外设中断信号。PE多路复用多达16个外设中断到每个CPU中断线。它还扩展了向量表,允许每个中断有它自己的ISR。这使得CPU能够支持大量的外围设备。

        中断路径分为三个阶段,外围设备、PIE和CPU。每个阶段都有自己的使能和标志寄存器。该系统允许CPU处理一个中断,而其他中断正在等待,在软件中实现嵌套中断并对其排序,并在某些关键任务中禁用中断。

2.1 外部中断配置步骤

         外部中断相关函数及寄存器在 F2837xS_PieCtrl.c、F2837xS_PieVect.c以及     F2837xS_GlobalVariableDefs.c 文件及其对应的头文件内查找到。

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

代码如下:

        InitPieCtrl();

        IER = 0x0000;

        IFR = 0x0000;

        InitPieVectTable();

        EALLOW;  // 打开写入

        PieVectTable.XINT1_INT = &xint1_isr;       //绑定中断向量函数地址入口

        PieVectTable.XINT2_INT = &xint2_isr;            //绑定中断向量函数地址入口

        EDIS;    // 禁用写入

(2)在PIE中使能XINT1和XINT2,中断组1的中断4和5,使能INT1

        PieCtrlRegs.PIECTRL.bit.ENPIE = 1;         //使能PIE

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

        PieCtrlRegs.PIEIER1.bit.INTx5 = 1;          // 使能PIE1组的 INT5

        IER |= M_INT1;                          // 使能 CPU INT1

        EINT;                                  // 中断使能

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

        GPIO_SetupPinMux(54, GPIO_MUX_CPU1, 0); 

        //第一个参数为IO口,第二个参数为内核,在F2837xS_Gpio _defines.h里可找到;第三个参数为选择IO口的复用功能,复用功能介绍在F28377的数据手册中的多路复用引脚图。

         GPIO_SetupPinOptions(54, GPIO_OUTPUT, GPIO_PUSHPULL);

        //设置为输出上拉

        GPIO_SetupPinMux(55, GPIO_MUX_CPU1, 0);

        GPIO_SetupPinOptions(55, GPIO_INPUT, GPIO_SYNC);

        //IO口55,设置为输入,频率跟随系统

(5)中断绑定引脚

        GPIO_SetupXINT1Gpio(54);           //外部中断1绑定引脚54

        GPIO_SetupXINT2Gpio(55);            //外部中断2绑定引脚55

(6)设置中断触发方式

        XintRegs.XINT1CR.bit.POLARITY = 0;          //下降沿触发

        XintRegs.XINT2CR.bit.POLARITY = 1;          // 上升沿触发

(7)使能中断组

        XintRegs.XINT1CR.bit.ENABLE = 1;            //使能外部中断1 XINT1

        XintRegs.XINT2CR.bit.ENABLE = 1;            //使能外部中断2 XINT2

(8)编写外部中断服务函数

        配置好中断后如果有触发,即会进入中断服务函数,中断服务函数名在前面已定义好,所以要保证一致,否则将不会进入中断服务函数内执行。

要在中断服务函数名前加上关键字 interrupt

        interrupt void xint1_isr(void)

        {

               ...功能程序

                PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; 

                //在中断执行结束前要清除相应的中断标志位,以等待下次中断的到来。

        }

        interrupt void xint2_isr(void)

        {

               ...此处为自定义代码

                PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

                //在中断执行结束前要清除相应的中断标志位,以等待下次中断的到来。

        }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
DSP2812是一款数字信号处理器,具备丰富的外设接口,包括外部中断引脚。外部中断是一种通过外部触发来暂停CPU正常执行流程并处理特定事件的机制。下面是关于DSP2812外部中断的一些信息: 1. 外部中断引脚:DSP2812的外部中断引脚有多个,可以根据需求选择合适的引脚进行中断触发。这些引脚通常与外部设备连接,当设备产生中断信号时,CPU会暂停当前运行的程序并跳转到对应的中断服务程序进行处理。 2. 中断优先级:DSP2812支持多级中断优先级,可以根据不同的中断需求设置不同的优先级。当多个中断同时触发时,CPU会自动根据中断优先级选择优先处理高优先级的中断,以确保重要的中断能够及时得到处理。 3. 中断服务程序(ISR):对于每一个中断,需要编写对应的中断服务程序。中断服务程序是一段特定的代码,用于处理中断事件。在中断发生时,CPU会自动跳转到对应的中断服务程序,并执行其中的代码。在中断服务程序中,可以进行相关的处理,如读取数据、发送数据、更新状态等。 4. 中断控制寄存器:DSP2812提供了一些特定的寄存器,用于配置和控制外部中断。通过设置这些寄存器,可以选择触发中断的条件(上升沿、下降沿等)、设置中断优先级、使能或禁用中断等操作。 5. 中断嵌套:DSP2812支持中断嵌套功能,即在一个中断服务程序中触发另一个中断。这样可以在处理一个中断的同时,及时地响应其他高优先级的中断请求。 总之,DSP2812的外部中断功能为我们提供了一种方便和灵活的机制来处理外部设备产生的中断事件。通过合理配置和编写中断服务程序,我们可以充分利用DSP2812的外部中断功能,实现各种应用场景中的中断处理需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Grayson895

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值