首页 > 其他分享 >基于标准库的STM32的外部中断EXTI

基于标准库的STM32的外部中断EXTI

时间:2024-06-01 23:28:41浏览次数:22  
标签:NVIC ENABLE 中断 STM32 InitStruct GPIO EXTI

        毕设已经告一段落了,接下来准备开始整理一下毕设中用到的知识与技术细节,今天整理的是STM32从编码器获取数据的方式-----外部中断(EXTI):

外部中断分为四个硬件相关外设,GPIO/AFIO/EXTI/NVIC(EXTI/NVIC不需要开启时钟)

1.RCC开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//GPIOB为APB2的外设

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
2.配置GPIO

方式如我之前写的《STM32标准库编译流程》http://t.csdnimg.cn/0UkGa所示,代码如下:

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(GPIOE,&GPIO_InitStructure);
3.配置AFIO

进入GPIO库函数,找到void GPIO_AFIODeInit(void)函数,该函数负责将AFIO复位;

GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
GPIO_EventOutputCmd(FunctionalState NewState);用以配置AFIO事件输出功能。

GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);用以配置AFIO的数据选择器,用来选择想要的中断引脚。

那么配置中断的方法如下:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource14);

大概的目的就是选择一个引脚GPIOE1用来接收中断信号,这样GPIOE1上的电平中断信号就可以通过AFIO传入EXTI中了,接下来配置EXTI:

4.配置EXTI

进入EXTI库函数,EXTI相关的库函数如下:

158行的作用是复位,159是根据参数配置外设(这就是所需的函数),160将参数中的结构体变为默认值,161软件触发外部中断,164的作用是判断中断类型,165作用是清除中断标志位。

则初始化代码如下:

EXTI_InitTypeDef EXTI_InitStruct;//配置结构体参数
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//分为event和interrupt,中断,所以选择
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//触发方式
EXTI_InitStruct.EXTI_Line=EXTI_Line14;//配置中断线,引脚为GPIOE14所以选择14
EXTI_InitStruct.EXTI_LineCmd=ENABLE;//中断线的状态,分为ENABLE/DISABLE
void EXTI_Init(& EXTI_InitStruct);
5.配置NVIC

其为内部外设,所以他的库函数在misc文件中,找到196行,具体函数如下:

196的作用是指定中断的分组,197的作用是初始化,其他的暂不作了解

则配置方式如下:

NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);//抢占与相应的比例,具体见下图:
NVIC_InitTypeDef NVIC_InitStruct;
 NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
 NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//使用优先级
 NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(& NVIC_InitStruct);

值得注意的是,NVIC_InitStruct.NVIC_IRQChannel这个参数若引脚为10-15才为上述参数,若不是,则选择EXTIX_IRQn(X为引脚编号)

6.中断响应后执行的函数

该函数名为固定的,查找方法如下:

1.找到中断通道,本文中的是EXTI15_10_IRQn。

2.找到启动文件,即start中的startup_stm32f10x_md.s

3.找到中断向量表(大概在119行),在找到对应的函数名即可。

void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14)==SET)//判断是否是自己想要的中断,使用前文提到的函数
{
 //写函数的功能
EXTI_ClearITPendingBit(EXTI_Line14)//清除中断标志位,否则退出后又会返回到该函数
}
}

编写完成后,若E14引脚出现电平下降,则会中断其他函数,来执行EXTI15_10_IRQHandler函数

注:主函数中只需初始化外部中断即可,因为EXTI15_10_IRQHandler函数是库中自带的只需要声明即可。

初始化函数整体如下:

int EXIT_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//GPIOB为APB2的外设
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
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(GPIOE,&GPIO_InitStructure);
	
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource14);
	
EXTI_InitTypeDef EXTI_InitStruct;//配置结构体参数
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;//分为event和interrupt,中断,所以选择
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//触发方式
EXTI_InitStruct.EXTI_Line=EXTI_Line14;//配置中断线,引脚为GPIOE14所以选择14
EXTI_InitStruct.EXTI_LineCmd=ENABLE;//中断线的状态,分为ENABLE/DISABLE
EXTI_Init(&EXTI_InitStruct);
	
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2);//抢占与相应的比例,具体见下图:
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//使用优先级
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStruct);
}

标签:NVIC,ENABLE,中断,STM32,InitStruct,GPIO,EXTI
From: https://blog.csdn.net/weixin_69286552/article/details/138507064

相关文章

  • 基于FREERTOS的STM32多功能手表(软件设计)
    目录前言程序现象 项目背景项目介绍目前版本实现的功能设计到的freertos知识使用到的硬件硬件连线图实现思路任务调度流程图​编辑 任务具体操作导图      代码讲解freertos初始化按键中断回调函数显示时间任务显示菜单任务其它任务(ShowCalenda......
  • 基于MBD的电机控制算法开发-STM32
    使用simulink搭建V/F电机控制框架,并集成到STM32F4中1.Simulink模型搭建本例子使用V/F拖动启动方法控制永磁同步电机启动,simulink模型其中V/F启动部分输出d,q轴的期望电压,并通过SVPWM调制算法施加到电机的三相:模型的输入为空,模型输出为为三路PWM波的占空比。function[ud_out,u......
  • STM32学习笔记(二)流水灯
    STM32学习笔记(二)流水灯一、原理部分1.1LED原理1.2GPIO原理二、工程部分三、加入宏定义这次我们来实现LED流水灯成为点灯大师。使用的核心板的MCU型号为STM32F103ZET6,使用标准库函数来实现。一、原理部分1.1LED原理其中PWR是系统电源指示灯,为蓝色。LED0......
  • 杂项——STM32ZET6要注意的一些问题——高级定时器问题和PB3,PB4引脚问题
    ZET6可能会用到定时器,高级定时器要输出PWM要加上这样一行代码,否则无法正常输出PWM波TIM_CtrlPWMOutputs(TIM8,ENABLE); //主输出使能,当使用的是通用定时器时,这句不需要ZET6中PB3,PB4引脚默认功能是JTDO和NJTRST,如果想将其当作正常IO口使用需要加上两行代码 RCC_APB2Pe......
  • 原子上下文和中断上下文的区别
    原子上下文(AtomicContext)定义:原子本意是“不能被进一步分割的最小粒子”,而原子操作指的是“不可被中断的一个或一系列操作”。在操作系统中,原子上下文通常与原子操作相关,这些操作在执行过程中不会被其他操作或中断打断,从而保证其完整性。特点:不可分割性:原子操作在执行过程中......
  • Linux低功耗Suspend/Resume梳理(基于STM32MP1)
    基于STM32MP1简单梳理Linuxsuspend/resume涉及到的内容:触发Suspend流程,以及唤醒手段和后续resume流程。Linuxkernel中Suspend/Resume流程。TFA中冷启动、热启动、SMC处理、PSCI实现等等。其他低功耗相关:poweroff、reboot、fiq处理。PowerDomainTree介绍;PSCI移植指导等。......
  • STM32和ESP32哪个更适合初学者
    对于初学者来说,STM32和ESP32都有各自的优点和适用场景,但考虑到初学者的学习曲线和资源可用性,以下是对两者的一些比较和建议:STM32优点:丰富的教程和社区支持:STM32拥有庞大的用户群体和活跃的社区,这意味着你可以找到大量的教程、示例代码和解答问题的资源。完善的开发环境:STM32......
  • 新手学习STM32还是ESP32
    对于新手来说,选择学习STM32还是ESP32取决于个人的学习目标和背景。以下是针对这两种微控制器的详细分析,以便您做出更明智的选择:STM321.处理器架构与性能STM32采用单核或多核处理器架构,基于ARMCortex®-M0,M0+,M3,M4和M7内核。这些内核具有高性能,优化的指令集和较大的内存,能够......
  • STM32--如何合理使用宏定义使用来简化开发工作
    #defineI2C_OAR1_OA1EN_Pos(15U)#defineI2C_OAR1_OA1EN_Msk(0x1UL<<I2C_OAR1_OA1EN_Pos)/*!<0x00008000*/#defineI2C_OAR1_OA1ENI2C_OAR1_OA1EN_Msk......
  • 【STM32 标准库】DS18B20温度
    目录1.DS18B201.1DS18B20简介1.1.1特点1.1.2内部结构1.1.3温度读取2.软件配置3.硬件设计4.软件设计4.1 功能描述4.2 软件实现4.2.1DS18B20.c4.2.2DS18B20.h4.2.3main.c1.DS18B201.1DS18B20简介1.1.1特点        一线总线(单总线)接口......