MCU中断嵌套总结--51,STM32,DSP,ARM
接触了很多MCU,包括51,STM32,DSP,ARM。每个MCU的中断都讲的很好,例程也很多,但是关于中断嵌套这块,都是讲的比较模糊(估计有风险,程序设计最好不好中断嵌套)。以下是自己总结的内容,属于自己的理解,比较浅显,也有错误。
中断优先级:没有高优先级可以打断低优先级中断的说法。
优先级只是同时发生多个中断时,中断控制器选择高优先级的中断让CPU执行。
一、51单片机
51单片机只有二级嵌套中断优先级。
1、默认中断优先级(逻辑优先级)为:
外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断;
IP寄存器不做任何设置时,即IP=0x0; 不能发生嵌套中断
2、IP寄存器设置了某一位(物理优先级),比如:PS (IP.4):串行口中断优先
串口中断可以打断其他中断服务函数,实现嵌套(using 用户组不能相同),其他中断还是保持默认中断。
IP寄存器只能设置一位,即设了IP.4,其他IP.n不能再设
二、STM32
STM32中的NVIC详解 https://blog.csdn.net/liuqi3256797/article/details/89891621 总结的不错。
NVIC优先级分组0-4五种, AIRC寄存器高四位[7:4]设置抢占优先级和子优先级。
1、中断同时到来情况
1.N个抢占优先级不同的中断同时到来,那么高抢占优先级的中断优先被响应。
2.抢占优先级相同的 N个子优先级(或叫响应优先级)不同的中断同时到来,那么高子优先级的中断优先被响应。
2、中断嵌套情况(打断中断)
1.高抢占式优先级的中断可以打断低抢占式优先级的中断服务程序,实现中断嵌套。
2.抢占优先级相同的情况下,子优先级高的中断不能打断低的中断服务程序,即子优先级不支持中断嵌套。
另外:Reset、NMI、Hard Fault 优先级为负数,高于普通中断优先级,且优先级不可配置。
三、DSP
DSP在硬件上没直接支持中断嵌套,但软件可实现嵌套。
对于正在处理当中的中断,如果不做软件上的特殊处理,是不能被别的中断打断的,除了NMI中断。
(DSP进入中断服务程序后默认关闭所有中断(外设级/PIE级/CPU级/全局中断))
1、如果需要中断嵌套,必须重新打开所有中断,否则无法实现嵌套功能。
比如dsp28335 想外部中断嵌套打断定时器中断,那就需要在定时器中断服务程序中重新打开外部中断
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能外设级中断
IER |= M_INT1; // 使能CPU级中断
EINT; // 使能全局中断
ERTM; //----- 使能 实时中断
2、还有一个问题需不需要自己保存中断现场
https://e2echina.ti.com/question_answer/dsp_arm/omap_l1x/f/54/t/127304
https://e2echina.ti.com/question_answer/microcontrollers/c2000/f/56/t/136669
第一个链接dsp6748的例子是加了自己保存中断现场的,第二个dsp28335没有加,此问题还需验证。
目前看到的是dsp28335跟dsp6748两款,另接触的28027,6713,omap138,AM5718类似。
四、ARM
韦东山老师已经写的很好,https://blog.csdn.net/thisway_diy/article/details/78056764
结论: IRQ模式只能被FIQ模式打断,FIQ模式下谁也打不断。