Cortex-M3中断行为

Cortex-M3中断行为

一、中断行为过程:

1、主程序运行中;
2、发起中断;
3、中断/异常的响应序列 ;
4、执行中断服务例程;
5、异常返回;
6、返回主程序运行中;

二、触发中断的方法:

1、外部中断输入。
2.、设置NVIC的悬起寄存器中设置相关的位。
如果中断发生时,正在处理同级或高优先级异常,或者被掩蔽,则中断不能立即得到响应。此时中断被悬起。中断的悬起状态可以通过“中断设置悬起寄存器(SETPEND)”和“中断悬起清除寄存器(CLRPEND)”来读取,还可以写它们来手工悬起中断。
CM3 中可以有 240 对悬起位/解悬位,每个中断拥有一对。这 240 个对子分布在 8 对 32 位寄存器中(最后一对没有用完)。欲悬起一个中断,你需要写 1 到对应 SETENA 的位中;欲解悬一个中断,你需要写 1 到对应的 CLRENA 位中;如果往它们中写 0,不会有任何效果。
在这里插入图片描述
3、使用NVIC的软件触发中断寄存器(STIR)。

三、中断/异常的响应序列

当CM3开始响应一个中断时,硬件就会自动执行入栈、取向量和更新寄存器操作。

入栈:

响应异常的第一个行动,就是自动保存现场:依次把xPSR, PC, LR, R12以及R3‐R0由硬件自动压入适当的堆栈中:如果当响应异常时,当前的代码正在使用PSP,则压入PSP,即使用线程堆栈;否则压入MSP,使用主堆栈。
在这里插入图片描述

取向量:

当数据总线(系统总线)正在为入栈操作而忙得团团转时,指令总线(I‐Code总线)同时从向量表中找出正确的异常向量,然后在服务程序的入口处预取指。

更新寄存器:

在入栈和取向量的工作都完毕之后,执行服务例程之前,还要更新一系列的寄存器:
SP:若主程序中用的是PSP,SP则切换为MSP。在LR寄存器的bit2会记录主程序用的是MSP还是PSP(在reset复位后默认使用MSP)。
PSR:IPSR位段(地处PSR的最低部分)会被更新为新响应的异常编号。
在这里插入图片描述

PC:在向量取出完毕后,PC将指向服务例程的入口地址。
LR:LR的用法将被重新解释,其值也被更新成一种特殊的值,称为“EXC_RETURN”,并且在异常返回时使用。EXC_RETURN的二进制值除了最低4位外全为1,而其最低4位则有另外的含义。
在这里插入图片描述

中断/异常的响应序列执行完成后,就会开始执行中断服务例程第一句代码。

四、异常返回

在CM3中,是通过把EXC_RETURN往PC里写来识别返回动作的。因此,可以使用如下的三种常规返回指令:
在这里插入图片描述
在启动了中断返回序列后,下述的处理就将进行:

  1. 根据LR寄存器EXC_RETURN位段的值,来确认返回后的状态:在CM3中bit0必须为1;如果bit2=0返回后使用MSP,如果bit2=1返回后使用PSP,这个位可以在中断服务程序中修改;如果bit3=1表示此中断抢占了另一个中断,如果bit3=0表示此中断在主程序执行过程中产生。
    在这里插入图片描述

  2. 出栈:先前压入栈中的寄存器在这里恢复,内部的出栈顺序与入栈时的相对应。

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

本文参考:《CM3权威指南》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值