1. 先看系统总中断图
系统一共有14路中断,INT1-14,其中,INT13,INT14分别为TIME1,TIM2的中断。
其中INT1-12,通过(ePIE,缩写为PIE)模块复用为多个外设共用,每个中断复用为16个信道(也叫中断向量),通过启用16bit寄存器(PIEERx),16bit标记寄存器的(PIEIFRx)和PIE 确认寄存器中的位(PIEACK)来进行控制。
具体可以通过仿真查看PieCtrlRegs寄存器。
在每个中断16路信道中,编号低的信道具有较高的优先级。
2. 外设中断传递架构
总的来说大概流程是这样
外设中断标志产生->外设中断使能->PIEx IFR置位->PIExIER使能->判断PIExACK->IFR置位->IER使能->判断INTM位->CPU执行中断程序。
3. 中断向量表
上面描述的INT1-12,每个中断的16路信道连接的具体外设表如下所示
4. 配置过程
- 关闭系统所有中断
DINT; - 关闭PIE,PIE初始化,清零PIEIER和PIEIFR,
InitPieCtrl(); - 禁止所有CPU中断,清除CPU中断相关标志位,
IER = 0x0000;
IFR = 0x0000; - 初始化中断向量表
InitPieVectTable();
5.设置中断服务函数入口。
EALLOW; // 这需要写入到EALLOW 受保护的注册表
PieVectTable.XINT1_INT = &xint1_isr;
PieVectTable.XINT2_INT = &xint2_isr;
PieVectTable.XINT3_INT = &xint3_isr;
PieVectTable.XINT4_INT = &xint4_isr;
EDIS; //这需要禁用对EALLOW 受保护寄存器的写入 - 在PIE 中启用XINT1 和XINT2
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //启用PIE 块
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; //启用PIE 组1 INT4
PieCtrlRegs.PIEIER1.bit.INTx5 = 1; // 启用PIE 组1 INT5
PieCtrlRegs.PIEIER12.bit.INTx1 = 1; // 启用PIE 组12 INT1
PieCtrlRegs.PIEIER12.bit.INTx2 = 1; // 启用PIE 组12 INT2
7.启用CPU中断
IER |= M_INT1; // 启用CPU INT1
IER |= M_INT12; // 启用CPU INT12
8.开启全局中断
EINT; //启用全局中断