准则3:使用PIEIER禁止中断
根据是否去掉中断的使能位,又分为两种处理方法:
方法1:使用PIEIER禁止中断,但是保留对应的中断标志位
这种方法的特点是中断不会丢失,需要以下的步骤:
1. 禁止全局中断(INTM = 1).
2. 清除PIEIERx.y位以禁止特定的外设中断;可以同时对一个组内的多个中断进行操作,即对整个PIEIERx寄存器进行“或”操作的赋值。用或操作是为了不会误操作到与本次程序执行的目的无关的位。
3. 循环等待5个时钟周期以确保所有送入CPU的中断的标志位可以在CPU IFR中正确操作。
4. 清除前面组所对应的CPU的IFRx位。
5. 清除外设中断组的PIEACKx 应答位。Step e. Clear the PIEACKx bit for the peripheral group.
6. 使能全局中断(INTM = 0).
方法2:使用PIEIER禁止中断,并清除对应的中断标志位
这种方法也叫对中断的“软”复位,其步骤是:
1. 禁止全局中断(INTM = 1).
2. 置位EALLOW位
3. 暂时修改PIE向量表指向一个空的中断服务子程序,这个程序只执行一个返回操作(这个方法上次提到了)。此方法的有点在于可以安全修改单独的PIEIFRx.y位,而不影响组内的其它中断。
4. 清除外设寄存器中的中断使能位。
5. 使能全局中断(INTM = 0)。
6. 等待所暂时设置的空ISR响应中断事件。
7. 禁止全局中断(INTM = 1).
8. 将PIE中断向量表恢复默认状态。
9. 清除EALLOW位。
10. 禁止外设中断对应的PIEIER位。
11. 清除外设中断对应的IFR位。
Ps:这里也可以看出,与外设有关的IER,IFR这些位前面都带有外设或者PIE这样的前缀,而与CPU直接相关的寄存器命名则直接、简单。
12. 清除PIE组的中断应答位PIEACK。
13. 使能全局中断。