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(); // 失能全局中断响应
相关推荐
万亿少女的梦1688 小时前
基于STM32F103C8T6与ASR Pro的语音控制四足机器人设计
stm32·语音识别·嵌入式系统·四足机器人·舵机控制
嵌入式-老费9 小时前
esp32开发与应用(与stm32f103工控板配合之上篇)
stm32·单片机·嵌入式硬件
周洲083011 小时前
裸机程序 vs RTOS架构深度对比|嵌入式项目选型标准、源码实战、优缺点全解析
stm32·嵌入式硬件
王光环1 天前
STM32H750串口一直进IRQ问题解决
stm32·单片机·嵌入式硬件
2401_854151551 天前
STM32 选项字节与读写保护(RDP)
stm32·单片机·嵌入式硬件
AI的探索之旅1 天前
AI Agent辅助立创EDA设计——从原理图到PCB
人工智能·stm32·硬件工程
振南的单片机世界2 天前
单片机:一颗芯片包办CPU、内存、外设的“单芯片计算机”
arm开发·stm32·单片机·嵌入式硬件
Dlrb12112 天前
51单片机--GPIO、按键、中断、蜂鸣器、PWM
单片机·嵌入式硬件·51单片机·定时器·中断
LuDvei2 天前
STM32串行通信DMA的使用
stm32·单片机·嵌入式硬件
似是燕归来2 天前
嵌入式工程师进阶指南:适配器编程设计模式一
c语言·stm32·适配器模式·嵌入式开发