TMS320F28379D——中断系统

中断系统

一、中断系统简介

  • 在该片子上,每个CPU各有14条中断线,其中INT13INT14直接连接在了TIMER1TIMER2上,其余的12条CPU中断线通过ePIE连接在外设上。

  • 整个中断的路径被分为三个stagesPeripheral——>PIE——>CPU,每个stages都有各自的enable registersflag registers,同时支持中断嵌套以及设置中断优先级。

二、中断链路图(寄存器手册P92)

在这里插入图片描述

  • 每个ePIEblock一共有16个中断,而该系统中每个CPU各有12个ePIEblock。(在下文中可以看到相应的映射关系)
  • ePIE一共支持五个外部中断,通过X-Bar总线可以映射到任意的GPIO上。
1)Peripheral Stage

​ 每个外设都有自己的中断配置,有些外设,支持多个事件触发容易个中断信号,因此,在下一个中断信号产生之前必须先清除中断标志位。

2)PIE Stage

​ 当CPU收到中断时,它将从该组的ePIE获得ISR的地址,而PIE将会返回组中编号最小的通道向量,编号越小代表着中断优先级越高

3)CPU Stage

​ CPU为每个CPU级的中断提供一个标志寄存器(IFR)和使能寄存器(IER),他们都是内部CPU寄存器,还有一个global中断屏蔽,可以通过宏定义DINTEINT进行关闭全局中断和打开全局中断。

三、中断传递示例(寄存器手册P93)

在这里插入图片描述

​ 当PIExchannel y发生一个中断时,其整个过程如下图所示:

  1. 该中断被锁存在PIEIFRx.y中。
  2. 如果PIEIERx.y 被set,则中断传递。
  3. 如果PIEACK.x 被clear,则中断传递,同时将PIEACK.x set。
  4. 此时该中断锁存在IFR.x中
  5. 如果IER.x被set,则中断传递
  6. 如果INTM被clear,则CPU收到中断
  7. CPU将当前执行的命令保存到堆栈中
  8. IFR.x和IER.x被clear,INTM被set,EALLOW被clear
  9. CPU从PIE取出ISR向量,之后PIEIFRx.y被clear
  10. CPU跳转到ISR执行。

四、PIE Channel Mapping映射(寄存器手册P96)

在这里插入图片描述

五、CPU中断向量表(寄存器手册P97)

在这里插入图片描述

六、中断的配置

中断配置步骤:

  1. 关闭全局中断(DINT)
  2. PIE向量表中写入ISR向量地址。
  3. 将PIECTRL寄存器的ENPIE位置一,来使能PIE block
  4. 将需要设置的中断对应的PIEIERx.INTy位置一
  5. 将CPU IER相应位置一来使能对应的PIE组中断。
  6. 配置使能外设的中断
  7. 使能全局中断(EINT)

中断函数的处理

  • 一定要在中断函数里清除PIEACK对应的位。

Example:

DINT;                                            //第一步:关全局中断

InitPieCtrl();       //初始化PIE控制位

IER = 0x0000;        //清除CPU中断使能
IFR = 0x0000;        //清除CPU中断标志

InitPieVectTable();  //初始化中断向量表

EALLOW;	 
PieVectTable.XINT1_INT = &xint1_isr;            //第二步:向PIE向量表写入对应的向量地址
PieVectTable.XINT2_INT = &xint2_isr;
EDIS;    

PieCtrlRegs.PIECTRL.bit.ENPIE = 1;              //第三步:使能PIE block
PieCtrlRegs.PIEIER1.bit.INTx4 = 1;              //第四步:根据PIE map,将对应的PIEIERx.INTy置一
PieCtrlRegs.PIEIER1.bit.INTx5 = 1;          
IER |= M_INT1;                                  //第五步:使能CPU级的PIE组中断,PIEIERx对应M_INTx

EINT;                                           //第六步:开启全局中断

Counfigure_XINT1_XINT2();                       //第七步:配置外部中断
//第六步和第七步和换一下顺序,不影响。
interrupt void xint1_isr(void)
{
	/*
	 * User Code
	 */
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

interrupt void xint2_isr(void)
{
	/*
	 * User Code
	 */
	PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}
  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值