STM32中断一些概念(主要是外部中断与中断通道)

 

 

主要参考:

startup_stm32f10x_hd.s, stm32f10x_exti.h, stm32f10x_exti.c,另外,这里说的外部中断是相对于M3内核之外的,主要是外设中断如:如I/O口相应的外接设备中断,USART、Timer等其它本身固件中断。


      对于 cortex_m3 内核所支持的 240 个外部中断[__IO uint8_t  IP[240];],这里使用了“中断通道”这个概念,因为尽管每个中断对应一个外围设备,但该外围设备通常具备若干个可以引起中断的中断源或中断事件[外围设备与中断源的关系为1对N]。而该设备的所有的中断都只能通过该指定的“中断通道”向内核申请中断。因此,关于中断优先级的概念都是针对“中断通道”的。当该中断通道的优先级确定后,也就确定了该外围设备的中断优先级,并且该设备所能产生的所有类型的中断,都享有相同的通道中断优先级。至于该设备本身产生的多个中断的执行顺序,则取决于用户的中断服务程序。

 

        STM32 可以支持的 68 个外部中断通道[typedef enum IRQn{...};],已经固定的分配给相应的外部设备。每个中断通道都具备自己的中断优先级控制字节 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优先响应(可在启动文件里查找)。

void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
  /* Check the parameters */
  assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
  
  /* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
  SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}

STM32F10xxx Cortex-M3编程手册里的图片,结合起来,上面的内容就好理解了。

STM32中断一些概念(主要是外部中断与中断通道)_第1张图片

 

 

PS: 此时内部中断的抢先优先级也都是 0 号, 由于它们的中断向量地址比外部中断向量地址都低, 所以它们的优先级比外部中断通道高, 但如果此时正在执行一个外部中断服务,它们也必须排队等待,只是可以插队,当正在执行的中断完成后,它们可以优先得到执行。

附注:

typedef struct
{
  __IO uint32_t ISER[8];                      /*!< Offset: 0x000  Interrupt Set Enable Register           */
       uint32_t RESERVED0[24];                                   
  __IO uint32_t ICER[8];                      /*!< Offset: 0x080  Interrupt Clear Enable Register         */
       uint32_t RSERVED1[24];                                    
  __IO uint32_t ISPR[8];                      /*!< Offset: 0x100  Interrupt Set Pending Register          */
       uint32_t RESERVED2[24];                                   
  __IO uint32_t ICPR[8];                      /*!< Offset: 0x180  Interrupt Clear Pending Register        */
       uint32_t RESERVED3[24];                                   
  __IO uint32_t IABR[8];                      /*!< Offset: 0x200  Interrupt Active bit Register           */
       uint32_t RESERVED4[56];                                   
  __IO uint8_t  IP[240];                      /*!< Offset: 0x300  Interrupt Priority Register (8Bit wide) */
       uint32_t RESERVED5[644];                                  
  __O  uint32_t STIR;                         /*!< Offset: 0xE00  Software Trigger Interrupt Register     */
}  NVIC_Type; 

 

 

你可能感兴趣的:(嵌入式)