• ag百家乐交流平台 STM32 HAL库开荒学习8. STM32的嵌套中断贬抑器NVIC

    发布日期:2024-10-19 07:33    点击次数:100

    一、NVIC简介1. NVIC 是什么NVIC 全称为 Nested Vectored Interrupt Controller,即嵌套向量中断贬抑器,它是 ARM Cortex - M 系列微贬抑器内核的要道构成部分,在 STM32 等基于该内核的芯片中闲居利用,主要厚爱处置和处理中断苦求。扶持NVIC的内核主如果Cortex-M 系列:

    ARM推出的 Cortex-M0和Cortex-M0+结构相对简短,集成了NVIC完了基本的中断处置功能。Cortex-M3 引入了Thumb-2教唆集,扶持更复杂的中断处理,包括嵌套中断。Cortex-M4 在M3基础上加多了浮点运算,增强了数字信号处理功能,除具备Cortex-M3的中断处置功能,还能更公情理与浮点运算相干的中断。Cortex-M7 是M系列中最强的内核,扶持更多的中断源和更考究的中断优先级树立,适用于高性能利用,如汇注缔造、图形处理等。Cortex-M23和Cortex-M33,基于ARMv8-M架构,它们的NVIC在承袭前代内核优点的同期,还麇集了安全秉性,餍足对安全要求较高的利用。Cortex-M55,基于Armv8.1-M架构,其NVIC进一步优化,以顺应愈加复杂的中断处置需求,适用于智能物联网缔造、边际蓄意等界限。2. NVIC扶持的中断数目Cortex - M0 和 Cortex - M0+:频繁扶持 32 个外部中断输入,加上多少个系统尽头,统统可处理约 32 - 40 个中断源。Cortex - M3、Cortex - M4、Cortex - M7:一般扶持 240 个外部中断输入,再加上 16 个系统尽头,统统能处理 256 个中断源。不外实质的微贬抑器居品可能会把柄本身想象,对可用的中断数目进行剪辑。Cortex - M23、Cortex - M33、Cortex - M55:表面上相同扶持 240 个外部中断和 16 个系统尽头,共 256 个中断源,但具体数目依然由芯片厂商决定。3. NVIC的优先级配置NVIC 接管二进制优先级位来配置中断优先级,不同内核的优先级位数不同:

    Cortex - M0 和 Cortex - M0+:只须 2 位优先级位,因此扶持 4 个优先级级别(0 - 3),数值越小优先级越高。Cortex - M3、Cortex - M4、Cortex - M7、Cortex - M23、Cortex - M33、Cortex - M55:有 8 位优先级位,但芯片厂商频繁会剪辑使用。一般会使用 4 位,扶持 16 个优先级级别(0 - 15),相同数值越小优先级越高。这 4 位又不错进一步分别为霸占优先级和子优先级,具体分别边幅由用户通过优先级分组寄存器来配置。4. STM32 部分系列扶持的中断数目NVIC扶持:256个中断(16内核+240外部),扶持:256个优先级,允许剪辑。 STM32型号内核中断外部中断中断优先级 STM32F103xx

    10

    60

    16

    STM32F407xx

    10

    82

    16

    STM32F429xx

    10

    91

    16

    STM32F750xx

    10

    98

    16

    STM32F767xx

    10

    16

    STM32H743xx

    10

    16

    STM32H750xx

    10

    16

    二、中断向量表中断向量表用来存储每个中断源对应的中断工作门径的进口地址。中断向量表以4字节对皆,其界说是在启动文献里。当中断发生时,NVIC 把柄中断向量表找到并调用相应的中断工作门径,从而完了对中断的反应和处理。NVIC的中断向量表分为内核尽头向量和外设中断向量。

    1. 内核尽头向量内核尽头向量位于中断向量表的前部(频繁前16个要求)。常见的内核尽头有: 向量表索引尽头类型施展 0

    运转栈指针(SP)

    主堆栈的运转地址

    1

    Reset

    复位后引申的进口

    2

    NMI

    不可屏蔽中断(如看门狗触发)

    3

    HardFault

    严重空幻(如未处理的尽头)

    4

    MemManage

    内存处置空幻(MPU触发)

    5

    BusFault

    总线走访空幻

    6

    UsageFault

    教唆引申空幻(如未对皆走访)

    11

    SVCall

    通过SVC教唆触发的系统调用

    14

    PendSV

    可挂起的系统工作苦求(用于OS)

    15

    SysTick

    系统节律定时器中断

    Reset(-3)优先级最高,NMI(-2)和HardFault(-1)优先级高且固定。其他尽头(如PendSV、SysTick)优先级可配置,但仍可能高于外设中断。

    2. 外设中断向量外设中断向量是由外部缔造(如GPIO、UART、定时器等)触发的中断,其特色:

    动态配置:从内核尽头之后的位置起首(如索引16起首)。数目可变:取决于具体芯片型号(如STM32F4有约90个外设中断)。可屏蔽:通过NVIC使能/禁用,优先级可配置(霸占优先级和子优先级)。3. 中断向量表结构typedef void (*ISR_Function)(void);__attribute__((section(".vector_table"))) const ISR_Function vector_table[] = { (ISR_Function)&_estack, // 运转栈指针 Reset_Handler, // 复位处理函数 NMI_Handler, // NMI处理函数 HardFault_Handler, // HardFault处理函数 // ...其他内核尽头... EXTI0_IRQHandler, // 外设中断EXTI0 USART1_IRQHandler, // 外设中断USART1 // ...其他外设中断...};三、中断优先级优先级数值越小,优先级越高(举例优先级0 > 优先级1)。优先级界限取决于芯片完了(举例Cortex-M3/M4扶持0~255,但频繁用高几位配置)。

    优先级分为霸占优先级(Preemption Priority)和反应优先级(Subpriority),又称为子优先级,通过AIRCR寄存器的PRIGROUP字段分组。

    1. 霸占优先级高霸占优先级不错打断正在引申的低霸占优先级中断。

    2. 反应优先级当霸占优先级疏浚期,反应优先级高的先引申,然则不行彼此打断。

    3. 当然优先级中断向量表的优先级。当霸占优先级和反应优先级疏浚期,当然优先级数值越小,优先级越高。

    四、中断优先级分组Cortex-M系列处理器中,AG百家乐技巧打法中断优先级是NVIC(嵌套向量中断贬抑器)的核神思制,用于纯真分派中断的霸占优先级和反应优先级,从而贬抑中断的嵌套活动和引申限定。

    1. 优先级分组的作用(1)中枢看法中断优先级分组的中枢看法是将中断优先级数值的二进制位分别为两部分:

    霸占优先级:决定中断是否不错打断刻下正在引申的中断(嵌套)。反应优先级:在霸占优先级疏浚的情况下,决定中断的引申限定。(2)分组纯真性用户门径把柄需求动态调遣霸占和反应优先级的位数比例。

    2. 优先级分组寄存器AIRCR.PRIGROUPCortex-M通过AIRCR寄存器的PRIGROUP字段(bit[10:8])配置优先级分组。分组值的界限是0~7,对应不同的霸占和反应优先级位数分派: 优先级分组AIRCR[10:8]IPRx bit[7:4]分派分派恶果 0 (Group0)

    None : [7:4]

    0位霸占优先级,4位反应优先级

    1 (Group1)

    [7] : [6:4]

    1位霸占优先级,3位反应优先级

    2 (Group2)

    [7:6] : [5:4]

    2位霸占优先级,2位反应优先级

    3 (Group3)

    [7:5] : [4]

    3位霸占优先级,1位反应优先级

    4 (Group4)

    [7:4] : None

    4位霸占优先级,0位反应优先级

    其中霸占优先级位数+反应优先级位数=4.每个中断的优先级寄存器为8位,实质使用的位数由芯片决定,关于STM32来说,只用高4位,即上头讲的 AIRCR的 bit10~bit8。 一个工程中,一般只树立一次中断优先级分组。 3. STM32中断优先级示例假定分组是2,从上表可知,霸占优先级和反应级都是4个,底下配置4个外设的中断优先级: 编号当然优先级对应外设霸占反应引申限定 3

    10

    RTC

    2

    1

    2

    6

    13

    EXTI0

    3

    0

    4

    7

    14

    EXTI1

    2

    0

    1

    -1

    6

    Systick

    3

    0

    3

    其中:

    关于RTC和EXTI1,霸占优先级较高,EXTI1的反应优先级更高,要先引申,即:

    编号 3 :对应 RTC 外设,其当然优先级是 10。霸占优先级为 2,反应优先级为 1,在这组中断中,它的引申限定是第 2 位。编号 7 :对应 EXTI1 外设,当然优先级是 14。霸占优先级为 2,反应优先级为 0,引申限定是第 1 位。关于 EXTI0和 Systick,其霸占优先级和反应优先级一样,当然优先级小的先引申,即:

    编号 6 :对应 EXTI0 外设,当然优先级为 13。霸占优先级为 3,反应优先级为 0,引申限定排在第 4 位。编号 -1 :对应 Systick,当然优先级为 6。霸占优先级是 3,反应优先级为 0,引申限定排在第 3 位。EXTI1和RTC不错打断 EXTI0和Systick的中断,得回优先引申权。五、STM32 NVIC的使用1. NVIC配置(1) 树立中断分组使用AIRCR[10:8],使用库函数:

    void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);其中参数:PriorityGroup指定优先级分组边幅,可选值如下(CMSIS界说):

    #define NVIC_PRIORITYGROUP_0 0x00000000U // 0位霸占优先级,4位子优先级#define NVIC_PRIORITYGROUP_1 0x00000001U // 1位霸占优先级,3位子优先级#define NVIC_PRIORITYGROUP_2 0x00000002U // 2位霸占优先级,2位子优先级#define NVIC_PRIORITYGROUP_3 0x00000003U // 3位霸占优先级,1位子优先级#define NVIC_PRIORITYGROUP_4 0x00000004U // 4位霸占优先级,0位子优先级(2)树立中断优先级IPRx bit[7:4],使用库函数:

    void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority);参数:

    IRQn:中断号,界说在芯片头文献(如stm32f4xx.h)中。举例,EXTI0_IRQn 暗意外部中断线0。PreemptPriority:霸占优先级数值(需适应刻下分组规定下的位数贬抑)。SubPriority:反应优先级数值(需适应刻下分组规定下的位数贬抑)。复返值:无。

    (3)使能中断ISERx,使用库函数:

    void HAL_NVIC_EnableIRQ(IRQn_Type IRQn) 参数:

    IRQn:指定要使能的中断线,类型为 IRQn_Type 陈设ag百家乐交流平台,每个值对应一个中断编号。