欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 焦点 > [STM32 标准库]EXTI应用场景 功能框图 寄存器

[STM32 标准库]EXTI应用场景 功能框图 寄存器

2025/5/25 21:35:34 来源:https://blog.csdn.net/weixin_69076249/article/details/145422239  浏览:    关键词:[STM32 标准库]EXTI应用场景 功能框图 寄存器

一、EXTI

外部中断在嵌入式系统中有广泛的应用场景,如按钮开关控制,传感器触发,通信接口中断等。其原理都差不多,STM32会对外部中断引脚的边沿进行检测,若检测到相应的边沿会触发中断,在中断中做出相应的处理。
例如:

  • 开关按下时,其引脚电平会发生变化;
  • 传感器检测的参数超过阈值,会传输一个电平信号;

二、EXTI功能框图

在这里插入图片描述

EXTI可分为两大部分功能:一个产生中断,另一个产生事件,这两个功能从硬件上有所不同;
产生中断是上图中至NCI中断控制器,产生事件是上图中脉冲发生器

1、产生中断的电路流程:

  • 输入线:EXTI输入线路有19个中断/事件输入线,可通过寄存器设置成任意一个GPIO,或者一些外设事件。输入线一般是检测电平变化的信号。
  • 边沿检测电路:通过设置上升沿和下降沿触发寄存器来控制信号触发,若检测到有边沿跳变输出有效信号1至与或门。
  • 与或门电路:与或门有1则输出1,信号输入端有两个,一个来自边沿检测电路,另一个来自程序控制启动中断/事件线。是否允许程序控制启动,是由软件中断事件寄存器控制。
  • 图中上方的与门电路:与门全1才为1,若中断屏蔽寄存器为0,不论与或门电路输出的为1还是0都是输出0;若中断屏蔽寄存器为1,则与门输出的信号由与或门输出信号决定。因此,中断屏蔽寄存器可以控制是否产生中断的目的。与门电路输出1时,会把请求挂起寄存器对应位置1。
  • NVIC中断控制器:将请求挂起寄存器的内容输出到NVIC内,从而实现系统中断事件控制。

2、产生事件的电路流程:与产生中断的电路流程前三个一样

  • 图中下方的与门电路:与门全1才为1, 若事件屏蔽寄存器为0,不论与或门电路输出的为1还是0都是输出0;若事件屏蔽寄存器为1,则与门输出的信号由与或门输出信号决定。因此,事件屏蔽寄存器可以控制是否产生事件的目的。
  • 脉冲信号发生器:当其输入端为1时,就会产生一个脉冲信号;当其输入端为0时,就不会输出脉冲。脉冲信号可以给其他外设电路使用,一般用来触发TIM或者ADC开始转换。

三、EXTI寄存器

  • 中断屏蔽寄存器(EXTI_IMR):其决定了是否可以开启中断;
  • 事件屏蔽寄存器(EXTI_EMR):其决定了是否可以开启事件输出;
  • 上升沿触发选择寄存器(EXTI_RTSR):其决定了输入线是否允许上升沿触发;
  • 下降沿触发选择寄存器(EXTI_FTSR):其决定了输入线是否允许上升沿触发;
  • 软件中断事件寄存器(EXTI_SWIER):其决定了是否内部软件可以产生中断达到EXTI目的;
  • 挂起寄存器(EXTI_PR):查看是否发生了触发请求;

外部唤醒线是边沿触发的,这些线上不能出现毛刺信号。在写EXTI_RTSR或者EXTI_FTSR寄存器时,在外部中断线上的上升沿或者下降沿信号不能被识别,挂起位也不会被置位。在同一中断线上,可以同时设置上升沿和下降沿触发。即任一边沿都可触发中断。

四、配置流程

实验内容:通过外部中断的方式,检测PB14引脚的下降沿

1、开启GPIO,AFIO时钟

	/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//开启GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);		//开启AFIO的时钟,外部中断必须开启AFIO的时钟

2、设置GPIO工作模式

	/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);						//将PB14引脚初始化为上拉输入

3、设置IO口与中断线的映射关系

这里用到的是PB14引脚,所以对应着EXTI线14

	/*AFIO选择中断引脚*/GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//将外部中断的14号线映射到GPIOB,即选择PB14为外部中断引脚

4、配置外部中断(EXTI)

EXTI结构体成员:

  • EXTI_Line:中断/时间线选择,可选EXTI0-EXTI19;
  • EXTI_Mode:可选为产生中断或者产生事件,这里为产生中断;
  • EXTI_Trigger:边沿触发事件,可选上升或者下降,后者上升和下降;
  • EXTI_LineCmd: 控制是否使能EXTI线;
	/*EXTI初始化*/EXTI_InitTypeDef EXTI_InitStructure;						//定义结构体变量EXTI_InitStructure.EXTI_Line = EXTI_Line14;					//选择配置外部中断的14号线EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//指定外部中断线使能EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;			//指定外部中断线为中断模式EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;		//指定外部中断线为下降沿触发EXTI_Init(&EXTI_InitStructure);								//将结构体变量交给EXTI_Init,配置EXTI外设

5、配置中断优先级(NVIC),并使能中断

EXTI配置好了之后,需要进一步配置NVIC,设置中断引脚的优先级等,并将中断进行使能。
其中,最主要的是选择中断源NVIC_IRQChannel,中断源在stm32f10x.h文件中进行查找。
在本次实验当中,PB14对应的中断输入线是EXTI 14,所以选择中断源EXTI15_10_IRQn

	/*NVIC配置*/NVIC_InitTypeDef NVIC_InitStructure;						//定义结构体变量NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;		//选择配置NVIC的EXTI15_10线NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//指定NVIC线路使能NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;	//指定NVIC线路的抢占优先级为1NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//指定NVIC线路的响应优先级为1NVIC_Init(&NVIC_InitStructure);								//将结构体变量交给NVIC_Init,配置NVIC外设

6、编写中断服务函数

中断服务函数的名称在startup_stm32f10x_mx.s启动文件当中查找,函数内容如下:

  • 首先,检查EXTI输入线的中断标志位是否被设置。
  • 如果设置了,那么执行与EXTI输入线相关的中断处理代码。
  • 在处理完中断后,清除EXTI输入线 的中断标志位。

在中断服务函数中,通过检查EXTI输入线的中断标志位,可以确认中断是否确实是由EXTI输入线输入线触发的。这有助于避免因为其他中断源或噪声干扰而导致的误响应。

void EXTI15_10_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line14) == SET)		//判断是否是外部中断14号线触发的中断{EXTI_ClearITPendingBit(EXTI_Line14);		//清除外部中断14号线的中断标志位//中断标志位必须清除//否则中断将连续不断地触发,导致主程序卡死}
}

7、 NVCI中断分组

整个工程文档调用一次这个函数即可,分组视情况而定

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);					//配置NVIC为分组2

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词