Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器

0 工具准备

Keil uVision5
Cortex M3权威指南(中文)
Cortex M3与M4权威指南
stm32f407的HAL库工程
STM32F4xx中文参考手册

1 NVIC相关寄存器介绍

在Cortex-M3/M4内核上搭载了一个异常响应系统,支持为数众多的系统异常和外部中断。其中,Cortex-M3/M4内核包括15个系统异常,大部分系统异常的中断优先级都可以设置。外部中断由厂商定义,以stm32f407为例,它一共有82个外部中断。
(1)系统异常
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第1张图片
(2)外部中断(部分)
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第2张图片

在这里插入图片描述

1.1 系统异常寄存器

(1)SHP(系统异常优先级)寄存器
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第3张图片
系统异常优先级寄存器共有12个,可以用来设置优先级可配置的系统异常。
(2)SHCSR(系统异常控制和状态)寄存器
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第4张图片
系统异常控制和状态寄存器可以设置或者读取当前系统异常是否使能,写1使能系统异常,读取值为1表示系统异常使能。

1.2 外部中断寄存器

NVIC属于M4的内核部分,在stm32f407工程的CMSIS->Include->core_cm4.h内可以看到NVIC寄存器的定义:

#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */
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;

上述寄存器的详细含义如下:
(1)ISER(中断使能)寄存器
中断使能寄存器一共有8个,每个寄存器包含32个使能位,总共可以控制256个中断使能状态,实际上只用到了240个(F407只用到了82个)。在《Cortex M3权威指南(中文)》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第5张图片
中断对应使能位写1则使能中断,写0无任何动作,读对应位可以获取当前设置值。在《Cortex M3与M4权威指南》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第6张图片

(2)ICER(中断失能)寄存器
中断失能寄存器一共有8个,每个寄存器包含32个失能位,总共可以控制256个中断失能状态,实际上只用到了240个(F407只用到了82个)。在《Cortex M3权威指南(中文)》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第7张图片
中断对应失能位写1则失能中断,写0无任何动作,读对应位可以获取当前设置值。在《Cortex M3与M4权威指南》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第8张图片
(3)ISPR(中断挂起)寄存器
中断挂起寄存器一共有8个,每个寄存器包含32个挂起位,总共可以控制256个中断挂起状态,实际上只用到了240个(F407只用到了82个)。在《Cortex M3权威指南(中文)》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第9张图片
中断对应挂起位写1则挂起中断,写0无任何动作,读对应位可以获取当前设置值。在《Cortex M3与M4权威指南》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第10张图片

(4)ICPR(中断解挂)寄存器
中断解挂寄存器一共有8个,每个寄存器包含32个解挂位,总共可以控制256个中断解挂状态,实际上只用到了240个(F407只用到了82个)。在《Cortex M3权威指南(中文)》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第11张图片
中断对应解挂位写1则挂起中断,写0无任何动作,读对应位可以获取当前中断挂起状态。在《Cortex M3与M4权威指南》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第12张图片
(5)IABR(中断激活状态)寄存器
中断激活寄存器一共有8个,每个寄存器包含32个激活位,总共可以控制256个中断激活状态,实际上只用到了240个(F407只用到了82个)。在《Cortex M3权威指南(中文)》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第13张图片
中断激活状态寄存器在处理器执行了中断对应的ISR(中断服务函数)第一条指令后,会被设置为1,只有当ISR返回时才会硬件清零。
中断激活状态寄存器是只读的,值为1时表示中断被激活,值为0时表示中断未激活。在《Cortex M3与M4权威指南》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第14张图片

(6)IP(中断优先级)寄存器
中断优先级寄存器一共有240个,每个寄存器有8bit可以设置中断的优先级,总共可以设置240个中断的优先级(F407只用到了82个)。在《Cortex M3权威指南(中文)》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第15张图片
在《Cortex M3与M4权威指南》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第16张图片

(7)STIR(软件触发中断)寄存器
软件触发中断寄存器有1个,大小为32bit,可以使用软件触发任意中断。在《Cortex M3权威指南(中文)》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第17张图片
当我们需要触发某个中断时,只需要将目标中断的序号写入到该寄存器即可,随后ISPR中断挂起寄存器对应位置1,等到更高优先级的中断执行完毕则会执行软件触发的中断。关于stm32f407中断序号在《STM32F4xx中文参考手册》描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第18张图片
也可以直接打开HAL库的中断源头文件定义(见stm32f407xx.h):
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第19张图片
(8)中断优先级分组寄存器
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第20张图片
中断优先级分组寄存器在《Cortex M3权威指南(中文)》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第21张图片
可以看到,一共有3bit用于设置优先级分组,也就是0-7。stm32f407只用到了5组,优先级分组0、1、2、3、4的含义如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第22张图片
(10)PRIMASK中断屏蔽寄存器
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器_第23张图片
如果BASEPRI寄存器的值为0,可以使用以下语句快速开/关全局中断响应:

__enable_irq(); // 使能全局中断响应
__disable_irq(); // 失能全局中断响应

你可能感兴趣的:(ARM内核,单片机开发,stm32,ARM,中断,HAL库)