STM32中断优先级的理解与使用(小白入门加深学习)


一、中断的分类:

   全局中断就是在运行程序的任何一部分都可以立即执行中断服务,如果是在程序的中断才添加开放中断指令就是说有条件满足中断的时候,也只能在执行允许中断的指令后才执行中断服务。

  外部中断是可以屏蔽的中断,也就是说,利用中断控制器可以屏蔽这些外部设备 的中断请求。
  内部中断是指因硬件出错(如突然掉电、奇偶校验错等)或运算出错(除数为零、运算 溢出、单步中断等)所引起的中断。

STM32F10的每个IO口都可以设为外部中断,最多可设19个,16+3=19

在设计硬件的时候要注意,不要将外部中断连接到PA[1]、PB1]、PC[1]等,这样的话处理器只能选择一个作为中断源。

另外: 

        EXTI线16连接到PVD输出

        EXTI线17连接到RTC闹钟事件

        EXTI线18连接到USB唤醒事件

        EXTI线19连接到以太网唤醒事件


二、中断优先级

关于中断源的中断优先级关系,可以归纳为下面两条基本原则:

(1)低优先可被高优先级中断,高优先级不能被低优先级中断。

(2)任何一种中断(不管是高级还是低级)一旦得到响应,不会再被它同等级的中断源所中断

STM32中把中断是按组别来配置优先级的,每个中断优先级组别包括有: 抢断式优先级、响应式优先级其中前者是对抢占优先级的级别划分,后者是相同抢占优先级的优先级别的划分。
比如:
中断A抢占优先级比B高,那么A的中断可以在B里面触发,忽略响应优先级;
A和B抢占优先级相同,则A、B的响应优先级决定谁先响应;


我们先来看ST公司的一张图:


              按照NVIC_PriorityGroup_0这么分,就分为了1个抢占(优先)级,每个抢占(优先)级下只有16个副优先级:0-15

              按照NVIC_PriorityGroup_1这么分,就分为了2个抢占(优先)级,每个抢占(优先)级下只有8个副优先级:0-7;

              按照NVIC_PriorityGroup_2这么分,就分为了4个抢占(优先)级,每个抢占(优先)级下只有4个副优先级:0-3;

              按照NVIC_PriorityGroup_3这么分,就分为了8个抢占(优先)级,每个抢占(优先)级下只有2个副优先级:0-1;

                  按照NVIC_PriorityGroup_4这么分,就分为了16个抢占(优先)级,每个抢占(优先)级下只有1个副优先级:0;

结合相关程序来学习一下

        /* Enable the USART1 Interrupt */配置串口中断的驱动部分
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;   
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢断式优先级为0,
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; 同抢断式优先级下的响应式优先级不能互相打断
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
        NVIC_Init(&NVIC_InitStructure); 

       

  1. /* SPI1-------------------------------------------------------------------- */  
  2.     NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;  
  3.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  4.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  
  5.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  6.     NVIC_Init(&NVIC_InitStructure); 
       EXTI0_IRQChannel  是0级组>  SPI的3级组 高优先级组的人,可以打断低阶级的正在做事的人(嵌套),所以当SPI正在工作时,  EXTI0 可以打断他进入  EXTI0中断;

在库文件misc.h当中可以看到每个中断优先级的配置

同时利用两个串口工作时,不想被互相打断的话,可以把它们的抢占式优先级设为相同,它们之间就不互相影响了,别的亦是同理。


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