STM32 外部中断和NVIC嵌套中断向量控制器

news/2025/2/21 10:50:03/

目录

背景

外部中断/事件控制器(EXTI)

主要特性

功能说明

外部中断线

嵌套向量中断控制器

特性

‌中断线(Interrupt Line)

中断线的定义和作用

STM32中断线的分类和数量

优先级分组

抢占优先级(Preemption Priority)

子优先级(Sub-Priority)

外部中断的配置

第一步、使能GPIO组和AFIO时钟的外设

第二步、配置外部中断线路

第三步、配置EXTI‌

第四步、配置NVIC‌

‌第五步、编写中断服务函数‌

程序实例


背景

单片机开发过程中经常要用到外部中断(端口为双边沿触发、上升沿、下降沿触发)。

在配置中断的过程中,又需要涉及到中断优先级的配置,中断优先级配置就要NVIC来设置。

外部中断/事件控制器(EXTI)

对于互联型产品,外部中断 / 事件控制器由 20 个产生事件 / 中断请求的边沿检测器组成,对于其它
产品,则有 19 个能产生事件 / 中断请求的边沿检测器。每个输入线可以独立地配置输入类型 ( 脉冲
或挂起 ) 和对应的触发事件 ( 上升沿或下降沿或者双边沿都触发 ) 。每个输入线都可以独立地被屏
蔽。挂起寄存器保持着状态线的中断请求。

主要特性

EXTI 控制器的主要特性如下:
● 每个中断 / 事件都有独立的触发和屏蔽
● 每个中断线都有专用的状态位
● 支持多达 20 个软件的中断 / 事件请求
● 检测脉冲宽度低于 APB2 时钟宽度的外部信号。

功能说明

要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置 2 个触发寄存器,同时在中
断屏蔽寄存器的相应位写 ’1’ 允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个
中断请求,对应的挂起位也随之被置 ’1’ 。在挂起寄存器的对应位写 ’1’ ,将清除该中断请求。
如果需要产生事件,必须先配置好并使能事件线。根据需要的边沿检测通过设置 2 个触发寄存
器,同时在事件屏蔽寄存器的相应位写 ’1’ 允许事件请求。当事件线上发生了需要的边沿时,将
产生一个事件请求脉冲,对应的挂起位不被置 ’1’
通过在软件中断 / 事件寄存器写 ’1’ ,也可以通过软件产生中断 / 事件请求。

外部中断线

事件与中断的区别

嵌套向量中断控制器

特性

68 个可屏蔽中断通道 ( 不包含 16 Cortex™-M3 的中断线 )
16 个可编程的优先等级 ( 使用了 4 位中断优先级 )

中断线(Interrupt Line)

‌是指用于触发中断请求的信号线。在STM32微控制器中,中断线是连接外设和中断控制器的重要部分,用于检测外设事件的发生并触发中断请求

中断线的定义和作用

中断线是STM32微控制器中用于检测外部或内部事件(如定时器溢出、按键输入、串口数据到达等)的信号线。当这些事件发生时,中断线会向中断控制器发送中断请求,中断控制器根据优先级管理机制决定是否响应该请求。如果响应,则会暂停当前执行的程序,转而执行相应的中断服务程序(ISR),处理完中断后再返回到原来的程序继续执行‌12。

STM32中断线的分类和数量

STM32的中断线可以分为内核中断和外部中断。以STM32F103C8T6为例,它支持70个中断,其中包括10个内核中断和60个外部中断。外部中断涵盖了EXTI(外部中断/事件控制器)、TIM(定时器)、ADC(模拟数字转换器)、I2C、SPI等外设‌

NVIC把外部的中断信号关联到内核中,将各种中断进行分门别类,按前后顺序发送给内核。
嵌套中断向量控制器中的嵌套,表示中断也可以被其他更高优先级的中断事件中断
这就涉及到中断分组的概念

优先级分组

抢占优先级(Preemption Priority)

用于决定当多个中断同时发生时,哪个中断的处理器会被首先服务。抢占优先级高的中断会抢占正在执行的低优先级中断。

子优先级(Sub-Priority)

在两个或多个中断具有相同抢占优先级时,子优先级决定了哪个中断被首先服务。如果两个中断具有相同的抢占优先级,则子优先级较低的中断会先被服务。

抢占优先级和子优先级的设置值越低优先级越高

如果中断优先级完全相同,同时触发的话,查看谁在中断列表前面可知谁先执行

外部中断的配置


配置STM32的中断线通常包括以下几个步骤:

第一步、使能GPIO组和AFIO时钟的外设

需要通过设置AFIO寄存器来配置外部中断的输入模式。

第二步、配置外部中断线路

首先需要配置触发中断的外设,如GPIO、定时器、ADC等。


第三步、配置EXTI‌

设置外部中断的具体参数,如触发条件等。


第四步、配置NVIC‌

通过NVIC(Nested Vectored Interrupt Controller)设置中断的优先级和分组。


‌第五步、编写中断服务函数‌

根据不同的中断源编写相应的中断服务函数。例如,对于EXTI4的中断服务函数命名为EXTI4_IRQHandler,对于EXTI9_5的中断服务函数命名为EXTI9_5_IRQHandler‌
通过以上步骤,可以有效地配置和使用STM32的中断线,实现高效的中断处理和系统响应。

程序实例

void NVIC_Configuration(void){ //嵌套中断向量控制器 的设置NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
}
void PORTA6_EXITI_INIT (void){	 //按键中断初始化NVIC_InitTypeDef  NVIC_InitStruct;	//定义结构体变量EXTI_InitTypeDef  EXTI_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //启动GPIO时钟 (需要与复用时钟一同启动)     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);//配置端口中断需要启用复用时钟//第1个中断	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource4);  //定义 GPIO  中断EXTI_InitStruct.EXTI_Line=EXTI_Line4;  //定义中断线EXTI_InitStruct.EXTI_LineCmd=ENABLE;              //中断使能EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;     //中断模式为 中断EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;   //下降沿触发EXTI_Init(& EXTI_InitStruct);NVIC_InitStruct.NVIC_IRQChannel=EXTI4_IRQn;   //中断线     NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;  //使能中断NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=2;  //抢占优先级 2NVIC_InitStruct.NVIC_IRQChannelSubPriority=2;     //子优先级  2NVIC_Init(& NVIC_InitStruct);}
void  EXTI4_IRQHandler(void){if(EXTI_GetITStatus(EXTI_Line4)!=RESET){//判断某个线上的中断是否发生 //---中断处理部分 ---EXTI_ClearITPendingBit(EXTI_Line4);   //清除 LINE 上的中断标志位}     
}


http://www.ppmy.cn/news/1573449.html

相关文章

Go语言实现单例模式

单例模式 单例模式分为饿汉和懒汉模式,前者是在程序启动的时候就初始化一个单例对象,后者是使用到这个单例的时候,才会初始化一个单例对象。 饿汉模式 package mainimport "fmt"type Singleton struct { }var instance *Singleto…

deepseek-r1落地指南(搭建web-ui | 搭建本地代码编辑器)

deepseek-r1落地指南(搭建web-ui | 搭建本地代码编辑器) 写在前面 前两天写了一篇《deepseek-r1本地部署指南》,今天就deepseek-r1本地部署,讲解一下本地部署的大模型如何落地(应用),以便提高工…

NLLB 与 ChatGPT 双向优化:探索翻译模型与语言模型在小语种应用的融合策略

作者:来自 vivo 互联网算法团队- Huang Minghui 本文探讨了 NLLB 翻译模型与 ChatGPT 在小语种应用中的双向优化策略。首先介绍了 NLLB-200 的背景、数据、分词器和模型,以及其与 LLM(Large Language Model)的异同和协同关系。接着…

sqli-labs靶场实录(四): Challenges

sqli-labs靶场实录: Challenges Less54确定字段数获取数据库名获取表名获取列名提取密钥值 Less55Less56Less57Less58爆库构造爆表构造爆列构造密钥提取构造 Less59Less60Less61Less62爆库构造 Less63Less64Less65免责声明: Less54 本关开始上难度了 可以看到此关仅…

跳跃游戏 II - 贪心算法解法

问题描述&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums&#xff0c;我们从数组的第一个元素 nums[0] 开始。每个元素 nums[i] 表示从索引 i 可以跳跃的最大长度&#xff0c;换句话说&#xff0c;从位置 i&#xff0c;你可以跳到位置 i j&#xff0c;其中 0 < j &…

PHP 流程控制与错误处理

PHP 学习资料 PHP 学习资料 PHP 学习资料 在 PHP 编程中&#xff0c;流程控制语句用于控制程序的执行顺序&#xff0c;而错误处理和异常处理机制则确保程序在遇到问题时能够稳定运行&#xff0c;并提供有意义的反馈。以下将详细介绍 PHP 中的条件语句、循环语句的使用&#x…

ib网络状态探测

在 InfiniBand 网络中&#xff0c;Host Channel Adapter&#xff08;HCA&#xff09;是关键组件&#xff0c;了解其状态和配置对于网络管理和故障排查至关重要。以下是一些常用的命令&#xff0c;用于查询和管理 HCA 的状态和配置。 常用命令 ibstat 功能&#xff1a;显示 HCA…

阶段 1:Kafka基础认知

核心知识点 Kafka 三大核心角色&#xff1a; Producer&#xff08;生产者&#xff09; &#xff1a;负责向 Kafka topic 推送数据。可以理解为数据流的发起者。Broker&#xff1a;Kafka 服务器节点&#xff0c;负责存储数据流。Kafka 集群由多个 broker 组成。Consumer&#xf…