STM32 LL库中断配置引脚外部中断的方式

发布者:WanderlustSoul最新更新时间:2024-05-15 来源: elecfans关键字:STM32  LL库  中断配置  外部中断 手机看文章 扫描二维码
随时随地手机看文章

中断原理图

图片

图片

图片

图片

很多情况可以产生中断,开发者可以在CubeMx中NVIC选单、通讯模块选单处配置。请自行探索;部分中断有关的内容在模块讲解时·将会提到。

※启用中断后,注意在System Core->NVIC->Code Generation中勾选生成IRQ Handler和 Select for init Sequence Ordering。

※生成的中断函数定义在stm32fxxx_it.h和stm32fxxx_it.c中,向函数中填要执行的代码即可。

对于外部中断的事件分配,多个引脚将被分配到中断事件(具体可以参考文档),若需要区分则须在中断程序内写判断。判断方式之后给到

配置引脚外部中断的方式:

①在引脚图上选中需要配置的引脚,选择中断功能(如图)

图片

②在NVIC选单中使能中断

图片

③在NVIC->Code Generation中勾选生成IRQ Handler和 Select for init Sequence

图片

勾选Select for init Sequence是个人习惯,这样可以在main.c中生成独立初始化函数

④在GPIO->GPIO配置中断模式(如图)

图片

可以配置上/下拉电阻(上拉、下拉、浮空)和中断触发模式。


⑤生成代码。(stm32fxxx_it.c中,配置为Interrupt Mode)


void EXTI15_10_IRQHandler(void)

{

  /* USER CODE BEGIN EXTI15_10_IRQn 0 */


  /* USER CODE END EXTI15_10_IRQn 0 */

  /* USER CODE BEGIN EXTI15_10_IRQn 1 */


  /* USER CODE END EXTI15_10_IRQn 1 */

}

外部触发类型与中断处理:


一、触发类型


上升沿触发、下降沿触发、上升/下降沿触发(电平变化触发)


二、中断处理※


分为中断模式(Interrupt Mode) 和 事件模式(Event Mode) 两种


中断模式即为普通中断,其概念不多解释。配置成中断模式时,stm32fxxx_it库中会自动生成中断句柄函数。


※ 事件模式 。(很少用)


参考本文最前面提供的中断原理图。在配置为事件模式时,中断信号将传输给图中的Pulse Generator而非中断控制器


虽然中断和事件的硬件信号产生源相同,但是配置为事件时将不会发生挂起,也就是说事件过程不需CPU的参与,可以与主程序并行: 事件机制提供了一个完全由硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件)。


※事件模式虽然有优势,但在实际工程中几乎不会有人使用。不讲了。之后的代码默认使用中断模式配置。


配置外部中断需要三步: 1.配置GPIO与中断线(Input Line)连接 2.中断线配置 3.中断向量配置


结合代码:


Pin:PC13

Mode:Interrupt; Rising edge Trigger detection

Pull: Floating

在gpio.c :


/*连接引脚与中断线(EXTICRn)*/

  LL_GPIO_AF_SetEXTISource(LL_GPIO_AF_EXTI_PORTC, LL_GPIO_AF_EXTI_LINE13);


  /*配置中断线*/

  EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_13;  //配置触发源的连接

  EXTI_InitStruct.LineCommand = ENABLE;

  EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;

  EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;

  LL_EXTI_Init(&EXTI_InitStruct);


  /*引脚GPIO设置*/

  LL_GPIO_SetPinMode(GPIOC, LL_GPIO_PIN_13, LL_GPIO_MODE_FLOATING);

  

  /* EXTI interrupt init*/

  NVIC_SetPriority(EXTI15_10_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),1, 0));

  NVIC_EnableIRQ(EXTI15_10_IRQn);

※关于LL_EXTI_LINE_x:


x代表的是中断线;中断线(LINEx) 是中断信号的输入硬件。

图片

Line连接GPIO,例如LINE13可接PA13、PB13、PC13....。可以将引脚与中断线理解为短接。中断线同时只能连接一个引脚(LINEx只能连接PAx,PBx,PCx,PDx...其一)。 来自Input Line的信号输入触发中断程序的调用


※中断程序结束时别忘清除中断位挂起位


LL API分析:


Input Line引脚输入配置


stm32fxxx_ll_gpio.h中:


/**/

__STATIC_INLINE void LL_GPIO_AF_SetEXTISource(uint32_t Port, uint32_t Line);/*

使能中断引脚 Pnx;通过此函数将使引脚连接相应的EXTI_LINE_x。

@param Port =LL_GPIO_AF_EXTI_PORTn

@param Line =LL_GPIO_AF_EXTI_LINEx

※每次只能配置一个引脚 Pnx; Pnx 将连接EXTI_LINE_x

*/

__STATIC_INLINE uint32_t LL_GPIO_AF_GetEXTISource(uint32_t Line);/*

  返回连接在EXTI_LINEx上的引脚信息(端口号)。

  @param Line =LL_GPIO_AF_GPIO_LINEx

  @retval:

  LL_GPIO_AF_GPIO_PORTn

*/

EXTI_LINE配置结构体LL_EXTI_InitTypeDef


typedef struct

{

  uint32_t Line_0_31;/*

  EXTI_LINE选择; Line_0_31= LL_EXTI_LINE_x

  */        

  FunctionalState LineCommand; /*

 使能位。LineCommand= ENABLE

  */

  uint8_t Mode;/*

 模式选择; Mode= LL_EXTI_MODE_IT           中断模式

               LL_EXTI_MODE_EVENT        事件模式

               LL_EXTI_MODE_IT_EVENT     中断&事件模式 

  */

  uint8_t Trigger;/*

  触发模式选择; Trigger = LL_EXTI_TRIGGER_NONE           无触发

                        LL_EXTI_TRIGGER_RISING         上升沿触发

                        LL_EXTI_TRIGGER_FALLING        下降沿触发

                        LL_EXTI_TRIGGER_RISING_FALLING 上升/下降均触发

  */

} LL_EXTI_InitTypeDef;

初始化函数LL_EXTI_Init()


ErrorStatus LL_EXTI_Init(LL_EXTI_InitTypeDef *EXTI_InitStruct)/*

  初始化并启用中断EXTI_LINEx。操作成功返回SUCCESS

*/

重设中断结构体


void LL_EXTI_StructInit(LL_EXTI_InitTypeDef *EXTI_InitStruct)

{

  EXTI_InitStruct- >Line_0_31      = LL_EXTI_LINE_NONE;

  EXTI_InitStruct- >LineCommand    = DISABLE;

  EXTI_InitStruct- >Mode           = LL_EXTI_MODE_IT;

  EXTI_InitStruct- >Trigger        = LL_EXTI_TRIGGER_FALLING;

}


软件中断触发函数(模拟外部触发)


__STATIC_INLINE void LL_EXTI_GenerateSWI_0_31(uint32_t ExtiLine)

{//ExtiLine = LL_EXTI_LINE_x;触发Line_x对应的中断处理函数;效果与外部触发相同

  SET_BIT(EXTI- >SWIER, ExtiLine);

}//软件触发寄存器SWIER改变可以通过清零挂起位PR清除

中断线判断函数:


__STATIC_INLINE uint32_t LL_EXTI_IsActiveFlag_0_31(uint32_t ExtiLine);/*

@param ExtiLine =LL_EXTI_LINE_x

当ExtiLine是引发中断函数的中断线时,返回值为!RESET ;反之返回值RESET (=0)*/

挂起位清除函数:


清除函数挂起位,使能下一次中断唤起


__STATIC_INLINE void LL_EXTI_ClearFlag_0_31(uint32_t ExtiLine);/*

@param ExtiLine =LL_EXTI_LINE_x

清除中断挂起位;若中断是由软件模拟外部触发实现的,清除时一并将SWIER位清除

*/

使用案例


void EXTI15_10_IRQHandler(void)

{


 LL_mDelay(10);//按键消抖,防止多次触发(一置位PR即可能再次触发)

 if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_13) != RESET)//当中断由EXTI_LINE_13引起

 {

  /* USER CODE BEGIN LL_EXTI_LINE_13 */

    LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_13); //清除标志位

    

    LL_GPIO_TogglePin(GPIOA, LL_GPIO_PIN_15); //翻转LED

    /* USER CODE END LL_EXTI_LINE_13 */

 }

 if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_15) != RESET)//当中断由EXTI_LINE_15引起

 {

  LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_15);  //清除标志位

 }

}


关键字:STM32  LL库  中断配置  外部中断 引用地址:STM32 LL库中断配置引脚外部中断的方式

上一篇:STM32驱动ESP8266连接阿里云(1)----使用AT指令连接阿里云
下一篇:STM32F407开发板红外线解码功能应用案例

推荐阅读最新更新时间:2026-03-19 16:24

STM32基于标准外设外部中断配置
本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断 2 STM32的外部中断 下图来自《STM32参考手册》,从整个架构图可以知道,外部中断的功能可以配置六个寄存器; 中断屏蔽寄存器(EXTI_IMR) 事件屏蔽寄存器(EXTI_EMR) 上升沿触发选择寄存器(EXTI_RTSR) 下降沿触发选择寄存器(EXTI_FTSR) 软件中断事件寄存器(EXTI_SWIER) 挂起寄存器(EXTI_PR) EXTI支持配置20个中断和事件屏蔽位; GPIO端口以下图的方式连接到16个外部中断/事件线上;EXTI_Line0 — EXTI_Line15; EXTI_Line16 连接到PVD
[单片机]
<font color='red'>STM32</font>基于标准外设<font color='red'>库</font>的<font color='red'>外部中断</font><font color='red'>配置</font>
STM32配置外部中断EXTI)流程
1:配置外设GPIO端口(具体配置为请看配置GPIO流程) GPIO_Init(); 2:使能复用功能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); 3:初始化外部中断以及配置中断映射 EXTI_InitTypeDef EXTI_InitStruct; GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); //中断映射 EXTI_InitStruct.EXTI_Line = EXTI_Line0; //中断线 EXTI_I
[单片机]
单片机STM32的几种输入模式以及外部中断配置
最近做毕业设计,需要用按键来触发外部中断。实验的时候是正常的,但是换了个核心板以及用上自己做的PCB电路板后,出现了一些问题。问题如下: 要求:将连接按键的IO口配置为上拉输入,按键一端接IO口,一端接地,即当按键按下后,该IO口会产生一个下降沿,触发下降沿中断。 问题:将相应的IO口配置好后,测了引脚的的电压,并不是3.3V左右,而是0.1V左右。于是猜想: 1. 外围电路对IO口产生了影响。 2. STM32 内部上拉能力较弱,一次只能上拉一个IO口。 于是开始从这两个想法着手解决。首先第一个,很容易就排除了。将外围电路撤掉,我用的是杜邦线,直接拔掉测量引脚上的电压,依然是0.1V左右,于是第1个猜想排除。
[单片机]
STM32详解:HAL、标准LL与寄存器操作深度解析
引言 在 STM32 微控制器的开发领域,存在着多种开发方式,在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发。开发方式主要包括 HAL(Hardware Abstraction Layer,硬件抽象层)库、标准库、LL(Low Layer,低层)库以及直接进行寄存器操作。每一种方式都有其独特的特点和适用场景,了解它们之间的区别和联系,能够帮助开发者根据具体项目需求选择最合适的开发方法。 寄存器操作 原理 寄存器操作堪称最底层的开发方式。在 STM32 里,每个外设都配备了一系列
[单片机]
STM32 HAL、标准外设LLSTM32 Embedded Software)
STM32 Embedded Software   工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库。到目前为止,有标准外设库(STD库)、HAL库、LL库 三种。前两者都是常用的库,后面的LL库是ST最近才添加,目前支持的芯片也偏少。各库如下所示: 其中,STD库和HAL库两者相互独立,互不兼容。几种库的比较如下: 目前几种库对不同芯片的支持情况如下: 上图中,LL库目前有部分芯片不支持,官方计划2017年逐步完善。 STM32Snippets   它是代码示例的集合,直接基于STM32外设寄存器,可在文档和软件包中使用。由于处在最底层,因此需要开发者直接操作外设寄存器,对开发者要求
[单片机]
<font color='red'>STM32</font> HAL<font color='red'>库</font>、标准外设<font color='red'>库</font>、<font color='red'>LL</font><font color='red'>库</font>(<font color='red'>STM32</font> Embedded Software)
STM32 LL为什么比HAL高效呢?
概 述 有些应用要求MCU能高效处理,特别是跑一些算法时,对CPU执行效率要求较高。 网上有很多文章说STM32Cube HAL执行效率不高,代码量大等问题 ,导致很多还没有入门,或初学的读者就产生各种各样的疑惑。 说实话,HAL相对标准外设库来说确实存在代码效率不高、代码量大灯这些问题,那么与之对应的STM32Cube LL恰好避免了这样的问题。 LL能高效的原因 简单总结一下原因: 巧妙运用C语言静态、内联函数直接操作寄存器 。 当然,这是其中重要的原因,还有一些其它原因,这里暂不描述。 你会在LL库.h文件中发现大量类似,静态、内联函数直接读写寄存器的函数。 比如读写IO口: __STATIC_
[单片机]
<font color='red'>STM32</font> <font color='red'>LL</font><font color='red'>库</font>为什么比HAL<font color='red'>库</font>高效呢?
STM32标准LL代码
一、四种库比较 LL库,即STM32Cube Low-Layer,也叫Cube LL、Cube底层库等。 开发STM32通常有四种“库”,寄存器、标准外设库、HAL、LL。 早在2014年,ST推出了STM32CubeMX这款工具,同步推出了对应的STM32Cube HAL库。 但是,HAL存在一些问题:代码量大、执行效率低等缺点。 因此,在2017年,ST推出了STM32Cube LL库,目的就是为了解决的HAL库的缺点,让开发STM32的工程师有更多的选择。 之前有工程师总结了寄存器、标准外设库、HAL、LL四种库的代码性能: (来源ST社区) 针对上图(Flash、 SRAM 占用量和执行代码的效率这三项指标对比
[单片机]
<font color='red'>STM32</font>标准<font color='red'>库</font>转<font color='red'>LL</font><font color='red'>库</font>代码
STM32标准外设SPL转换成Cube LL
今天分享几点内容: 1.介绍ST推出的三种库; 2.直接操作寄存器及三种ST库的代码性能对比; 3.STM32CubeMX直接生成Cube LL库函数的方法; 4.STM32标准外设库SPL转换成Cube LL的方法; 1介绍ST推出的三种库 1.标准外设库:Standard Peripheral Libraries,简写SPL. 2.Cube硬件抽象层库:STM32Cube Hardware Abstraction Layer,简写Cube HAL. 3.Cube底层库:STM32Cube Low-Layer,简写Cube LL. 开发STM32常见的除了直接读写(操作)寄存器之外,就是使用ST推
[单片机]
<font color='red'>STM32</font>标准外设<font color='red'>库</font>SPL转换成Cube <font color='red'>LL</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved