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

这篇具有很好参考价值的文章主要介绍了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):中断相关寄存器,ARM内核,单片机开发,stm32,ARM,中断,HAL库
(2)外部中断(部分)
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器,ARM内核,单片机开发,stm32,ARM,中断,HAL库

Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器,ARM内核,单片机开发,stm32,ARM,中断,HAL库

1.1 系统异常寄存器

(1)SHP(系统异常优先级)寄存器
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器,ARM内核,单片机开发,stm32,ARM,中断,HAL库
系统异常优先级寄存器共有12个,可以用来设置优先级可配置的系统异常。
(2)SHCSR(系统异常控制和状态)寄存器
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器,ARM内核,单片机开发,stm32,ARM,中断,HAL库
系统异常控制和状态寄存器可以设置或者读取当前系统异常是否使能,写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):中断相关寄存器,ARM内核,单片机开发,stm32,ARM,中断,HAL库
中断对应使能位写1则使能中断,写0无任何动作,读对应位可以获取当前设置值。在《Cortex M3与M4权威指南》中的描述如下:
Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器,ARM内核,单片机开发,stm32,ARM,中断,HAL库

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

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

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

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

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

到了这里,关于Cortex-M3/M4内核中断及HAL库函数详解(1):中断相关寄存器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FreeRTOS在Cortex-M系列内核中遇到的关于系统滴答中断的问题

    众所周知,在Cortex-M内核中,系统节拍由Systick时钟提供,当配置好系统滴答时钟后,每次时钟中断就会触发中断处理函数 xPortSysTickHandler(),   这部分主要是依靠  xTaskIncrementTick(), 来判断任务切换是否在此次系统时钟中断时被需要。如果是,则PendSV标记置位,等待触发PendS

    2024年02月08日
    浏览(45)
  • 【ARM Cortex-M 系列 1.1 -- Cortex-M33 与 M4 差异 详细介绍】

    请阅读 【嵌入式开发学习必备专栏 之 Cortex-Mx 专栏】 在移植 RT-Thread 到 瑞萨RA4M2(Cortex-M33)上时,遇到了hardfault 问题,最后使用了Cortex-M4中的调度相关的函数后,OS 可以正常调度了。所以这里做下 M33与 M4的关系梳理。 ARM Cortex-M33 和 Cortex-M4 都是 ARM 公司设计的32位RISC微处理

    2024年01月21日
    浏览(47)
  • 【ARM Cortex-M 系列 1 -- Cortex-M0, M3, M4, M7, M33 差异】

    请阅读 【ARM Coresight | AMBA BUS| Armv8/v9 | GCC 专栏导读】 下篇文章:ARM Cortex-M 系列 2 – CPU 之 Cortex-M7 介绍 Cortex-M0/M0+ 介绍 Cortex-M0 是 ARM 公司推出的一款微控制器(MCU)核心。这个核心是基于 ARMv6-M 架构设计的, 只支持 56 条指 令的小指令集,大部分指令是 16 位指令, 是 ARM Cor

    2024年02月17日
    浏览(47)
  • 【ARM Cortex-M 系列 1 -- Cortex-M0, M3, M4, M7, M33, M35P 差异】

    请阅读 【ARM Coresight | AMBA BUS| Armv8/v9 | GCC 专栏导读】 下篇文章:ARM Cortex-M 系列 2 – CPU 之 Cortex-M7 介绍 Cortex-M0/M0+ 介绍 Cortex-M0 是 ARM 公司推出的一款微控制器(MCU)核心。这个核心是基于 ARMv6-M 架构设计的, 只支持 56 条指 令的小指令集,大部分指令是 16 位指令, 是 ARM Cor

    2024年02月05日
    浏览(45)
  • ARM Cortex-M3内核

    目录 ARM Cortex-M3内核 存储器系统 外设接口 时钟和电源管理 中断控制器 DMA控制器 STM32F1系列微控制器是一款基于ARM Cortex-M3内核的嵌入式芯片,其架构组成主要包括以下几个方面:  ARM Cortex-M3内核:STM32F1系列微控制器采用了ARM Cortex-M3内核,该内核是一种高性能、低功耗的32位

    2024年02月07日
    浏览(44)
  • ARM Cortex-M3内核理解

    做一个对社会有用的人!不抱怨,不气馁! 目录 前言 1 ARM处理器家族 2 什么是ARM Cortex-M处理器 2.1 Cortex-M3 2.2 M3处理器到微控制器 2.3 ARM处理器的发展 2.4 Thumb ISA的架构版本 2.4.1 指令集的概念 2.5 软件开发流程  2.5.1 轮询 3、技术综述 3.1、Cortex-M3简介 3.1.1 处理器类型 3.1.2 指令

    2024年02月08日
    浏览(38)
  • 第七章嵌套矢量中断控制器(Cortex-M7 Processor)

    目录   第七章嵌套矢量中断控制器  7.1关于NVIC 7.2NVIC功能描述 7.2.1低功耗模式 7.2.2电平与脉冲中断 7.3NVIC程序员模型  7.3.1中断控制器类型寄存器 本章描述了嵌套矢量中断控制器(NVIC)。它包含以下部分: 关于NVIC在7-2页。 NVIC功能描述见第7-3页。 NVIC程序员模型在第7-4页。 NVIC为

    2024年02月16日
    浏览(40)
  • 中断相关操作函数HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()

    HAL_NVIC_SetPriority() 函数是一个用于 设置中断优先级的函数 ,其定义如下: 其中,参数含义如下: IRQn :指定要设置优先级的中断号,类型为IRQn_Type,定义在stm32f4xx.h头文件中; PreemptPriority :指定抢占优先级,取值范围为0~15,其中0表示最高优先级,15表示最低优先级; SubP

    2024年02月07日
    浏览(34)
  • STM32 HAL库的串口中断服务函数详解

    最近在实现利用上位机通过串口发送指令给下位机执行操作的实验,在之前学习串口的过程中我就一直有一个疑惑,那就是为什么在串口中断回调函数内除了要加上自己的操作以外还要在末尾再执行一次 接收中断 ,在查阅了一些资料后我才发现原来和 中断服务函数 有关 我

    2024年02月10日
    浏览(43)
  • 【ARMv8M Cortex-M33 系列 7.4 -- 如何使能 usagefault | memmange fault | bus fault 中断】

    请阅读 【嵌入式开发学习必备专栏 之 ARM Cortex-Mx专栏】 由于文章【ARMv8M Cortex-M33 系列 7.2 – HardFault 问题定位 1】 中提到了HardFault 的发生是由于其它异常所升级导致的,所以就需要调查下如何是能其它异常中断。 在 ARM Cortex-M33 核心上启用 UsageFault 、 MemManageFault 和 BusFault 异

    2024年01月20日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包