0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

冬至子 来源:ITRelief 作者:Sachefgh Xu 2023-07-24 14:24 次阅读

中断原理图

图片

图片

图片

图片

很多情况可以产生中断,开发者可以在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);  //清除标志位
 }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 下拉电阻
    +关注

    关注

    4

    文章

    147

    浏览量

    20534
  • GPIO
    +关注

    关注

    16

    文章

    1204

    浏览量

    52106
  • 中断控制器
    +关注

    关注

    0

    文章

    59

    浏览量

    9458
  • 串口中断
    +关注

    关注

    0

    文章

    64

    浏览量

    13901
  • stm32f1
    +关注

    关注

    1

    文章

    56

    浏览量

    12207
收藏 人收藏

    评论

    相关推荐

    STM32 GPIO的外部中断设计

    输入引脚,还可以通过另外一种叫做外部中断方式来对引脚的输入信号进行检测,本篇首先介绍下EXTI的结构,接着介绍
    发表于 04-14 10:51 2109次阅读
    <b class='flag-5'>STM32</b> GPIO的<b class='flag-5'>外部</b><b class='flag-5'>中断</b>设计

    STM32F407 外部中断配置步骤

    介绍STM32F407外部中断配置步骤,以按键为例,实现外部中断
    的头像 发表于 07-06 14:31 1993次阅读
    <b class='flag-5'>STM32</b>F407 <b class='flag-5'>外部</b><b class='flag-5'>中断</b><b class='flag-5'>配置</b>步骤

    STM32基于标准外设外部中断配置

    本文介绍了STM32基于标准外设外部中断配置,以及基于参考手册如何更加寄存器配置
    的头像 发表于 11-02 14:13 1914次阅读
    <b class='flag-5'>STM32</b>基于标准外设<b class='flag-5'>库</b>的<b class='flag-5'>外部</b><b class='flag-5'>中断</b><b class='flag-5'>配置</b>

    STM32单片机外部中断配置讲解

    STM32单片机外部中断配置讲解01单片机外部中断简介所谓
    发表于 11-22 12:36 14次下载
    <b class='flag-5'>STM32</b>单片机<b class='flag-5'>外部</b><b class='flag-5'>中断</b><b class='flag-5'>配置</b>讲解

    Mini STM32 外部中断实验

    到RTC闹钟事件。线18:连接到USB唤醒事件。每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。从上面可以看出,
    发表于 11-22 15:06 10次下载
    Mini <b class='flag-5'>STM32</b> <b class='flag-5'>外部</b><b class='flag-5'>中断</b>实验

    STM32f10x 外部中断中断分组

    利用外部中断来实现按键控制LED灯的亮灭。实验工具:MDK5,STM32F103ZET6开发板使用固件编程LED灯引脚PD13,按键PE0
    发表于 11-23 18:06 4次下载
    <b class='flag-5'>STM32</b>f10x <b class='flag-5'>外部</b><b class='flag-5'>中断</b>及<b class='flag-5'>中断</b>分组

    STM32 外部中断详解(原理+配置代码)

    本文介绍了STM32基于标准外设外部中断配置,以及基于参考手册如何更加寄存器配置
    发表于 11-24 17:36 2次下载
    <b class='flag-5'>STM32</b> <b class='flag-5'>外部</b><b class='flag-5'>中断</b>详解(原理+<b class='flag-5'>配置</b>代码)

    STM32F0x HAL学习笔记(8)外部中断配置

    Package for STM32F0 Series)本文内容:STM32CubeMx 配置外部中断
    发表于 12-06 11:36 14次下载
    <b class='flag-5'>STM32</b>F0x HAL<b class='flag-5'>库</b>学习笔记(8)<b class='flag-5'>外部</b><b class='flag-5'>中断</b>的<b class='flag-5'>配置</b>

    STM32f429外部中断配置解析基于HAL

    STM32f429外部中断配置解析基于HAL
    发表于 12-16 16:58 10次下载
    <b class='flag-5'>STM32</b>f429<b class='flag-5'>外部</b><b class='flag-5'>中断</b><b class='flag-5'>配置</b>解析基于HAL<b class='flag-5'>库</b>

    使用LL开发STM32:GPIO口与外部中断

    文章目录目的输出与控制输入与端口值读取外部中断总结目的GPIO口使用是单片机开发中最简单的一块,STM32的GPIO口无论是使用HAL还是LL
    发表于 01-13 16:13 13次下载
    使用<b class='flag-5'>LL</b><b class='flag-5'>库</b>开发<b class='flag-5'>STM32</b>:GPIO口与<b class='flag-5'>外部</b><b class='flag-5'>中断</b>

    STM32外部中断

    事件(上升沿或下降沿或双边沿)并能够单独地屏蔽:有一个挂起寄存器维持所有中断请求的状态。EXTI可以检测到脉冲宽度小于内部APB2的时钟周期。多达80个通用IO口连接到16个外部中断线。STM
    发表于 01-14 15:14 2次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>外部</b><b class='flag-5'>中断</b>

    STM32LL系列教程(四)——外部中断

    本文介绍通过LL,读取按键外部中断,改变LED亮灭
    发表于 01-14 15:47 10次下载
    <b class='flag-5'>STM32LL</b><b class='flag-5'>库</b>系列教程(四)——<b class='flag-5'>外部</b><b class='flag-5'>中断</b>

    STM32的IO外部中断EXTI的使用

    方式访问输入引脚,还可以通过另外一种叫做外部中断方式来对引脚的输入信号进行检测,本篇首先介绍
    的头像 发表于 06-22 10:21 2044次阅读
    <b class='flag-5'>STM32</b>的IO<b class='flag-5'>外部</b><b class='flag-5'>中断</b>EXTI的使用

    STM32单片机外部中断简介 STM32单片机外部中断配置过程

    STM32 单片机是一款高性能、低功耗的 32 位微控制器,具有强大的计算能力、灵活的外设模块以及优秀的扩展性,开发周期短、成本低。在单片机应用中,外部中断是一种重要的硬件触发方式,本
    发表于 08-15 18:21 3072次阅读

    STM32如何配置外部中断STM32外部中断配置步骤

    STM32如何配置外部中断STM32外部中断
    的头像 发表于 10-26 17:47 3577次阅读