如何开发嵌入式中断控制系统?

目录

1、中断向量表

2、NVIC(内嵌向量中断控制器)

3、中断使能

4、中断服务函数


在嵌入式开发过程中,中断处理是一个不可或缺的环节。本篇博文将以STM32微控制器为核心案例,深入解析中断处理在MCU开发中的关键步骤和策略。主要有以下几个关键点:

  • 中断向量表。
  • NVIC(内嵌向量中断控制器)。
  • 中断使能。
  • 中断服务函数。

通过这篇博文,读者将获得对STM32 MCU中断处理流程和逻辑的全面理解。

1、中断向量表

中断向量表是关键的数据结构,用于存储中断服务程序的入口地址,这些地址被称为中断向量。具体来说,当一个中断发生时,系统会自动跳转到中断向量表中对应的地址,从而执行相应的中断服务程序(函数)。这个表由半导体制造商预先定义,确保每个中断都有一个唯一的入口地址。在程序架构中,中断向量表位于最前面,起到了连接硬件中断信号和相应处理程序的桥梁作用。中断向量表在整个程序的最前面,比如 STM32F103 的中断向量表如下所示:

中断向量表都是链接到代码的最前面,比如一般 ARM 处理器都是从地址 0X00000000 开始执行指令的,那么中断向量表就是从 0X00000000 开始存放的。代码第 1 行的“__initial_sp”就是第一条中断向量,存放的是栈顶指针,接下来是第 2 行复位中断复位函数 Reset_Handler 的入口地址,依次类推,直到第 27 行的最后一个中断服务函数DMA2_Channel4_5_IRQHandler 的入口地址,这样 STM32F103 的中断向量表就建好了。

虽然ARM处理器默认从地址0X00000000开始执行程序,但在学习STM32时,我们通常将代码下载到从0X8000000地址开始的存储区域。这一做法似乎与处理器的初始执行地址不符,看起来可能导致错误。然而,为了解决这一潜在问题,Cortex-M架构引入了中断向量表偏移的概念。这使得开发者可以将中断向量表放置在任何所需的地址位置。中断向量表的具体偏移配置是在'SystemInit'函数中完成的,方法是向SCB_VTOR寄存器写入新的中断向量表首地址。这种灵活的配置方式有效地克服了初始地址和程序存储地址之间的潜在冲突,确保了中断处理的正确进行。

代码如下所示:

第 8 行和第 10 行就是设置中断向量表偏移,第 8 行是将中断向量表设置到 RAM 中,第10 行是将中断向量表设置到 ROM 中,基本都是将中断向量表设置到 ROM 中,也就是地址0X8000000 处。第 10 行用到了 FALSH_BASE 和 VECT_TAB_OFFSET,这两个都是宏,定义如下所示:

#define FLASH_BASE ((uint32_t)0x08000000)
#define VECT_TAB_OFFSET 0x0

因此第 10 行的代码就是:SCB->VTOR=0X080000000,中断向量表偏移设置完成。

2、NVIC(内嵌向量中断控制器)

NVIC(Nested Vectored Interrupt Controller)是ARM Cortex-M微控制器的一个关键组件,用于管理中断。各个芯片厂商在设计芯片的时候会对Cortex-M内核里面的NVIC进行裁剪,把不需要的部分去掉,所以说STM32的NVIC是Cortex-M3的NVIC 的一个子集。

其主要功能包括:

  • 中断优先级管理:NVIC允许为每个中断分配不同的优先级。这样,当多个中断同时发生时,处理器可以根据优先级来确定处理的顺序,确保更重要的任务得到优先处理。

  • 嵌套中断处理:NVIC支持中断的嵌套。这意味着一个高优先级的中断可以打断一个低优先级的中断服务例程,使得系统能够及时响应更紧急的任务。

  • 向量化中断处理:每个中断都有一个唯一的向量地址,该地址指向相应的中断服务例程。当中断发生时,处理器可以直接跳转到相应的服务例程,无需通过传统的中断查询方式,从而提高了处理速度。

  • 中断屏蔽与启用:NVIC允许程序动态地使能或禁用特定中断。这种灵活性使得系统可以在不同的操作环境下,根据需要调整其中断响应。

  • 中断挂起与恢复:NVIC能够挂起正在执行的中断,并在适当的时候恢复中断的处理。这对于管理复杂的中断场景尤为重要。

  • 中断状态管理:NVIC提供接口来查询中断的状态,例如检查哪些中断处于挂起状态或哪些中断正在被处理。这有助于更好地理解和控制系统的行为。

  • 低功耗模式支持:在低功耗模式下,NVIC可以帮助处理器在接收到中断信号时唤醒,这对于节能和延长电池使用寿命至关重要。

  • 系统复位管理:NVIC还负责处理来自系统的复位请求,确保系统能够在出现问题时安全地重新启动。

通过查看STM32 NVIC寄存器,可以更清晰的解NVIC的主要功能:

/**中断	 NVIC 结构体定义*/
typedef struct
{__IO uint32_t ISER[8];                 /*!<Offset: 0x000  中断使能寄存器          */uint32_t RESERVED0[24];                                   __IO uint32_t ICER[8];                 /*!<Offset: 0x080  中断清除寄存器          */uint32_t RSERVED1[24];                                    __IO uint32_t ISPR[8];            	 /*!<Offset: 0x100  中断使能悬起寄存器      */uint32_t RESERVED2[24];                                   __IO uint32_t ICPR[8];                 /*!<Offset: 0x180  中断清除悬起寄存器 	  */uint32_t RESERVED3[24];                                    __IO uint32_t IABR[8];            	 /*!<Offset:0x200   中断有效位寄存器       */uint32_t RESERVED4[56];                                   __IO uint8_t  IP[240];                 /*!< Offset: 0x300  中断优先级寄存器 (8Bit wide) */uint32_t RESERVED5[644];                                  __O  uint32_t STIR;                    /*!< Offset: 0xE00  软件触发中断寄存器     */
}  NVIC_Type;   

3、中断使能

中断使能是指允许特定的中断源向处理器发出中断请求的过程。当一个中断被使能后,如果相应的事件发生(如外部信号、定时器溢出等),中断控制器会捕捉到这个事件,并通知处理器中断程序需要被执行。

中断使能通常通过设置特定的控制寄存器来完成。这些寄存器可能是微控制器的一部分,也可能位于外部设备中。通过编写特定的值到这些寄存器,可以选择性地使能或禁用特定的中断。

要使用某个外设的中断,肯定要先使能这个外设的中断,以 STM32F103 的 PE2 这个 IO 为例,假如我们要使用 PE2 的输入中断肯定要使用如下代码来使能对应的中断:

NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;        //子优先级 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;              //使能外部中断通道
NVIC_Init(&NVIC_InitStructure);

4、中断服务函数

中断服务函数是响应中断的专门函数。当特定的中断事件发生时,系统自动调用对应的中断服务函数来处理该事件。

当中断发生时,处理器暂停当前正在执行的任务,保存当前任务的上下文(如寄存器状态),然后跳转到相应的中断服务函数执行中断处理。一旦中断处理完成,处理器恢复之前任务的上下文,并继续执行被中断的任务。

同样以 STM32F103 的 PE2 为例,其中断服务函数如下所示:

/* 外部中断 2 服务程序 */
void EXTI2_IRQHandler(void)
{/* 中断处理代码 */
}

当 PE2 引脚的中断触发以后就会调用其对应的中断处理函数 EXTI2_IRQHandler,我们可以在函数 EXTI2_IRQHandler 中添加中断处理代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/221728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java - CAP定理

CAP 定理指的是在一个分布式系统中&#xff0c;一致性 Consistency 、可用性 Availability 、分区容 错性 Partition tolerance &#xff0c;三者不可兼得。  一致性&#xff08; C &#xff09;&#xff1a;分布式系统中多个主机之间是否能够保持数据一致的特性。即&…

HttpSessionListener监听器和HttpSessionAttributeListener监听器

1.作用&#xff1a;监听Session创建或销毁&#xff0c;即生命周期监听 2.相关方法&#xff1a; //void sessionCreated(HttpSessionEvent se):创建session时调用 //void sessionDestroyed(HttpSessionEvent se):销毁sessio时调用 3.使用场景&#xff1a; 和前面的ServletCo…

mysql自动安装脚本(快速部署mysql)

mysql_install - 适用于生产环境单实例快速部署 MySQL8.0 自动安装脚本 mysql8_install.sh&#xff08;执行前修改一下脚本里的配置参数&#xff0c;改成你自己的&#xff09;&#xff08;博客末尾&#xff09; my_test.cnf&#xff08;博客末尾&#xff09;&#xff08;这个…

C语言预读取技术 __builtin_prefetch

__builtin_prefetch 是一个编译器内置函数&#xff0c;用于在编译时向编译器发出指令&#xff0c;要求在执行期间预取内存数据。它通常用于提高程序的性能&#xff0c;特别是对于那些需要频繁访问内存的情况。 __builtin_prefetch 函数的语法如下&#xff1a;c __builtin_prefe…

力扣24 两两交换链表中的节点 Java版本

文章目录 题目解题方法Code 题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;hea…

【五】Python 代理模式

文章目录 5.1 代理模式概述5.1.1 代理介绍5.1.2 代理模式的作用 5.2 代理模式的UML类图5.3 了解不同类型的代理5.3.1虚拟代理5.3.2 远程代理5.3.3 保护代理5.3.4 智能代理 5.4 现实世界中的代理模式5.5 代理模式的优点5.6 门面模式和代理模式之间的比较 5.1 代理模式概述 5.1.…

VSCode 配置自动生成头文件

相关文章 VSCode 开发C/C实用插件分享——codegeex VSCode 开发C/C实用插件分享——koroFileHeader VSCode 配置自动生成头文件 一、snippets二、配置步骤三、效果展示 一、snippets 相信大家对C、C都头文件都不陌生&#xff0c;都会发现每个头文件都会包括下面的这些格式&…

Cent OS7 磁盘挂载:扩展存储空间和自动挂载

文章目录 &#xff08;1&#xff09;概述&#xff08;2&#xff09;查看磁盘使用情况&#xff08;3&#xff09;VMware虚拟机挂载磁盘&#xff08;4&#xff09;物理机磁盘挂载&#xff08;5&#xff09;ntfs硬盘处理 &#xff08;1&#xff09;概述 在Linux系统中&#xff0c…

C#教程(二):继承

1、介绍 在C#中&#xff0c;继承是一种面向对象编程的概念&#xff0c;它允许一个类&#xff08;子类/派生类&#xff09;获得另一个类&#xff08;父类/基类&#xff09;的属性和方法。这使得可以通过构建新的类&#xff0c;重用现有类的功能&#xff0c;并在不同的类之间建立…

智能优化算法应用:基于共生生物算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于共生生物算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于共生生物算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.共生生物算法4.实验参数设定5.算法结果6.…

拓展 Amazon S3 技术边界:Amazon S3 Express One Zone 的创新之路

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 自 Amazon S3 服务推出以来&#xff0c;一直是全球各行各业数百万客…

学习MS Dynamics AX 2012编程开发 1. 了解Dynamics AX 2012

在本章中&#xff0c;您将了解开发环境的结构以及Microsoft Dynamics AX中的开发人员可以访问哪些工具。在本书的第一步演练之后&#xff0c;您将很容易理解著名的Hello World代码&#xff0c;您将知道应用程序对象树中的不同节点代表什么。 以下是您将在本章中学习的一些主题…

linux7安装python3.12.1教程

1.下载tar.gz包 地址&#xff1a;Python Release Python 3.12.1 | Python.org 2.上传包到linux服并解压 cd /home/local/ ll tar -zxvf Python-3.12.1.tgz 3.安装编译python所需环境 yum install -y gcc yum install -y zlib* yum -y install zlib-devel bzip2-devel opens…

JIRA 重置管理员密码

忘记了JIRA管理员密码改怎么办&#xff1f; 在Jira6.4之前需要进到数据库里强行修改数据信息&#xff0c;后来的版本就有好多了&#xff0c;可以设置一个启动参数&#xff0c;帮您找回密码&#xff0c;下面就介绍一下如何找回管理员密码 设置启动参数重置管理员密码 找到设置…

大象elephant目标检测数据集VOC+YOLO格式2300张

大象是长鼻目象科的哺乳动物&#xff0c;有两个属&#xff0c;是世界上最大的陆生动物。其像柱子一样的四肢和宽厚的脚掌可以稳稳支撑住庞大的身体。巨大的头上长有蒲扇状的大耳朵和长且有弹性的鼻子。象耳上有丰富的血管&#xff0c;可以有效散热。鼻子和上唇合而为一的象鼻由…

计算机网络——网络层——OSPF协议的介绍

什么是 OSPF &#xff1f; OSPF 是一个基于链路状态的自治系统内部路由协议&#xff0c;在 TCP/IP 的网络层中进行路由选择&#xff0c;常用于构建大型企业网络或者服务上的骨干网络。在互联网核心路由器之间也可以使用。 OSPF 概述 OSPF 使用的是 Dijkstra&#xff08;最短…

制作蓝牙小车(一)

制作控制蓝牙小车app 想制作一个蓝牙小车&#xff0c;通过手机app程序操控小车运行&#xff0c;制作分2个部分&#xff08;app制作&#xff0c;蓝牙小车硬件以及程序制作&#xff09;&#xff0c;先完成第一个部分app制作&#xff0c;本次app是通过androidstudio软件来制作安卓…

FFmpegd的AVBSF

本章主要介绍AVBSF 文章目录 结构体定义对外函数常见的过滤器 从名字我们可以知道这是个码流过滤器&#xff0c;我们最常用的是一个叫做h264_mp4toannexb_bsf的东东 这个过滤器的作用是把h264以MP4格式的NALU转换为annexb&#xff08;0x000001&#xff09; const AVBitStreamF…

centos安装了curl却报 -bash: curl: command not found

前因 我服务器上想用curl下载docker-compress&#xff0c;发现没有curl命令&#xff0c;就去下载安装&#xff0c;安装完成之后&#xff0c;报-bash: curl: command not found 解决方法 [rootcentos ~]# rpm -e --nodeps curl warning: file /usr/bin/curl: remove failed: …

python每日学10:关于python实用版本的选择

用python也有好几年了&#xff0c;也会经常安装python&#xff0c;因为有工作需要&#xff0c;可能在各个地方使用python&#xff0c;自己的电脑也经常重装&#xff0c;重装后会装python&#xff0c;还有的时候&#xff0c;装的包太多了&#xff0c;影响整个环境的使用&#xf…