首页 理论教育 STM系列单片机异常退出步骤简明指南

STM系列单片机异常退出步骤简明指南

时间:2023-11-23 理论教育 版权反馈
【摘要】:当异常服务例程执行完毕后,需要执行异常退出步骤,从而恢复先前的系统状态,才能使被中断的程序得以继续执行。但是在Cortex-M3中,是通过把EXC_RETURN往PC里写来识别返回动作的。当异常服务例程把这个值送往PC时,就会启动处理器的中断返回序列。表3.17EXC_RETURN位段详解续表由表3.17可以得出,合法的EXC_RETURN值共3个,见表3.18。图3.41LR的值在异常期间被设置为EXC_RETURN如果主程序在处理者模式下运行,则在服务例程中LR=0xFFFF_FFF1。

STM系列单片机异常退出步骤简明指南

当异常服务例程执行完毕后,需要执行异常退出步骤,从而恢复先前的系统状态,才能使被中断的程序得以继续执行。从形式上看,有3种途径可以触发异常返回序列,见表3.16,不管使用哪一种,都需要用到先前储的LR的值。

表3.16 触发中断返回的指令

有些处理器使用特殊的返回指令来标示中断返回,例如8051就使用RETI。但是在Cortex-M3中,是通过把EXC_RETURN往PC里写来识别返回动作的。因此,可以使用上述的常规返回指令,从而为使用C语言编写服务例程扫清了最后的障碍(无需特殊的编译器命令,如_interrupt)。

在启动了中断返回序列后,下述的处理就将进行:

①出栈:先前压入栈中的寄存器在这里恢复。内部的出栈顺序与入栈时的相对应,堆栈指针的值也改回去。

②更新NVIC寄存器:伴随着异常的返回,它的活动位也被硬件清除。对于外部中断,倘若中断输入再次被置为有效,悬起位也将再次置位,新一次的中断响应序列也可随之再次开始。

前面提到在进入异常服务程序后,LR的值被自动更新为特殊的EXC_RETURN,这是一个高28位全为1的值,只有[3:0]的值有特殊含义,见表3.17。当异常服务例程把这个值送往PC时,就会启动处理器的中断返回序列。因为LR的值是由Cortex-M3自动设置的,所以只要没有特殊需求就不要改动它。

表3.17 EXC_RETURN位段详解

续表

由表3.17可以得出,合法的EXC_RETURN值共3个,见表3.18。(www.xing528.com)

表3.18 合法的EXC_RETURN值及其功能

如果主程序在线程模式下运行,并且在使用MSP时被中断,则在服务例程中LR=0xFFFF_FFF9(主程序被打断前的LR已被自动入栈)。

如果主程序在线程模式下运行,并且在使用PSP时被中断,则在服务例程中LR=0xFFFF_FFFD(主程序被打断前的LR已被自动入栈)。

LR的值在异常期间被设置为EXC_RETURN(线程模式使用主堆栈)如图3.41所示。

图3.41 LR的值在异常期间被设置为EXC_RETURN(线程模式使用主堆栈)

如果主程序在处理者模式下运行,则在服务例程中LR=0xFFFF_FFF1(主程序被打断前的LR已被自动入栈)。这时的“主程序”,其实更可能是被抢占的服务例程,也就是中断/异常嵌套。事实上,在嵌套时,更深层ISR所看到的LR总是0xFFFF_FFF1,如图3.42所示。

图3.42 LR的值在异常期间被设置为EXC_RETURN(线程模式使用进程堆栈)

由EXC_RETURN的格式可见,不能把0xFFFF_FFF0~0xFFFF_FFFF中的地址作为任何返回地址。但也不用担心会弄错,因为Cortex-M3已经把这个范围标记成“不可取指区”了。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈