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)系统异常

(2)外部中断(部分)

...

1.1 系统异常寄存器

(1)SHP(系统异常优先级)寄存器

系统异常优先级寄存器共有12个,可以用来设置优先级可配置的系统异常。

(2)SHCSR(系统异常控制和状态)寄存器

系统异常控制和状态寄存器可以设置或者读取当前系统异常是否使能,写1使能系统异常,读取值为1表示系统异常使能。

1.2 外部中断寄存器

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

c 复制代码
#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权威指南(中文)》中的描述如下:

中断对应使能位写1则使能中断,写0无任何动作,读对应位可以获取当前设置值。在《Cortex M3与M4权威指南》中的描述如下:

(2)ICER(中断失能)寄存器

中断失能寄存器一共有8个,每个寄存器包含32个失能位,总共可以控制256个中断失能状态,实际上只用到了240个(F407只用到了82个)。在《Cortex M3权威指南(中文)》中的描述如下:

中断对应失能位写1则失能中断,写0无任何动作,读对应位可以获取当前设置值。在《Cortex M3与M4权威指南》中的描述如下:

(3)ISPR(中断挂起)寄存器

中断挂起寄存器一共有8个,每个寄存器包含32个挂起位,总共可以控制256个中断挂起状态,实际上只用到了240个(F407只用到了82个)。在《Cortex M3权威指南(中文)》中的描述如下:

中断对应挂起位写1则挂起中断,写0无任何动作,读对应位可以获取当前设置值。在《Cortex M3与M4权威指南》中的描述如下:

(4)ICPR(中断解挂)寄存器

中断解挂寄存器一共有8个,每个寄存器包含32个解挂位,总共可以控制256个中断解挂状态,实际上只用到了240个(F407只用到了82个)。在《Cortex M3权威指南(中文)》中的描述如下:

中断对应解挂位写1则挂起中断,写0无任何动作,读对应位可以获取当前中断挂起状态。在《Cortex M3与M4权威指南》中的描述如下:

(5)IABR(中断激活状态)寄存器

中断激活寄存器一共有8个,每个寄存器包含32个激活位,总共可以控制256个中断激活状态,实际上只用到了240个(F407只用到了82个)。在《Cortex M3权威指南(中文)》中的描述如下:

中断激活状态寄存器在处理器执行了中断对应的ISR(中断服务函数)第一条指令后,会被设置为1,只有当ISR返回时才会硬件清零。

中断激活状态寄存器是只读的,值为1时表示中断被激活,值为0时表示中断未激活。在《Cortex M3与M4权威指南》中的描述如下:

(6)IP(中断优先级)寄存器

中断优先级寄存器一共有240个,每个寄存器有8bit可以设置中断的优先级,总共可以设置240个中断的优先级(F407只用到了82个)。在《Cortex M3权威指南(中文)》中的描述如下:

在《Cortex M3与M4权威指南》中的描述如下:

(7)STIR(软件触发中断)寄存器

软件触发中断寄存器有1个,大小为32bit,可以使用软件触发任意中断。在《Cortex M3权威指南(中文)》中的描述如下:

当我们需要触发某个中断时,只需要将目标中断的序号写入到该寄存器即可,随后ISPR中断挂起寄存器对应位置1,等到更高优先级的中断执行完毕则会执行软件触发的中断。关于stm32f407中断序号在《STM32F4xx中文参考手册》描述如下:

也可以直接打开HAL库的中断源头文件定义(见stm32f407xx.h):

(8)中断优先级分组寄存器

中断优先级分组寄存器在《Cortex M3权威指南(中文)》中的描述如下:

可以看到,一共有3bit用于设置优先级分组,也就是0-7。stm32f407只用到了5组,优先级分组0、1、2、3、4的含义如下:

(10)PRIMASK中断屏蔽寄存器

如果BASEPRI寄存器的值为0,可以使用以下语句快速开/关全局中断响应:

c 复制代码
__enable_irq(); // 使能全局中断响应
__disable_irq(); // 失能全局中断响应
相关推荐
是梅梅森10 小时前
GPIO配置-PIN_Speed的理解
stm32
Jack1530276827911 小时前
什么是上拉电阻器?上拉和下拉电阻的典型应用
stm32·单片机·嵌入式硬件·智能家居·医疗器械·新能源汽车充电枪锁
不想写代码的我13 小时前
STM32F1+HAL库+FreeTOTS学习2——STM32移植FreeRTOS
stm32·单片机·学习·freertos
光子物联单片机13 小时前
零基础STM32单片机编程入门(八)定时器PWM输入实战含源码视频
stm32·单片机·嵌入式硬件·mcu
luckyme_15 小时前
STM32-TIM定时器
stm32·单片机·嵌入式硬件
小白橘颂16 小时前
STM32第十六课:WiFi模块的配置及应用
stm32·单片机·嵌入式硬件·mcu·物联网
luckyme_16 小时前
STM32-Unix时间戳和BKP备份寄存器以及RTC实时时钟
stm32·实时音视频·unix
shawn_shao17 小时前
使用Keil将STM32部分程序放在RAM中运行
stm32·单片机·嵌入式硬件
luckyme_17 小时前
STM32-SPI和W25Q64
stm32·单片机·嵌入式硬件
尚久龙17 小时前
STM32利用FreeRTOS实现4个led灯同时以不同的频率闪烁
stm32·单片机·嵌入式硬件·看门狗·f103c8t6