中断管理 管理中断所使用的大部分寄存器都位于NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)和SCB(System Control Block,系统控制块)中。实际上,SCB是作为NVIC的一部分来实现的,不过在CMSIS-Core中,将其定义在了独立的结构体中。除此之外,处理器内核中还有用于中断屏蔽寄存器:PRIMASK、FAULTMASK、BASEPRI。
NVIC和SCB位于系统控制空间,地址从0xE000E00开始,大小4KB。SCB中还有SysTick定时器,存储器保护单元等。
优先级这部分暂且不说!
中断输入和挂起在Cortex-M内核中,每个中断都具有多个属性:
- 每个中断都可以被禁止(默认)或者使能
- 每个中断都可以别挂起或者解除挂起
- 每个中断都可以处于活跃或者非活跃
这些状态属性具有多种可能的组合。例如,在处理中断时,可以将其禁止,若在中断提出掐产生了同一个中断的新请求,由于该活跃中断被禁止了,那就会处于挂起状态。
NVIC在设计上既支持产生
脉冲中断请求 的外设,也支持产生
高电平中断请求 的外设。无需配置任何一个 NVIC 寄存器以选择其中一种中断类型。
对于脉冲中断请求,脉冲宽度至少要为一个时钟周期;而对于电平触发的请求,在ISR中的操作清湖请求之前,请求服务的外设要一直保持电平信号(如写入寄存器以清除中断请求) 。
尽管外部中断请求在 I/O 引脚上的电平可能是低电平有效,但是 NVIC 收到的额请求信号为高有效!
中断的挂起状态被存储在 NVIC 的可编程寄存器中,当 NVIC 的中断输入被确认后,它就会引发该中断的挂状态。即便中断请求被取消,挂起状态仍会为高。这样,NVIC 就可以处理脉冲中断请求了。
挂起状态的意思是,中断被置于一种等待处理器处理的状态。有些情况下,处理器在中断挂起时就会进行处理。不过,若处理器已经在处理另外一个更高或同优先级的中断,或者中断被某个中断屏蔽寄存器给屏蔽掉了,那么在其他的中观处理结束前或者中断屏蔽被清除前,挂起请求会一直保持。
当中断开始处理中断请求时,中断的请求信号会被自动清除。当中断正在被处理时,它就会处于活跃状态。
当中断处于活跃状态时,处理器无法再中断完成和异常返回前再次处理同一个中断请求。
中断的挂起状态位于中断挂起状态寄存器中,软件可以方位这些寄存器。因此,可以手动清除或者设置中断的挂起状态。若中断请求产生时处理器正在处理另一个具有更高优先级的中断,而在处理器对该中断请求做出响应之前,挂起状态被清除掉了,则该中断会被取消且不会再得到处理。
若持续保持某个中断请求,那么及时软件尝试清除该挂起状态,挂起状态还是会再次被置位的。
若中断已经得到了处理,中断源仍然在继续保持中断请求,那么这个中断就会再一次进入挂起状态且再次得到处理
对于脉冲中断请求,若在处理器开始处理前,中断请求信号产生了多次,他们会被当做一次中断请求处理
中断挂起状态可以在其正在被处理时再次置位。之前的中断请求正在被处理时产生了新的请求,这样机会引发新的挂起状态。处理器在前一个ISR结束后需要再次处理这个中断。
即使中断被禁止了,他的挂起状态仍然可置位。 这种情况下,若中断稍后被使能了,它仍然可以被触发并被得到处理。这种情况可能不是我们需要的,因此需要在使能NVIC中断前手动清除挂起状态。