目录

1. 中断类型

2. NVIC 概述

3.  中断优先级

4. 优先级分组

5. 编程要点


1. 中断类型

在此不严格区分中断和异常,即简单的认为中断与异常一个概念。

M4 内核搭载了异常响应系统,支持众多的系统异常和外部中断。其中,F429芯片,系统异常10个,外部中断91个。除个别异常的优先级固定外,其它均可编程。stm32f4xx.h

typedef enum IRQn
{
/******  Cortex-M4 Processor Exceptions Numbers ****************************************************************/NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                                          */MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M4 Memory Management Interrupt                           */BusFault_IRQn               = -11,    /*!< 5 Cortex-M4 Bus Fault Interrupt                                   */UsageFault_IRQn             = -10,    /*!< 6 Cortex-M4 Usage Fault Interrupt                                 */SVCall_IRQn                 = -5,     /*!< 11 Cortex-M4 SV Call Interrupt                                    */DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M4 Debug Monitor Interrupt                              */PendSV_IRQn                 = -2,     /*!< 14 Cortex-M4 Pend SV Interrupt                                    */SysTick_IRQn                = -1,     /*!< 15 Cortex-M4 System Tick Interrupt                                */
/******  STM32 specific Interrupt Numbers **********************************************************************/WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                                         */PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt                         */TAMP_STAMP_IRQn             = 2,      /*!< Tamper and TimeStamp interrupts through the EXTI line             */RTC_WKUP_IRQn               = 3,      /*!< RTC Wakeup interrupt through the EXTI line                        */FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                                            */RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                              */EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                              */EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                              */EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                              */EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                              */EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                              */DMA1_Stream0_IRQn           = 11,     /*!< DMA1 Stream 0 global Interrupt                                    */DMA1_Stream1_IRQn           = 12,     /*!< DMA1 Stream 1 global Interrupt                                    */DMA1_Stream2_IRQn           = 13,     /*!< DMA1 Stream 2 global Interrupt                                    */DMA1_Stream3_IRQn           = 14,     /*!< DMA1 Stream 3 global Interrupt                                    */DMA1_Stream4_IRQn           = 15,     /*!< DMA1 Stream 4 global Interrupt                                    */DMA1_Stream5_IRQn           = 16,     /*!< DMA1 Stream 5 global Interrupt                                    */DMA1_Stream6_IRQn           = 17,     /*!< DMA1 Stream 6 global Interrupt                                    */ADC_IRQn                    = 18,     /*!< ADC1, ADC2 and ADC3 global Interrupts                             */#if defined(STM32F429_439xx)CAN1_TX_IRQn                = 19,     /*!< CAN1 TX Interrupt                                                 */CAN1_RX0_IRQn               = 20,     /*!< CAN1 RX0 Interrupt                                                */CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                                */CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                                */EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                                     */TIM1_BRK_TIM9_IRQn          = 24,     /*!< TIM1 Break interrupt and TIM9 global interrupt                    */TIM1_UP_TIM10_IRQn          = 25,     /*!< TIM1 Update Interrupt and TIM10 global interrupt                  */TIM1_TRG_COM_TIM11_IRQn     = 26,     /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                                    */TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                             */TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                             */TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                             */I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                              */I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                              */I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                              */I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                              */  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                             */SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                             */USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                                           */USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                                           */USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                                           */EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                                   */RTC_Alarm_IRQn              = 41,     /*!< RTC Alarm (A and B) through EXTI Line Interrupt                   */OTG_FS_WKUP_IRQn            = 42,     /*!< USB OTG FS Wakeup through EXTI line interrupt                     */    TIM8_BRK_TIM12_IRQn         = 43,     /*!< TIM8 Break Interrupt and TIM12 global interrupt                   */TIM8_UP_TIM13_IRQn          = 44,     /*!< TIM8 Update Interrupt and TIM13 global interrupt                  */TIM8_TRG_COM_TIM14_IRQn     = 45,     /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */TIM8_CC_IRQn                = 46,     /*!< TIM8 Capture Compare Interrupt                                    */DMA1_Stream7_IRQn           = 47,     /*!< DMA1 Stream7 Interrupt                                            */FMC_IRQn                    = 48,     /*!< FMC global Interrupt                                              */SDIO_IRQn                   = 49,     /*!< SDIO global Interrupt                                             */TIM5_IRQn                   = 50,     /*!< TIM5 global Interrupt                                             */SPI3_IRQn                   = 51,     /*!< SPI3 global Interrupt                                             */UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                                            */UART5_IRQn                  = 53,     /*!< UART5 global Interrupt                                            */TIM6_DAC_IRQn               = 54,     /*!< TIM6 global and DAC1&2 underrun error  interrupts                 */TIM7_IRQn                   = 55,     /*!< TIM7 global interrupt                                             */DMA2_Stream0_IRQn           = 56,     /*!< DMA2 Stream 0 global Interrupt                                    */DMA2_Stream1_IRQn           = 57,     /*!< DMA2 Stream 1 global Interrupt                                    */DMA2_Stream2_IRQn           = 58,     /*!< DMA2 Stream 2 global Interrupt                                    */DMA2_Stream3_IRQn           = 59,     /*!< DMA2 Stream 3 global Interrupt                                    */DMA2_Stream4_IRQn           = 60,     /*!< DMA2 Stream 4 global Interrupt                                    */ETH_IRQn                    = 61,     /*!< Ethernet global Interrupt                                         */ETH_WKUP_IRQn               = 62,     /*!< Ethernet Wakeup through EXTI line Interrupt                       */CAN2_TX_IRQn                = 63,     /*!< CAN2 TX Interrupt                                                 */CAN2_RX0_IRQn               = 64,     /*!< CAN2 RX0 Interrupt                                                */CAN2_RX1_IRQn               = 65,     /*!< CAN2 RX1 Interrupt                                                */CAN2_SCE_IRQn               = 66,     /*!< CAN2 SCE Interrupt                                                */OTG_FS_IRQn                 = 67,     /*!< USB OTG FS global Interrupt                                       */DMA2_Stream5_IRQn           = 68,     /*!< DMA2 Stream 5 global interrupt                                    */DMA2_Stream6_IRQn           = 69,     /*!< DMA2 Stream 6 global interrupt                                    */DMA2_Stream7_IRQn           = 70,     /*!< DMA2 Stream 7 global interrupt                                    */USART6_IRQn                 = 71,     /*!< USART6 global interrupt                                           */I2C3_EV_IRQn                = 72,     /*!< I2C3 event interrupt                                              */I2C3_ER_IRQn                = 73,     /*!< I2C3 error interrupt                                              */OTG_HS_EP1_OUT_IRQn         = 74,     /*!< USB OTG HS End Point 1 Out global interrupt                       */OTG_HS_EP1_IN_IRQn          = 75,     /*!< USB OTG HS End Point 1 In global interrupt                        */OTG_HS_WKUP_IRQn            = 76,     /*!< USB OTG HS Wakeup through EXTI interrupt                          */OTG_HS_IRQn                 = 77,     /*!< USB OTG HS global interrupt                                       */DCMI_IRQn                   = 78,     /*!< DCMI global interrupt                                             */CRYP_IRQn                   = 79,     /*!< CRYP crypto global interrupt                                      */HASH_RNG_IRQn               = 80,     /*!< Hash and Rng global interrupt                                     */FPU_IRQn                    = 81,     /*!< FPU global interrupt                                              */UART7_IRQn                  = 82,     /*!< UART7 global interrupt                                            */UART8_IRQn                  = 83,     /*!< UART8 global interrupt                                            */SPI4_IRQn                   = 84,     /*!< SPI4 global Interrupt                                             */SPI5_IRQn                   = 85,     /*!< SPI5 global Interrupt                                             */SPI6_IRQn                   = 86,     /*!< SPI6 global Interrupt                                             */SAI1_IRQn                   = 87,     /*!< SAI1 global Interrupt                                             */LTDC_IRQn                   = 88,     /*!< LTDC global Interrupt                                             */LTDC_ER_IRQn                = 89,     /*!< LTDC Error global Interrupt                                       */DMA2D_IRQn                  = 90      /*!< DMA2D global Interrupt                                            */
#endif /* STM32F429_439xx */} IRQn_Type;

2. NVIC 概述

NVIC是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对Cortex-M4内核里面的NVIC进行裁剪,把不需要的部分去掉,所以说STM32的NVIC是Cortex-M4的NVIC的一个子集。

NVIC结构体定义,来自固件库头文: core_cm4.

在配置中断的时候我们一般只用ISER、ICER和IP这三个寄存器,ISER用来使能中断,ICER用来失能中断,IP用来设置中断优先级。

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

 注:系统异常优先级配置拥有独立于外设优先级配置的寄存器

3.  中断优先级

在NVIC 有一个专门的寄存器:中断优先级寄存器NVIC_IPRx(在F429中,x=0...90)用来配置外部中断的优先级,IPR宽度为8bit,原则上每个外部中断可配置的优先级为0~255,数值越小,优先级越高。但是绝大多数CM4芯片都会精简设计,以致实际上支持的优先级数减少,在F429中,只使用了高4bit。

F429 使用 4bit表达优先级 表达优先级

用于表达优先级的这4bit,又被分组成抢占优先级和子优先级。如果有多个中断同时响应,抢占优先级高的就会 抢占 抢占优先级低的优先得到执行,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高。

4. 优先级分组

优先级的分组由内核外设SCB的应用程序中断及复位控制寄存器AIRCR的PRIGROUP[10:8]位决定,F429分为了5组,具体如下:主优先级=抢占优先级。

设置优先级分组可调用库函数NVIC_PriorityGroupConfig()实现,有关NVIC中断相关的库函数都在库文件misc.c和misc.h中。

优先级分组真值表

5. 编程要点

  • 使能外设某个中断,这个具体由每个外设的相关中断使能位控制
  • 初始化NVIC_InitTypeDef结构体,配置中断优先级分组,设置抢占优先级和子优先级,使能中断请求
  • 编写中断服务函数,短小精悍。

秉火429笔记之九 中断应用概述相关推荐

  1. 秉火429笔记之八 RCC时钟

    目录 1. RCC 作用概述 2. RCC框图剖析-时钟树 3. 编程要点 4. 源码实例 1. RCC 作用概述 RCC :reset clock control 复位和时钟控制器. 设置系统时钟S ...

  2. 秉火429笔记之十 EXTI-外部中断/事件

    目录 1. EXTI 简介 2. EXTI 功能框图 3. 功能点 4. 编码要点 1. EXTI 简介 外部中断/事件控制器(EXTI)管理了控制器的23个中断/事件线.每个中断/事件线都对应有一个 ...

  3. 秉火429笔记之十七 SPI--操作FLASH

    目录 1. SPI协议概述 2. STM32 SPI特性及架构 2.1 SPI外设简介 2.2 STM32的SPI架构剖析 2.2.1 通讯引脚 2.2.2 时钟控制逻辑 2.2.3 数据控制逻辑 3 ...

  4. 秉火429笔记之十四 USART--串口通信

    目录 1. 串口通讯协议简介 1.1 物理层 1.2 协议层 2  ST USART 2.1 功能引脚 2.2 重要状态 2.3 编程要点 2.4 代码实例 1. 串口通讯协议简介 串口通讯(Seri ...

  5. 秉火429笔记之十二 看门狗

    目录 1. 概述 2. 独立看门狗(IWDG) 3. 窗口看门狗(WWDG) 1. 概述 STM32有两个看门狗,一个是独立看门狗,另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看门狗号称警犬. 一 ...

  6. 秉火429笔记之十八 ETH--以太网

    目录 1. 以太网简介 2.  SMI 接口 (站管理接口) 2.1 SMI帧格式 2.2 SMI 读写操作 3. MII 和 RMII接口 4. MAC 802.3 4.1 MAC 802.3 帧格 ...

  7. 秉火429笔记之十一 Systick--滴答定时器

    目录 1. 概述 2. 寄存器说明 3. 编程要点 4. 实例代码 SysTick-系统定时器是属于CM4内核中的一个外设,内嵌在NVIC中.系统定时器是一个24bit的向下递减的计数器.所有基于CM ...

  8. 秉火429笔记之十五 DMA--直接存储区访问

    目录 1. 简介 2. 功能 2.1 外设通道 2.2 仲裁器 2.3 FIFO 2.4 存储器端口和外设端口 2.5 编程接口 3. DMA数据配置 1. 简介 直接存储器访问 (DMA) 用于在外 ...

  9. 秉火429笔记之七位带操作

    目录 位带概况 位带概况 位操作,简单的理解,可以单独的对一个比特位读和写,51单片机非常常见.类如,51单片机通过关键字sbit来实现位定义,STM32并没有这个关键字,而是通过访问位带别名区(Bi ...

最新文章

  1. [推荐]Angular File Changer (Supporting Touch Bar and NgRx)→用于快速切换同名HTML/SCSS/TS文件,非常的实用
  2. C++ 静态链表(用数组模拟动态链表)
  3. php要掌握的内容,入门PHPer需要掌握的哪些内容?
  4. 关于SAP UI5 CRM Reuse Fiori应用的代码审查
  5. css 商城 两列_CSS 居中?来一探究竟
  6. 基于微服务架构、运行于容器中的.NET Core示例应用eShopOnContainers
  7. 【MyBatis笔记】07-MyBatis 核心配置文件
  8. 2016.8.27一套简单的题解题报告
  9. java根据数据库自动生成代码
  10. 汽车电子电气架构工程师的工作
  11. 将TXT文件作为数据库批量生成条形码
  12. 双臂冗余机器人solidworks转URDF
  13. Pytorch 并行训练(DP, DDP)的原理和应用
  14. 移动端布局介绍——css像素/物理像素/设备像素比
  15. 【愚公系列】2021年11月 攻防世界-进阶题-MISC-051(Miscellaneous-300)
  16. CMMI:OPM--对模型做DMAIC
  17. html获取鼠标的当前位置
  18. 大转折时代——生活与思维方式的大转折
  19. img/input等部分标签是行内标签,为什么也可以设置宽和高
  20. 增值税发票信息ocr扫描识别核验验真sdk接口

热门文章

  1. 批量剪辑视频,添加图片水印
  2. Python 模拟登录淘宝
  3. html插入隐藏背景音乐,HTML插入背景音乐方法【全】
  4. C# 获取枚举类型描述Description值
  5. linux桌面无法显示U盘,电脑桌面右下角不能显示u盘图标解决方法
  6. 简单步骤实现wordpress添加og协议
  7. 怎么退出自适应巡航_减少系统干扰 体验ACC自适应巡航
  8. 用python通过selenium自动化测试抓取天猫店铺数据
  9. android 定时响铃,Android 中利用广播接收器(BroadCastReceiver)来接收定时响铃的闹铃信息...
  10. 如何处理java异常