STM32中断的一些概念(主要是外部中断)
扫描二维码
随时随地手机看文章
主要参考: startup_stm32f10x_hd.s, stm32f10x_exti.h, stm32f10x_exti.c,另外,这里说的外部中断是相对于M3内核之外的,主要是外设中断如:如I/O口相应的外接设备中断,USART、Timer等其它本身固件中断。
对于 cortex_m3 内核所支持的 240 个外部中断,这里使用了“中断通道”这个概念,因为尽管每个中断对应一个外围设备,但该外围设备通常具备若干个可以引起中断的中断源或中断事件。而该设备的所有的中断都只能通过该指定的“中断通道”向内核申请中断。因此,关于中断优先级的概念都是针对“中断通道”的。当该中断通道的优先级确定后,也就确定了该外围设备的中断优先级,并且该设备所能产生的所有类型的中断,都享有相同的通道中断优先级。至于该设备本身产生的多个中断的执行顺序,则取决于用户的中断服务程序。 STM32 可以支持的 68 个外部中断通道,已经固定的分配给相应的外部设备。每个中断通道都具备自己的中断优先级控制字节 PRI_n(8 位,但在 STM32 中只使用 4 位,高 4 位有效) , 每 4 个通道的 8 位中断优先级控制字 (PRI_n) 构成一个 32 位的优先级寄存器 (PriorityRegister) 。68 个通道的优先级控制字至少构成 17 个 32 位的优先级寄存器,它们是 NVIC寄存器中的一个重要部分(具体参考本组:嵌套的向量式中断控制器(NVIC))。 比如: 如果在你的系统中使用了 TIME2(中断通道 28)和 EXTI0(中断通道 6)两个中断,而TIME2 中断必须优先响应,而且当系统在执行 EXIT0 中断服务时也必须打断(抢先、嵌套) ,就必须设置 TIME2 的抢先优先级比 EXTI0 的抢先优先级要高(数目小) 。假定 EXTI0 为 2 号抢先优先级,那么 TIME2 就必须设置成 0 或 1 号抢先优先级。这些工作需要在 AIRC 中的PRIGROUP 设置完成,确定了整个系统所具有的优先级个数后,再分别对每个中断通道(设备)进行设置。 这些中断优先级的确定和嵌套规则,在ARM cortex_m3(STM32)有规定: 只能高抢先优先级的中断可以打断低抢先优先级的中断服务,构成中断嵌套。 当 2(n)个相同抢先优先级的中断出现,它们之间不能构成中断嵌套,但 STM32 首先响应子优先级高的中断。 当 2(n)个相同抢先优先级和相同子优先级的中断出现,STM32 首先响应中断通道所对应的中断向量地址低的那个中断(当多个中断出现后,则看它们的中断向量地址:地址越低,中断级别越高,STM32优先响应) 。 0 号抢先优先级的中断,可以打断任何中断抢先优先级为非 0 号的中断;1 号抢先优先级的中断,可以打断任何中断抢先优先级为 2、3、4 号的中断;……;构成中断嵌套。 如果两个中断的抢先优先级相同,谁先出现,就先响应谁,不构成嵌套。如果一起出现(或挂在那里等待) ,就看它们 2 个谁的子优先级高了,如果子优先级也相同,就看它们的中断向量位置了。 再比如: 上电 Reset 后,寄存器 AIRC 中 PRIGROUP[10:8]的值为 0(编号 0) ,因此此时系统使用 16 个抢先优先级,无子优先级。另外由于所有外部中断通道的优先级控制字 PRI_n 也都是 0,所以根据上面的定义可以得出,此时 68 个外部中断通道的抢先优先级都是 0 号,没有子优先级的区分。 故此时不会发生任何的中断嵌套行为, 谁也不能打断当前正在执行的中断服务。当多个中断出现后,则看它们的中断向量地址:地址越低,中断级别越高,STM32优先响应(可在启动文件里查找)。 PS: 此时内部中断的抢先优先级也都是 0 号, 由于它们的中断向量地址比外部中断向量地址都低, 所以它们的优先级比外部中断通道高, 但如果此时正在执行一个外部中断服务,它们也必须排队等待,只是可以插队,当正在执行的中断完成后,它们可以优先得到执行。