第六章:外部中断和中断控制器向量中断控制器,简称 NVIC,是 Cortex‐M3 不可分离的一部分,它与Cortex-M3 内核的逻辑紧密耦合,有一部分甚至水乳交融在一起NVIC与 Cortex-M3 内核,相辅相成,里应外合,共同完成对中断的响应NVIC 的寄存器以存储器映射的方式来访问, 除了包含控制寄存器和中断处理的控制逻辑之外, NVIC还包含了MPU的控制寄存器、SysTick定时器以及调试控制6.1 嵌套向量中断控制器 6.1.1 概述嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和有效处理地处理晚到的中断嵌套向量中断控制器管理着包括核异常等中断有下述特点:1. 60个可屏蔽中断通道(不包含16个Cortex™-M3的中断线); 2. 16个可编程的优先等级(使用了4位中断优先级); 3. 低延迟的异常和中断处理; 4. 电源管理控制; 5. 系统控制寄存器的实现; 6.1.2 中断和异常向量 表 6-1-1 STM32F10xxx产品的向量表 位置 优先级 优先级 类型 名称 说明 地址 - - - 保留 0x0000_0000 -3固定 Reset 复位 0x0000_0004 -2 固定 NMI 不可屏蔽中断 RCC时钟安全系统(CSS)联接到NMI向量 0x0000_0008 -1 固定 硬件失效 所有类型的失效 0x0000_000C 0 可设置 存储管理 存储器管理 0x0000_0010 1可设置 总线错误 预取指失败,存储器访问失败 0x0000_0014 2可设置 错误应用 未定义的指令或非法状态 0x0000_0018 --- - 保留 0x0000_001C~0x0000_002B 3 可设置 SVCall 通过SWI指令的系统服务调用 0x0000_002C 4 可设置 调试监控 调试监控器 0x0000_0030 --- - 保留 0x0000_0034 5 可设置 PendSV 可挂起的系统服务 0x0000_0038 6可设置 SysTick 系统嘀嗒定时器 0x0000_003C0 7 可设置 WWDG 窗口定时器中断 0x0000_00401 8 可设置 PVD 联到EXTI的电源电压检测(PVD)中断 0x0000_00442 9 可设置 TAMPER 侵入检测中断 0x0000_00483 10 可设置 RTC 实时时钟(RTC)全局中断 0x0000_004C4 11 可设置 FLASH 闪存全局中断 0x0000_00505 12 可设置 RCC 复位和时钟控制(RCC)中断 0x0000_00546 13 可设置 EXTI0 EXTI线0中断 0x0000_00587 14 可设置 EXTI1 EXTI线1中断 0x0000_005C8 15 可设置 EXTI2 EXTI线2中断 0x0000_00609 16 可设置 EXTI3 EXTI线3中断 0x0000_006410 17 可设置 EXTI4 EXTI线4中断 0x0000_006811 18 可设置 DMA1通道1 DMA1通道1全局中断 0x0000_006C12 19 可设置 DMA1通道2 DMA1通道2全局中断 0x0000_007013 20 可设置 DMA1通道3 DMA1通道3全局中断 0x0000_007414 21 可设置 DMA1通道4 DMA1通道4全局中断 0x0000_007815 22 可设置 DMA1通道5 DMA1通道5全局中断 0x0000_007C16 23 可设置 DMA1通道6 DMA1通道6全局中断 0x0000_008017 24 可设置 DMA1通道7 DMA1通道7全局中断 0x0000_008418 25 可设置 ADC ADC全局中断 0x0000_008819 26 可设置 USB_HP_CAN_TX USB高优先级或CAN发送中断 0x0000_008C20 27 可设置 USB_LP_CAN_RX0USB低优先级或CAN接收0中断 0x0000_009021 28 可设置 CAN_RX1 CAN接收1中断 0x0000_009422 29 可设置 CAN_SCE CAN SCE中断 0x0000_009823 30 可设置 EXTI9_5 EXTI线[9:5]中断 0x0000_009C24 31 可设置 TIM1_BRK TIM1断开中断 0x0000_00A025 32 可设置 TIM1_UP TIM1更新中断 0x0000_00A426 33 可设置 TIM1_TRG_COM TIM1触发和通信中断 0x0000_00A827 34 可设置 TIM1_CC TIM1捕获比较中断 0x0000_00AC28 35 可设置 TIM2 TIM2全局中断 0x0000_00B029 36 可设置 TIM3 TIM3全局中断 0x0000_00B430 37 可设置 TIM4 TIM4全局中断 0x0000_00B831 38 可设置 I2C1_EV I2C1事件中断 0x0000_00BC32 39 可设置 I2C1_ER I2C1错误中断 0x0000_00C033 40 可设置 I2C2_EV I2C2事件中断 0x0000_00C434 41 可设置 I2C2_ER I2C2错误中断 0x0000_00C835 42 可设置 SPI1 SPI1全局中断 0x0000_00CC36 43 可设置 SPI2 SPI2全局中断 0x0000_00D037 44 可设置 USART1 USART1全局中断 0x0000_00D438 45 可设置 USART2 USART2全局中断 0x0000_00D839 46 可设置 USART3 USART3全局中断 0x0000_00DC40 47 可设置 EXTI15_10 EXTI线[15:10]中断 0x0000_00E041 48 可设置 RTCAlarm 联到EXTI的RTC闹钟中断 0x0000_00E442 49 可设置 USB唤醒 联到EXTI的从USB待机唤醒中断 0x0000_00E84350可设置 TIM8_BRK TIM8断开中断 0x0000_00EC4451可设置 TIM8_UP TIM8更新中断 0x0000_00F04552可设置 TIM8_TRG_COM TIM8触发和通信中断 0x0000_00F44653可设置 TIM8_CC TIM8捕获比较中断 0x0000_00F84754可设置 ADC3 ADC3全局中断 0x0000_00FC4855可设置 FSMC FSMC全局中断 0x0000_01004956可设置 SDIO SDIO全局中断 0x0000_01045057可设置 TIM5 TIM5全局中断 0x0000_01085158可设置 SPI3 SPI3全局中断 0x0000_010C5259可设置 UART4 UART4全局中断 0x0000_01105360可设置 UART5 UART5全局中断 0x0000_01145461可设置 TIM6 TIM6全局中断 0x0000_01185562可设置 TIM7 TIM7全局中断 0x0000_011C5663可设置 DMA2通道1 DMA2通道1全局中断 0x0000_01205764可设置 DMA2通道2 DMA2通道2全局中断 0x0000_01245865可设置 DMA2通道3 DMA2通道3全局中断 0x0000_01285966可设置 DMA2通道4_5 DMA2通道4和DMA2通道5全局中断 0x0000_012C6.1.3 中断优先级介绍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位用于指定响应优先级。