进来讨论一下,NVIC寄存器组中的中断挂起SETPEND与消除CLRPEND,与外部中断挂起寄存器EXTI_PR有何关系?

2019-07-21 04:17发布

本帖最后由 warship 于 2018-7-27 19:32 编辑

如题,讨论一下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
34条回答
warship
2019-07-21 17:57
本帖最后由 warship 于 2018-7-28 12:06 编辑

其实虽说NVIC强大,但也可以说傻得可以,它其实根本不知道中断的具体来头,只须照章办事。
来了IRQ后,根据IRQn编号值去查相应的控制位(或寄存器),严格走下述流程:
1、首先是看该IRQ是否使能,只有使能位为1,才能受理申请,如果是禁能状态,则直接无视;
2、然后查看优先级寄存器IP[IRQn],该IRQ的优先级;
3、再通过查看ACTIVE可知,目前处于活动状态的所有中断;
4、如果有正在活动状态的中断(即正在服务中),则进行中断优先级比较。如果活动的中断优先级高,则先挂起这个IRQ。
    反复此步,直到没有更高优先级的中断需要服务;
5、轮到这个IRQ享受服务(由编号查向量表进入对应的中断服务程序,服务开始后置位它对应的中断活动状态位),解挂。


第5步里,就是NVIC对挂起和解挂的操作,这算是CM3内核的硬件自动完成的。
但它也允许软件来手动干预,手动挂起相当于来一次软件IRQ申请,手动解挂相当于软件撤消IRQ申请。

一周热门 更多>