精华内容
下载资源
问答
  • 要求实现如下功能:(1)初始状态下:按亮(显示8),灭(不显示)闪烁。 (2)单击K1:标识“低优先级”的数码管依次...若在“低优先级”的数码管未显示完回到结束符按下K2则会被打断,先进入“高优先级”的数码管显示
  • 实现控制控制分别由特殊功能寄存器区中的中断允许寄存器IE和中断优先级寄存器IP来实现的。下面介绍这两个特殊功能寄存器。 中断允许寄存器IE 的CPU对各中断源的开放或屏蔽,是由片内的中断允许寄存器IE控制的。...
  • 说最基本的,老的51单片机(80C51系列)有5个中断源,2个优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经有4个优先级(或更多)和更多的中断源了。
  • 中断优先级

    千次阅读 2019-05-12 16:57:34
    中断优先级 文章参考:https://blog.csdn.net/huangtonggao/article/details/6441876 结论: 1)抢占优先级越小,优先级越高;相同抢占优先级的中断不能嵌套; 2)相同抢占优先级N个中断发生时,响应优先级越小的...

    中断优先级

    文章参考:https://blog.csdn.net/huangtonggao/article/details/6441876

    结论:
    1)抢占优先级越小,优先级越高;相同抢占优先级的中断不能嵌套;
    2)相同抢占优先级N个中断发生时,响应优先级越小的中断首先执行(不能嵌套),如果响应优先级也均相同,则根据各中断对应向量表的位置来确定,向量表中越靠前的中断先响应。

    STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作’亚优先级’或’副优先级’,每个中断源都需要被指定这两种优先级。

    具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。

    当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

    既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:

    所有8位用于指定响应优先级
    最高1位用于指定抢占式优先级,最低7位用于指定响应优先级
    最高2位用于指定抢占式优先级,最低6位用于指定响应优先级
    最高3位用于指定抢占式优先级,最低5位用于指定响应优先级
    最高4位用于指定抢占式优先级,最低4位用于指定响应优先级
    最高5位用于指定抢占式优先级,最低3位用于指定响应优先级
    最高6位用于指定抢占式优先级,最低2位用于指定响应优先级
    最高7位用于指定抢占式优先级,最低1位用于指定响应优先级

    这就是优先级分组的概念。

    **Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
    第0组:所有4位用于指定响应优先级

    第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
    第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
    第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
    第4组:所有4位用于指定抢占式优先级
    

    可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:

    NVIC_PriorityGroup_0 => 选择第0组
    NVIC_PriorityGroup_1 => 选择第1组
    NVIC_PriorityGroup_2 => 选择第2组
    NVIC_PriorityGroup_3 => 选择第3组
    NVIC_PriorityGroup_4 => 选择第4组
    

    接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:

    // 选择使用优先级分组第1组
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
    // 使能EXTI0中断
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    // 使能EXTI9_5中断
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);**
    

    要注意的几点是:

    1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;

    2)抢占式优先级别相同的中断源之间没有嵌套关系;

    3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。

    下面是一个牛人的理解:

    绕来绕去终于大概明白了。

    STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下

    /* Preemption Priority Group -------------------------------------------------*/
    #define NVIC_PriorityGroup_0          ((u32)0x700) /* 0 bits for pre-emption priority
                                                          4 bits for subpriority */
    #define NVIC_PriorityGroup_1          ((u32)0x600) /* 1 bits for pre-emption priority
                                                          3 bits for subpriority */
    #define NVIC_PriorityGroup_2          ((u32)0x500) /* 2 bits for pre-emption priority
                                                          2 bits for subpriority */
    #define NVIC_PriorityGroup_3          ((u32)0x400) /* 3 bits for pre-emption priority
                                                          1 bits for subpriority */
    #define NVIC_PriorityGroup_4          ((u32)0x300) /* 4 bits for pre-emption priority
                                                          0 bits for subpriority */
    

    形象化的理解是:

    你是上帝,
    造了43个人,这么多人要分社会阶级和社会阶层了;
    因为“阶级”的词性比较重;"阶层"比较中性,
    所以preemption优先级->阶级;每个阶级内部,有一些阶层,sub优先级->阶层;

    如果按照NVIC_PriorityGroup_4这么分,就分为了16个阶级(1个阶层就是1个preemption优先级),0个阶层;高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和15级嵌套。
    每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级8”,则

    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8; // 指定抢占式优先级别,可取0-15
    

    另外,在同一阶级内部,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)
    还有,如果他们两个同时想做事,因为没有阶层,那么就根据Vector table中的物理排序,让排名靠前的人去做;

    又有1个人SPI1_IRQChannel,设定如下
    NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别,可取0-15

    SPI1_IRQChannel的阶级高,EXTI0_IRQChannel做事的时候可以打断(嵌套)。

    如果按照NVIC_PriorityGroup_3这么分,就分为了8个阶级(1个阶级是1个preemption优先级),每个阶级内有2个阶层(sub优先级);高阶级的人,可以打断低阶级的正在做事的人(嵌套),最多可以完成1个中断和7级嵌套。

    每个阶级(每个preemption优先级),你来指定这43人中,谁进入该阶级;一个人叫EXTI0_IRQChannel,你指定他进入“阶级3”,则:
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别,可取0-7
    还需要指定他的阶层:
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别,可取0-1

    另有1个人叫EXTI9_5_IRQChannel,他的阶级和阶层设定如下
    NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; // 指定抢占式优先级别,可取0-7
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别

    那么这两个人是同一阶级的兄弟,一个人在做事的时候,另外一个人不能打断他;(preemption优先级别相同的中断源之间没有嵌套关系)
    如果他们两个同时想做事,因为前者的阶层高,所以前者优先。

    还有一个人叫USART1_IRQChannel,他的阶级和阶层设定如下
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; // 指定抢占式优先级别,可取0-7
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别

    USART1_IRQChannel的优先级最高,当前面两个人做事的时候,他都可以打断(嵌套)。

    其他的类推。

    展开全文
  • 包含五个中断源,两级中断优先级,优先级可编程设置,通过IP进行设置:  51单片机中断优先级的设置方法解析  PX0(IP.0),外部中断0优先级设定位;  PT0(IP.1),定时/计数器T0优先级设定位;...
  • STM32 中断优先级

    2020-02-13 20:33:37
    1.ARM cortex_m3 内核支持 256 个中断(16 个内核+240 外部)和可编程 256 级中断优先级 的设置,与其相关的中断控制和中断优先级控制寄存器(NVIC、SYSTICK 等)也都属于 cortex_m3 内核的部分。STM32 采用了 ...

    1.ARM cortex_m3 内核支持 256 个中断(16 个内核+240 外部)和可编程 256 级中断优先级 的设置,与其相关的中断控制和中断优先级控制寄存器(NVIC、SYSTICK 等)也都属于 cortex_m3 内核的部分。STM32 采用了 cortex_m3 内核,所以这部分仍旧保留使用,但 STM32 并没有使用 cortex_m3 内核全部的东西(如内存保护单元 MPU 等),因此它的 NVIC 是 cortex_m3 内核的 NVIC 的子集。 
     
    2.STM32 目前支持的中断共为 84 个(16 个内核+68 个外部),和 16 级可编程中断优先级 的设置(仅使用中断优先级设置 8bit 中的高 4 位,见后面解释)。《参考最新 101xx-107xx STM32 Reference manual, RM0008》。 
     
    3.以下主要对“外部中断通道”进行说明。 对于 cortex_m3 内核所支持的 240 个外部中断,我在这里使用了“中断通道”这个概 念,因为尽管每个中断对应一个外围设备,但该外围设备通常具备若干个可以引起中断的 中断源或中断事件。而该设备的所有的中断都只能通过该指定的“中断通道”向内核申请 中断。因此,下面关于中断优先级的概念都是针对“中断通道”的。当该中断通道的优先 级确定后,也就确定了该外围设备的中断优先级,并且该设备所能产生的所有类型的中断, 都享有相同的通道中断优先级。至于该设备本身产生的多个中断的执行顺序,则取决于用 户的中断服务程序。 
     
    4. STM32 可以支持的 68 个外部中断通道,已经固定的分配给相应的外部设备。每个中断 通道都具备自己的中断优先级控制字节 PRI_n(8 位,但在 STM32 中只使用 4 位,高 4 位有 效),每 4 个通道的 8 位中断优先级控制字(PRI_n)构成一个 32 位的优先级寄存器(Priority Register)。68 个通道的优先级控制字至少构成 17 个 32 位的优先级寄存器,它们是 NVIC 寄存器中的一个重要部分。 
     
    5.对于这 4bit 的中断优先级控制位还必须分成 2 组看:从高位开始,前面是定义抢先式优 先级的位,后面用于定义子优先级。4bit 的分组组合可以有以下几种形式: 
     
     
    6.在一个系统中,通常只使用上面 5 种分配情况的一种,具体采用哪一种,需要在初始化 时写入到一个 32 位寄存器 AIRC(Application Interrupt and Reset Control Register)
    的第[10:8]这 3 个位中。这 3 个 bit 位有专门的称呼:PRIGROUP(具体写操作后面介绍)。 比如你将 0x05(即上表中的编号)写到 AIRC 的[10:8]中,那么也就规定了你的系统中只 有 4 个抢先式优先级,相同的抢先式优先级下还可以有 4 个不同级别的子优先级。 
     
    7.AIRC 中 PRIGROUP 的值规定了设置和确定每个外部中断通道优先级的格式。例如,在上 面将 0x05 写入了 AIRC 中 PRIGROUP,也就规定了当前系统中只能有 4 个抢先式优先级,相 同的抢先式优先级下还可以有 4 个不同级别的子优先级,他们分别为: 
     

     
    8.如果在你的系统中使用了 TIME2(中断通道 28)和 EXTI0(中断通道 6)两个中断,而 TIME2 中断必须优先响应,而且当系统在执行 EXIT0 中断服务时也必须打断(抢先、嵌套), 就必须设置 TIME2 的抢先优先级比 EXTI0 的抢先优先级要高(数目小)。假定 EXTI0 为 2 号 抢先优先级,那么 TIME2 就必须设置成 0 或 1 号抢先优先级。这些工作需要在 AIRC 中的 PRIGROUP 设置完成,确定了整个系统所具有的优先级个数后,再分别对每个中断通道(设 备)进行设置。 
     
    9.具体优先级的确定和嵌套规则。ARM cortex_m3(STM32)规定

    a/ 只能高抢先优先级的中断可以打断低抢先优先级的中断服务,构成中断嵌套。

    b/ 当 2(n)个相同抢先优先级的中断出现,它们之间不能构成中断嵌套,但 STM32 首 先响应子优先级高的中断。

    c/ 当 2(n)个相同抢先优先级和相同子优先级的中断出现,STM32 首先响应中断通道 所对应的中断向量地址低的那个中断(见 ROM0008,表 52)。

    具体一点:

    0 号抢先优先级的中断,可以打断任何中断抢先优先级为非 0 号的中断;1 号抢先优先 级的中断,可以打断任何中断抢先优先级为 2、3、4 号的中断;……;构成中断嵌套。

    如果两个中断的抢先优先级相同,谁先出现,就先响应谁,不构成嵌套。如果一起出 现(或挂在那里等待),就看它们 2 个谁的子优先级高了,如果子优先级也相同,就看它们 的中断向量位置了。 
     
    10.上电 Reset 后,寄存器 AIRC 中 PRIGROUP[10:8]的值为 0(编号 0),因此此时系统使 用 16 个抢先优先级,无子优先级。另外由于所有外部中断通道的优先级控制字 PRI_n 也都 是 0,所以根据上面的定义可以得出,此时 68 个外部中断通道的抢先优先级都是 0 号,没 有子优先级的区分。故此时不会发生任何的中断嵌套行为,谁也不能打断当前正在执行的中 断服务。当多个中断出现后,则看它们的中断向量地址:地址越低,中断级别越高,STM32 优先响应。 注意:此时内部中断的抢先优先级也都是 0 号,由于它们的中断向量地址比外部中断向 量地址都低,所以它们的优先级比外部中断通道高,但如果此时正在执行一个外部中断服务, 它们也必须排队等待,只是可以插队,当正在执行的中断完成后,它们可以优先得到执行。 
     
    了解以上基本概念还是不够的,还要了解具体中断的控制有那些途径,中断服务程序 如何正确的编写。下面的描述主要以 TIME2 通道为例。 
     
    中断控制 
     
    1.对于 STM32 讲,外部中断通道位置 28(35 号优先级)是给外部设备 TIME2 的,但 TIME2 本身能够引起中断的中断源或事件有好多个,比如更新事件(上溢/下溢)、输入捕获、输出 匹配、DMA 申请等。所有 TIME2 的中断事件都是通过一个 TIME2 的中断通道向 STM32 内核提 出中断申请,那么 STM32 中如何处理和控制 TIME2 和它众多的、不同的、中断申请呢? 
     
    (题外话:STM32 中的一个通用定时计数器,就比 8 位控制器(如 AVR,MCS-51 就更不必说了)中 TIME
    要复杂多了。学过 AVR 的,可能对输入捕获、输出匹配等还有概念,但如果你学的标准架构的 MCS-51,那
    么上手 32 位可能困难就更多了。所以我一直推荐学习 8 位机应该认真的从 AVR 开始。尽管 51 有很大的市
    场,价格也相对便宜,但从长远的眼光看问题,从后续掌握 32 位的使用,考虑到学生的可持续发展,AVR
    应该是比较好的选择。) 
     
    2.cortex_m3 内核对于每一个外部中断通道都有相应的控制字和控制位,用于单独的和总 的控制该中断通道。它们包括有:

    •  中断优先级控制字:PRI_n(上面提到的)
    •  中断允许设置位:在 ISER 寄存器中
    •  中断允许清除位:在 ICER 寄存器中
    •  中断悬挂 Pending(排队等待)位置位:在 ISPR 寄存器中(类似于置中断通道标志位)
    •  中断悬挂 Pending(排队等待)位清除:在 ICPR 寄存器中(用于清除中断通道标志位)
    •  正在被服务(活动)的中断(Active)标志位:在 IABR 寄存器中,(只读,可以知道当 前内核正在处理哪个中断通道) 

     
    因此,与 TIME2 中断通道相关的,在 NVIC 中有 13 个 bits,它们是 PRI_28(IP[28]), 的 8 个 bits(只用高 4 位);加上中断通道允许,中断通道清除(相当禁止中断),中断通道 Pending 置位(我的理解是中断请求发生了,但当前有其它中断服务在执行,你的中断级别 又不能打断别人,所以 Pending 等待,这个应该由硬件自动置位的),中断 Pending 位清除 (可以通过软件将本次中断请求、且尚处在 Pending 状态,取消掉),正在被服务的中断 (Active)标志位,各 1 个 bit。 上面的控制字和控制位都是分布在 NVIC 的寄存器组中的,可惜在 STM32 手册中竟然不 给出任何的解释和说明。 
     
    3.作为外围设备 TIME2 本身也包括更具体的,管理自己不同中断的中断控制器(位),它们 主要是自身各个不同类型中断的允许控制位,和各自相应的中断标志位(这个在 STM32 的手 册中有详细的说明了)。 
     
    4.在弄清楚 2、3 两点的基础上,我们可以全程、全面和综合的来了解 TIME2 的中断过程, 以及如何控制的。 
     
    a/ 初始化过程 首先要设置寄存器 AIRC 中 PRIGROUP 的值,规定系统中的抢先优先级和子优先级的个数
    (在 4 个 bits 中占用的位数); 设置 TIME2 本身的寄存器,允许相应的中断,如允许 UIE(TIME2_DIER 的第[0]位) 设置 TIME2 中断通道的抢先优先级和子优先级(IP[28],在 NVIC 寄存器组中) 设置允许 TIME2 中断通道。在 NVIC 寄存器组的 ISER 寄存器中的一位。 
     
    b/ 中断响应过程 当 TIME2 的 UIE 条件成立(更新,上溢或下溢),硬件将 TIME2 本身寄存器中 UIE 中断 标志置位,然后通过 TIME2 中断通道向内核申请中断服务。 此时内核硬件将 TIME2 中断通道的 Pending 标志置位(相当与中断通道标志置位),表 示 TIME2 有中断申请。 如果当前有中断在处理,TIME2 的中断级别不够高,那么就保持 Pending 标志,当然用 户可以在软件中通过写 ICPR 寄存器中相应的位把本次中断清除掉。 当内核有空,开始响应 TIME2 的中断,进入 TIME2 的中断服务。此时硬件将 IABR 寄存 器中相应的标志位置位,表示 TIME2 中断正在被处理。同时硬件清除 TIME2 的 Pending 标志 位。 
     
    c/ 执行 TIME2 的中断服务程序 所有 TIME2 的中断事件,都是在一个 TIME2 中断服务程序中完成的,所以进入中断程序 后,中断程序需要首先判断是哪个 TIME2 的具体事件的中断,然后转移到相应的服务代码段 去。 注意不要忘了把该具体中断事件的中断标志位清除掉,硬件是不会自动清除 TIME2 寄存 器中具体的中断标志位的。 如果 TIME2 本身的中断事件多于 2 个,那么它们服务的先后次序就由用户编写的中断服 务决定了。换句话说,对于 TIME2 本身的多个中断的优先级,系统是不能设置的。所以用户 在编写服务程序时,应该根据实际的情况和要求,通过软件的方式,将重要的中断优先处理 掉。 当然你也可以每次中断服务只处理其中的一个,然后再次进入中断,处理下一个。 
     
    d/ 中断返回 内核执行完中断服务后,便进入中断返回过程,在这个过程中需要: 硬件将 IABR 寄存器中相应的标志位清另,表示该中断处理完成 如果 TIME2 本身还有中断标志位置位,表示 TIME2 还有中断在申请,则重新将 TIME2 的 Pending 标志置为 1,等待再次进入 TIME2 的中断服务。 
     
    以上中断过程在《ARM Cortex-M3 权威指南》中有详细描述,并配合时序图说明,可以 参考。 
     
    上述两点弄清楚后,就可以在 ST 提供的函数库的帮助下,正确的设置和使用 STM32 的 中断系统了。 
     
     
     
    如果你要了解更深入的东西,或者直接对寄存器操作,还要继续望下看。 
     
    三、深入 NVIC 
     
    1. 看看 Cortex-M3 中与 NVIC 相关的寄存器有那些 
     
    SysTick                                    Control and Status Register                                 Read/write                           0xE000E010 SysTick                                    Reload Value Register                                         Read/write                            0xE000E014 SysTick                                    Current Value Register                                        Read/write clear                    0xE000E018 SysTick                                    Calibration Value Register                                   Read-only                             0xE000E01C //==================

    Irq 0 to 31                                 Set Enable Register                                            Read/write                             0xE000E100 . 

    Irq 224 to 239                           Set Enable Register                                            Read/write                             0xE000E11C //=================

    Irq 0 to 31                              Clear Enable Register                                           Read/write                                 0xE000E180 . . . Irq 224 to 239                        Clear Enable Register                                          Read/write                                 0xE000E19C //==================

    Irq 0 to 31                              Set Pending Register                                            Read/write                                 0xE000E200 . . . . Irq 224 to 239                        Set Pending Register                                            Read/write                                 0xE000E21C //==================

    Irq 0 to 31                              Clear Pending Register                                          Read/write                                 0xE000E280 . . Irq 224 to 239                       Clear Pending Register                                           Read/write                                 0xE000E29C //==================

    Irq 0 to 31                                Active Bit Register                                                Read-only                                  0xE000E300 . . Irq 224 to 239                          Active Bit Register                                               Read-only                                   0xE000E31C //===================

    Irq 0 to 3                                Priority Register                                                      Read/write                                 0xE000E400 . . . Irq 224 to 239                        Priority Register                                                      Read/write                                  0xE000E4EC //========================

    CPUID Base Register                                                                                        Read-only                                   0xE000ED00 Interrupt Control State Register                                                              Read/write or read-only                         0xE000ED04 Vector Table Offset Register                                                                          Read/write                                      0xE000ED08 Application Interrupt/Reset Control Register                                         Read/write                                               0xE000ED0C System Control Register                                                                            Read/write                                          0xE000ED10 Configuration Control Register                                                                Read/write                                             0xE000ED14 System Handlers 4-7 Priority Register                                                    Read/write                                             0xE000ED18 System Handlers 8-11 Priority Register                                                    Read/write                                            0xE000ED1C System Handlers 12-15 Priority Register                                                    Read/write                                           0xE000ED20 . . . . . 
     
    2.STM32 中用了那些 
     
    下面是从 ST 公司提供的函数库的头文件得到的,库的版本是 v3.1.0

    /* memory mapping struct for Nested Vectored Interrupt Controller (NVIC) */

    typedef struct {  

    __IO uint32_t ISER[8];   /*!< Interrupt Set Enable Register */    

       uint32_t RESERVED0[24];  

    __IO uint32_t ICER[8];   /*!< Interrupt Clear Enable Register */      

     uint32_t RSERVED1[24];  

    __IO uint32_t ISPR[8];   /*!< Interrupt Set Pending Register */      

     uint32_t RESERVED2[24];  

    __IO uint32_t ICPR[8];   /*!< Interrupt Clear Pending Register */    

       uint32_t RESERVED3[24];  

    __IO uint32_t IABR[8];   /*!< Interrupt Active bit Register */    

       uint32_t RESERVED4[56];  

    __IO uint8_t  IP[240];   /*!< Interrupt Priority Register, 8Bit wide */  

         uint32_t RESERVED5[644];  

    __O  uint32_t STIR;    /*!< Software Trigger Interrupt Register */

    }  NVIC_Type; 
     
    a/  寄存器 ISER、ICER、ISPR、ICPR、IABR 在 STM32 中都使用的 8 个(实际 3 个就够 了,后面的留在后面扩充?)。这些 32 位的寄存器中每一位对应了一个中断通道相应的标志。
     比如地址在 0xE000E100 的 ISER[0]这个 32 位的寄存器,第 0 位是中断通道 0 的允许位, 第 1 位是中断通道 1 的允许标志……第 31 位是中断通道 31 的允许位;接下来地址在 0xE000E104 的 ISER[1]则是中断通道 32-63 的允许位。ICER、ISPR、ICPR、IABR 的结构相 同,只是含义不同。 
     
    注意是对这些寄存器的操作:写 1 表示置位或清除,写 0 无任何影响。 
     
    例如:对地址在 0xE000E100 的 ISER[0]的第 0 位写 1,表示允许中断通道 0 中断; 但对 0xE000E100 的 ISER[0]的第 0 位写 0,则没有任何作用,该位保持不变。 如果要禁止中断通道 0 的中断响应,那么就必须: 对地址 0xE000E180 的 ICER[0]的第 0 位写 1,表示禁止中断通道 0 的中断; 对 0xE000E180 的 ICER[0]的第 0 位写 0,也是不起任何作用的。 
     
    b/ IP[240]用于定义 240 个外部中断通道的优先级,每 1 个字节对应一个中断通道。4 个 中断通道的 IP[n]字构成一个 32 位的寄存器。在 STM32 中最多有 68 个外部中断通道,每个 IP[n]的 1 个字节中只使用高 4 位(见前面介绍)。IP[n]的结构如下: 
     
     
    c/ 在 ST 公司提供的函数库的头文件中另一个数据结构中,还有一个重要的 32 位寄存器 需要关注 :AIRCR 
     

    它就是地址在 0xE000ED0C 的 32 位寄存器 AIRCR(Application Interrupt/Reset Control Register),该寄存器的[10:8]3 位就是 PRIGROUP 的定义位,它的值规定了系统中 有多少个抢先级中断和子优先级中断。而 STM32 只使用高 4 位 bits,其可能的值如下(来 自 ST 的函数库头文件中的定义) 
     
    #define NVIC_PriorityGroup_0          ((uint32_t)0x700) /*!< 0 bits for pre-emption priority 
                                                                4 bits for subpriority */ 
    #define NVIC_PriorityGroup_1         ((uint32_t)0x600) /*!< 1 bits for pre-emption priority 
                                                                3 bits for subpriority */ 
    #define NVIC_PriorityGroup_2         ((uint32_t)0x500) /*!< 2 bits for pre-emption priority 
                                                                2 bits for subpriority */ 
    #define NVIC_PriorityGroup_3         ((uint32_t)0x400) /*!< 3 bits for pre-emption priority 
                                                                1 bits for subpriority */ 
    #define NVIC_PriorityGroup_4         ((uint32_t)0x300) /*!< 4 bits for pre-emption priority 
                                                                0 bits for subpriority */ 
     
    由于这个寄存器相当重要,为了防止误操作(写),因此当改写这个寄存器的内容时,
    必须要同时向这个寄存器的高 16 位[31:16]写验证字(Register key) 0x05FA。 
     
    例如:SBC->AIRCR |= (0x05FA0000 || 0x300); // 设置系统中断有 16 个抢先优先 // 级,无子优先级 
     
     
    d/ 下面的定义与SYSTICK相关,有时也会用到的。

    /* memory mapping struct for SysTick */

    typedef struct {

      __IO uint32_t CTRL;  /*!< SysTick Control and Status Register */  

    __IO uint32_t LOAD;       /*!< SysTick Reload Value Register       */  

    __IO uint32_t VAL;        /*!< SysTick Current Value Register      */  

    __I  uint32_t CALIB;      /*!< SysTick Calibration Register        */

    } SysTick_Type; 
     
    e/ 另外的几个寄存器,也是需要使用的(请具体参考相关的资料) 
     
    __IO uint8_t  SHP[12]; /*!<System Handlers Priority Registers(4-7,8-11,12-15) */ 
     
    同每个外部中断通道优先级定义字相同,它们是内核中断通道4-15的优先级定义字所在 的寄存器。用户可以通过设置SHP[n],改变内部中断通道的优先级。 
     
    __IO uint32_t VTOR;  /*!< Vector Table Offset Register  */ 
     
    如果你的代码要在RAM中启动执行,就需要对这个寄存器进行设置。 

    展开全文
  • STM32 NVIC 中断优先级管理 CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。STM32 有 84 ...

    STM32 NVIC 中断优先级管理

    • CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。
    • STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。
    • STM32 的 68 个可屏蔽中断,在 STM32F103 系列上面,又只有 60 个(在 107 系列才有 68 个)。因为我们开发板选择的芯片是 STM32F103 系列的所以我们就只针对 STM32F103 系列这 60 个可屏蔽中断进行介绍。

    中断管理方法:
    首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。这里简单介绍一下 STM32 的中断分组:STM32 将中断分为 5 个组,组 0~4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。具体的分配关系如表 4.5.1 所示:
    在这里插入图片描述
    抢占优先级和响应优先级的区别:

    • 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的(值越小越高),在抢占优先级不同的情况下响应优先级是没有用的。
    • 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
    • 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
    • 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;

    举例:
    假定设置中断优先级组为2,然后设置中断3(RTC中断)的抢占优先级为2,响应优先级为1。 中断6(外部中断0)的抢占优先级为3,响应优先级为0。中断7(外部中断1)的抢占优先级为2,响应优先级为0。那么这3个中断的优先级顺序为:中断7>中断3>中断6。
    一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。

    中断优先级分组函数:

    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
    
    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
    {
      assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
      SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
    }
    

    设置为分组二举例:

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    

    怎么设置单个中断的抢占优先级和响应优先级:
    中断设置相关寄存器

    • __IO uint8_t IP[240]; //中断优先级控制的寄存器组
    • __IO uint32_t ISER[8]; //中断使能寄存器组
    • __IO uint32_t ICER[8]; //中断失能寄存器组
    • __IO uint32_t ISPR[8]; //中断挂起寄存器组
    • __IO uint32_t ICPR[8]; //中断解挂寄存器组
    • __IO uint32_t IABR[8]; //中断激活标志位寄存器组

    MDK中NVIC寄存器结构体

    typedef struct
    {
      __IO uint32_t ISER[8];             
           uint32_t RESERVED0[24];                                   
      __IO uint32_t ICER[8];                    
           uint32_t RSERVED1[24];                                    
      __IO uint32_t ISPR[8];                     
           uint32_t RESERVED2[24];                                   
      __IO uint32_t ICPR[8];                   
           uint32_t RESERVED3[24];                                   
      __IO uint32_t IABR[8];                     
           uint32_t RESERVED4[56];                                   
      __IO uint8_t  IP[240];                     
           uint32_t RESERVED5[644];                                  
      __O  uint32_t STIR;                         
    }  NVIC_Type; 
    

    每个中断怎么设置优先级?
    中断优先级控制的寄存器组:IP[240]
    全称是:Interrupt Priority Registers。240个8位寄存器,每个中断使用一个寄存器来确定优先级。STM32F10x系列一共60个可屏蔽中断,使用IP[59]~IP[0]。每个IP寄存器的高4位用来设置抢占和响应优先级(根据分组),低4位没有用到。

    中断使能寄存器组:ISER[8]
    作用:用来使能中断
    32位寄存器,每个位控制一个中断的使能。STM32F10x只有60个可屏蔽中断,所以只使用了其中的ISER[0]和ISER[1]。ISER[0]的bit0到bit31 分别对应中断0到31。ISER[1]的bit0到bit27对应中断32~59;

    中断失能寄存器组:ICER[8]
    作用:用来失能中断
    32位寄存器,每个位控制一个中断的失能。STM32F10x只有60个可屏蔽中断,所以只使用了其中的ICER[0]和ICER[1]。ICER[0]的bit0到bit31分别对应中断0到31。ICER[1]的bit0到bit27对应中断32~59;配置方法跟ISER一样。

    void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
    

    中断挂起控制寄存器组:ISPR[8]
    作用:用来挂起中断

    中断解挂控制寄存器组:ICPR[8]
    作用:用来解挂中断

    static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
    

    中断激活标志位寄存器组:IABR [8]
    作用:只读,通过它可以知道当前在执行的中断是哪一个如果对应位为1,说明该中断正在执行。

    static __INLINE uint32_t NVIC_GetActive(IRQn_Type IRQn)
    

    中断参数初始化函数

    void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
    
    typedef struct
    {
      uint8_t NVIC_IRQChannel; //设置中断通道
      uint8_t NVIC_IRQChannelPreemptionPriority;//设置抢占优先级
      uint8_t NVIC_IRQChannelSubPriority; //设置响应优先级
      FunctionalState NVIC_IRQChannelCmd; //使能/使能
    } NVIC_InitTypeDef;
    
    NVIC_InitTypeDef   NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);	//根据上面指定的参数初始化NVIC寄存器
    

    中断优先级设置步骤
    系统运行后先设置中断优先级分组。调用函数:

    void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);
     整个系统执行过程中,只设置一次中断分组。
    

    针对每个中断,设置对应的抢占优先级和响应优先级:

    void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
    

    如果需要挂起/解挂,查看中断当前激活状态,分别调用相关函数即可。

    展开全文
  • STM32-中断优先级管理NVIC 1.NVIC中断优先级分组 NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器。STM32F中文参考手册中搜索向量表可以找到相应的中断说明。 CM4/CM7 内核支持256个中断,...

    STM32-中断优先级管理NVIC

    1.NVIC中断优先级分组

    NVIC的全称是Nested vectoredinterrupt controller,即嵌套向量中断控制器。STM32F中文参考手册中搜索向量表可以找到相应的中断说明。
    CM4/CM7 内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。
    STM32F4/F7并没有使用CM4内核的全部东西,而是只用了它的一部分。
    STM32F40xx/STM32F41xx总共有92个中断。10个内核中断,82个可屏蔽中断。
    STM32F42xx/STM32F43xx则总共有97个中断。10个内核中断,87个可屏蔽中断。
    STM32F76x总共118个中断,10个内核中断,108个可屏蔽中断。

    STM32具有16级可编程的中断优先级,而我们常用的就是这些可屏蔽中断。

    几十个中断,怎么管理?

    首先,对STM32中断进行分组,组0~4。同时,对每个中断设置一个抢占优先级和一个响应优先级值。

    分组配置是在寄存器SCB->AIRCR中配置: IP bit[7:4]有4位,2^4=16,所以说它们的优先级可以有16个值,这时候如果是2位抢占优先级,那么它的值可能为0、1、2、3。也就是抢占优先级可以取0到3 。首先进行分组来决定几位抢占优先级、几位响应优先级。数越小它的优先级越高。

    AIRCR[10:8]IP bit[7:4]分配情况分配结果
    01110:40位抢占优先级,4位响应优先级
    11101:31位抢占优先级,3位响应优先级
    21012:22位抢占优先级,2位响应优先级
    31003:13位抢占优先级,1位响应优先级
    40114:04位抢占优先级,0位响应优先级

    抢占优先级 & 响应优先级区别:

    高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。抢占决定了是否能打断别人。
    抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
    抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
    如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;

    举例:

    假定设置中断优先级组为2,然后设置

    中断3(RTC中断)的抢占优先级为2,响应优先级为1。

    中断6(外部中断0)的抢占优先级为3,响应优先级为0

    中断7(外部中断1)的抢占优先级为2,响应优先级为0。

    那么这3个中断的优先级顺序为:中断7>中断3>中断6。

    一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。

    中断优先级分组函数位于HALLIB中的stm32f7xx_hal_cortex.c:void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);

    void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
    {
      /* Check the parameters */
      assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));
      
      /* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */
      NVIC_SetPriorityGrouping(PriorityGroup);
    }
    

    可以找到IS_NVIC_PRIORITY_GROUP的定义,进而确定PriorityGroup参数怎么写。

    #define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PRIORITYGROUP_0) || \
                                           ((GROUP) == NVIC_PRIORITYGROUP_1) || \
                                           ((GROUP) == NVIC_PRIORITYGROUP_2) || \
                                           ((GROUP) == NVIC_PRIORITYGROUP_3) || \
                                           ((GROUP) == NVIC_PRIORITYGROUP_4))
    

    在stm32f7xx_hal.c中可以找到HAL_Init函数:其中HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);可以看到中断分组为2 。

    HAL_StatusTypeDef HAL_Init(void)
    {
      /* Configure Flash prefetch and Instruction cache through ART accelerator */ 
    #if (ART_ACCLERATOR_ENABLE != 0)
       __HAL_FLASH_ART_ENABLE();
    #endif /* ART_ACCLERATOR_ENABLE */
    
      /* Set Interrupt Group Priority */
      HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
    
      /* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
      HAL_InitTick(TICK_INT_PRIORITY);
      
      /* Init the low level hardware */
      HAL_MspInit();
      
      /* Return function status */
      return HAL_OK;
    }
    

    2.NVIC中断优先级设置

    分组设置好之后,怎么设置单个中断的抢占优先级和响应优先级?

    中断设置相关寄存器:

    _IO uint8_t IP[240]; //中断优先级控制的寄存器组

    _IO uint32_t ISER[8]; //中断使能寄存器组
    _IO uint32_t ICER[8]; //中断失能寄存器组
    _IO uint32_t ISPR[8]; //中断挂起寄存器组
    _IO uint32_t ICPR[8]; //中断解挂寄存器组
    _IO uint32_t IABR[8]; //中断激活标志位寄存器组

    位于core_cm7.h中:NVIC_Type结构体中成员变量就是那些寄存器。

    /**
      \brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).
     */
    typedef struct
    {
      __IOM uint32_t ISER[8U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */
            uint32_t RESERVED0[24U];
      __IOM uint32_t ICER[8U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */
            uint32_t RSERVED1[24U];
      __IOM uint32_t ISPR[8U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */
            uint32_t RESERVED2[24U];
      __IOM uint32_t ICPR[8U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */
            uint32_t RESERVED3[24U];
      __IOM uint32_t IABR[8U];               /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register */
            uint32_t RESERVED4[56U];
      __IOM uint8_t  IP[240U];               /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */
            uint32_t RESERVED5[644U];
      __OM  uint32_t STIR;                   /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register */
    }  NVIC_Type;
    
    

    对于每个中断怎么设置优先级?

    中断优先级控制的寄存器组:IP[240],全称是:Interrupt Priority Registers

    240个8位寄存器,每个中断使用一个寄存器来确定优先级。STM32F40x系列一共82个可屏蔽中断,使用IP[81]~IP[0]。

    每个IP寄存器的高4位用来设置抢占和响应优先级(根据分组),低4位没有用到。

    在stm32f7xx_hal_cortex.c可找到:

    /**
      * @brief  Sets the priority of an interrupt.
      * @param  IRQn: External interrupt number.
      *         This parameter can be an enumerator of IRQn_Type enumeration
      *         (For the complete STM32 Devices IRQ Channels list, please refer to the appropriate CMSIS device file (stm32f7xxxx.h))
      * @param  PreemptPriority: The preemption priority for the IRQn channel.
      *         This parameter can be a value between 0 and 15
      *         A lower priority value indicates a higher priority 
      * @param  SubPriority: the subpriority level for the IRQ channel.
      *         This parameter can be a value between 0 and 15
      *         A lower priority value indicates a higher priority.          
      * @retval None
      */
    void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
    { 
      uint32_t prioritygroup = 0x00;
      
      /* Check the parameters */
      assert_param(IS_NVIC_SUB_PRIORITY(SubPriority));
      assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority));
      
      prioritygroup = NVIC_GetPriorityGrouping();
      
      NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority));
    }
    
    

    中断优先级设置步骤:

    • 系统运行后在HAL_Init函数中设置中断优先级分组。调用函数:
      HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_2);
      //中断优先级分组2 整个系统执行过程中,只设置一次中断分组。
    • 针对每个中断,设置对应的抢占优先级和响应优先级:
      void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t
      PreemptPriority, uint32_t SubPriority);
    • 使能中断通道:
      void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);
    void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
    {
      /* Check the parameters */
      assert_param(IS_NVIC_DEVICE_IRQ(IRQn));
      
      /* Enable interrupt */
      NVIC_EnableIRQ(IRQn);
    }
    
    
    展开全文
  • STM32中断优先级的分配以及中断原则

    千次阅读 2020-07-08 10:43:25
    STM32d的中断优先级由NVIC_IPRx寄存器来配置,IPR的宽度为8bit所以原则上每个中断可配置的优先级为0~255,数值越小优先级越高,但对于大部分的 Cortex-M3芯片都会精简设计,导致实际上支持的优先级数量更少。...
  • STM32中断优先级管理

    2019-06-13 11:32:00
    1、先对优先级进行分组,数值越小所代表的优先级就越高 组 AIRCR[10:8] Bit[7:4] 分配结果 0 111 0:4 0 位抢占优先级,4 位响应优先级 1 110 1:3 1 位抢占优先级,3 位响应优先级 ...
  • stm32中断优先级

    2017-09-29 11:18:26
    CM3 内核支持 256 个中断,STM32 并没有使用 CM3 内核的全部只用了它的一部分。 STM32 有 84 个中断,包括 16 个内核中断和...与 NVIC 相关的寄存器中IPR[15]:是一个中断优先级控制的寄存器组由15个32bit的寄存器组成.
  • STM32 NVIC中断优先级管理

    千次阅读 2018-04-03 15:23:03
    STM32 NVIC中断优先级管理 后面用一个具体的例子说明了中断分组、中断线、中断通道的连接关系,先看基本概念: CM3内核支持256个中断,包括16个内核中断和240个外部中断,并且具有256级的可编程中断设置。STM32只...
  • stm32中断优先级设置学习

    千次阅读 2018-06-12 20:54:36
    工作中涉及到stm32挂载非接中断子程序,有时候共用外部中断口线时,对中断口线的处理得学习下,顺便了解下中断优先级设置。此文章从网上搜到转载记录下。出处:...
  • 2.STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位, 19 个外部中断为: 线 0~15:对应外部 IO 口的输入中断。 线 16:连接到 PVD 输出。 线 17:连接到 RTC 闹钟事件。 线 18:连接到 USB ...
  • main.c /* *工程模板(寄存器版本) */ #include "stm32f10x.h" ... //清空控制PB0的端口位 GPIOB_CRL &= ~( 0x0F<< (4*0)); // 配置PB0为通用推挽输出,速度为10M GPIOB_CRL |= (1<<4*0); // P.
  • 定义systick定时器的中断优先级,一般设置为最低 2. configMAX_SYSCALL_INTERRUPT_PRIORITY 用户中断服务函数中如果想调用freeRTOS的API函数,则用户中断的优先级不能高于configMAX_SYSCALL_INTERRUPT_PRIORITY...
  • STM8单片机中断优先级问题

    千次阅读 2017-12-09 20:47:10
    一:遵循当多中断发生时,先看软件优先级谁高执行谁,如果软件优先级一样看硬件优先级谁高执行谁。
  • DSP软件设置中断优先级的原理 根据网上查到的一些信息和研学TI的官方例程,得出以下结论. 在正常情况下,cpu进入中断后,默认会屏蔽所有中断,这样不会发生中断嵌套 如果cpu进入中断后,软件打开中断开关的话,如果有新的...
  • NVIC 的全称是 Nested vectored interrupt controller,即嵌套向量中断控制器。 对于 M3 和 M4 内核的 MCU,每个中断优先级都是用寄存器中的 8 位来设置的。 8 位的话就可以 设置 2^8 = 256 级中断,实际中用不了...
  • STM32中断设置以及中断优先级设置

    万次阅读 多人点赞 2018-09-13 15:26:45
    最近,在做一个智能锁的项目,...最终,调试出bug就是由于中断优先级的影响。 本项目使用到的是STM32F030C8型号的MCU,我们可以从官方下载到的标准库文件中的启动汇编文件中,查看到本型号单片机的外部中断向量表...
  • cubemax设置中断优先级

    2021-08-18 00:15:57
    1.打开cubemax,例如设置两个GPIO引脚高低电平产生的外部...3.选择NVIC控制器,分配抢占优先级和响应优先级位数,一共有5种分配方式,打钩进行中断使能,最后设置优先级,数字越小表示优先级越高。 ...
  • 对于中断这个概念,我喜欢用经常发生在CPU中的多线程...1.NVIC中断优先级分 CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。 STM32并没有使用CM3内核的全部东西,...
  • 中断优先级和中断线程优先级

    千次阅读 2017-11-12 15:40:00
    主板上集成很多硬件,那么就可以认为会有很多中断,但是cpu的数目往往要少得多,那么肯定会有多个硬件中断竞争一个cpu的情况,任何系统(包括自然界)都不能乱套,肯定会有一定的机制防止事情变得不可控制,...
  • 单片机之中断优先级设置

    千次阅读 2020-09-14 17:39:35
    中断优先级的基本规则 1.低优先级中断可被高优先级中断所中断 2.任何中断都不被同级中断所中断 然而datashhet里STC12C5A60S2单片机复位后IP、IP2、IPH、IP2H均为00H,各个中断源都是低优先级=》不能被同级中断所...
  • 异常类型F103 在内核...除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。有关具体的系统异常和外部中断可在标准库文件stm32f10x.h 这个头文件查询到,在IRQn_Type 这个结构体里面包含了F103 系列全...
  • 【STM32】NVIC中断优先级的理解

    千次阅读 多人点赞 2019-11-26 22:25:50
    大千世界,无所不有,而前后顺序,等级顺序,则一直伴随左右。而STM32也不例外。 我们在学习STM32中串口啊,定时器啊...具有高优先级中断可以在低优先级正在运行时打断其运行,然后执行自己的程序,运行完后再...
  • 1.软件及工程环境搭建 ...- M4中断优先级(分三种): 抢占优先级:含义是不同等级间的中断可以嵌套,高优先级可以中断低优先级,数字小的优先级高。 响应优先级:含义是不同响应优先级的中断不能嵌套
  • Gic 中的中断优先级

    2020-11-12 15:21:24
    1、中断优先级寄存器每8bit一个中断,但是那些bit有效则是有硬件设计时决定,通过查询ICC_CTLR_EL1/3.PRIbits,具体描述查看4.8.2 priority grouping 2、GICD_IPRIORITYR<n> 中的寄存器存放的是spi寄存器,sgi...
  • configMAX_SYSCALL_INTERRUPT_PRIORITY 中断优先级设置问题 从CortexM角度 Cortex-M构架自身最多允许256级可编程优先级(优先级配置寄存器最多8位,所以优先级范围从0x00~0xFF), 是绝大多数微控制器制造商只是使用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 105,260
精华内容 42,104
关键字:

中断优先级怎么控制