STM32 外部中断 标准库函数

这篇具有很好参考价值的文章主要介绍了STM32 外部中断 标准库函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

中断概念

中断对于单片机来说是必不可少的存在。例如使用一个按键打开一个灯的方法,就可以使用中断的方式实现,并且效果更好。
中断的概念比较容易理解,就相当于做饭的时候,你的主任务是炒菜,炒菜炒到一半,来了个电话你就需要优先去接电话,然后电话处理完后才会继续回归主任务进行炒菜。这就是一个中断的实际概念。
中断对于 STM32 来说是必不可少的一部分,STM32 支持的中断类型也很多,在这里主要介绍其概念,并且以一个简易的外部按键输入中断作为演示示例。

本文以一个外部按键输入中断更改 LED 灯亮灭为例进行说明,其余中断类型在遇到对应模式时再具体介绍。


中断操作

中断操作的步骤基本为一下步骤:

  • 开启时钟线
  • 初始化中断向量表
  • 初始化 GPIO 口
  • 初始化中断模式
  • 进行中断响应处理
  • 清除中断标志位
    我们将按照上面步骤一步步进行处理。

开启时钟线

开始时钟线主要使用 RCC_APB2PeriphClockCmdRCC_APB1PeriphClockCmd 这两个函数。
具体使用哪一个函数查阅下图:
exti4_irqn,STM32,stm32,单片机,嵌入式硬件
根据所挂载的时钟线选择响应函数。
这里以 RCC_APB2PeriphClockCmd 为例:
exti4_irqn,STM32,stm32,单片机,嵌入式硬件
其中第一个参数的选择范围如下:
exti4_irqn,STM32,stm32,单片机,嵌入式硬件
这里以开启 GPIOE 以及 复用 IO 始终为例:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE| RCC_APB2Periph_AFIO,ENABLE);

初始化中断向量表

主要使用 NVIC_PriorityGroupConfig 以及 NVIC_Init 函数
NVIC_PriorityGroupConfig 函数主要用于设置优先级组合。具体使用方法如下:
exti4_irqn,STM32,stm32,单片机,嵌入式硬件
然后是使用 NVIC_Init 函数进行初始化:
exti4_irqn,STM32,stm32,单片机,嵌入式硬件
此函数与 GPIO 中的 GPIO_Init 函数相似,使用结构体 NVIC_InitTypeDef 作为参数进行初始化。其相对应的参数如下:

  • NVIC_IRQChannel
    exti4_irqn,STM32,stm32,单片机,嵌入式硬件
    exti4_irqn,STM32,stm32,单片机,嵌入式硬件
  • NVIC_IRQChannelPreemptionPriorityNVIC_IRQChannelSubPriority
    exti4_irqn,STM32,stm32,单片机,嵌入式硬件
    其中在相同的 PreemptionPriority 下,优先响应 SubPriority 优先级高的中断。在不同的 PreemptionPriority 下,优先响应 PreemptionPriority 优先级高的, SubPriority 没影响。
  • NVIC_IRQChannelCmd
    exti4_irqn,STM32,stm32,单片机,嵌入式硬件
    这里以开启 PE4 外部中断为例:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  
NVIC_InitTypeDef NVIC_Param;  
NVIC_Param.NVIC_IRQChannel = EXTI4_IRQn;  
NVIC_Param.NVIC_IRQChannelPreemptionPriority = 0;  
NVIC_Param.NVIC_IRQChannelSubPriority = 1;  
NVIC_Param.NVIC_IRQChannelCmd = ENABLE;  
NVIC_Init(&NVIC_Param);

初始化 GPIO 口

主要使用 GPIO_InitGPIO_EXTILineConfig 函数。其中 GPIO_Init 函数的使用方式详见:GPIO
GPIO_EXTILineConfig 函数如下:
exti4_irqn,STM32,stm32,单片机,嵌入式硬件
这里以开启 PE4 的外部中断为例:

GPIO_InitTypeDef GPIO_Param;  
GPIO_Param.GPIO_Pin=GPIO_Pin_4;  
GPIO_Param.GPIO_Speed = GPIO_Speed_50MHz;  
GPIO_Param.GPIO_Mode = GPIO_Mode_IPU;  
GPIO_Init(GPIOE,&GPIO_Param);  
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);

初始化中断

主要使用 EXTI_Init 函数进行初始化,看名字就能看出来其与之前的 NVIC_Init 函数使用方法类似。
exti4_irqn,STM32,stm32,单片机,嵌入式硬件
使用 EXTI_InitTypeDef 函数进行初始化。

  • EXTI_Line
    exti4_irqn,STM32,stm32,单片机,嵌入式硬件
    其中选择具体哪一个看如下图片:
    exti4_irqn,STM32,stm32,单片机,嵌入式硬件
  • EXTI_Mode
    exti4_irqn,STM32,stm32,单片机,嵌入式硬件
    二者的区别主要是事件请求会等待当前事件完成后再响应,而中断请求会直接打断当前事件直接请求。
  • EXTI_Trigger
    exti4_irqn,STM32,stm32,单片机,嵌入式硬件
  • EXTI_LineCmd
    exti4_irqn,STM32,stm32,单片机,嵌入式硬件
    这里以开启 PE4下降沿 中断为例:
EXTI_InitTypeDef EXTI_Param;  
EXTI_Param.EXTI_Line = EXTI_Line4;  
EXTI_Param.EXTI_Mode=EXTI_Mode_Interrupt;  
EXTI_Param.EXTI_Trigger = EXTI_Trigger_Falling;  
EXTI_Param.EXTI_LineCmd = ENABLE;  
EXTI_Init(&EXTI_Param);

中断响应处理

中断响应处理是我们进入中断后进行响应处理的地方,也是最重要的地方。不同的中断会调用不同的中断处理函数。所以我们需要根据我们初始化的中断选用不同的中断处理函数。
中断处理函数主要查看程序配置中的 stm32f10x.h 文件,然后根据自己的启动文件类别进行操作, 我这里使用的是 hd 类型的启动文件,这里值贴出对应的中断处理函数

typedef enum IRQn  
{  
/******  Cortex-M3 Processor Exceptions Numbers ***************************************************/  
  NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                             */  
  MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt              */  
  BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                      */  
  UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                    */  
  SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                       */  
  DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                 */  
  PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                       */  
  SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt                   */  
  
/******  STM32 specific Interrupt Numbers *********************************************************/  
  WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */  
  PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */  
  TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */  
  RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */  
  FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */  
  RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */  
  EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */  
  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */  
  EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */  
  EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */  
  EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */  
  DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */  
  DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */  
  DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */  
  DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */  
  DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */  
  DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      */  
  DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */
  ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */  
  USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */  
  USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */  
  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */  
  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */  
  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */  
  TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */  
  TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */  
  TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */  
  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */  
  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */  
  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */  
  TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */  
  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */  
  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */  
  I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */  
  I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */  
  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */  
  SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */  
  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */  
  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */  
  USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */  
  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */  
  RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */  
  USBWakeUp_IRQn              = 42,     /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */  
  TIM8_BRK_IRQn               = 43,     /*!< TIM8 Break Interrupt                                 */  
  TIM8_UP_IRQn                = 44,     /*!< TIM8 Update Interrupt                                */  
  TIM8_TRG_COM_IRQn           = 45,     /*!< TIM8 Trigger and Commutation Interrupt               */  
  TIM8_CC_IRQn                = 46,     /*!< TIM8 Capture Compare Interrupt                       */  
  ADC3_IRQn                   = 47,     /*!< ADC3 global Interrupt                                */  
  FSMC_IRQn                   = 48,     /*!< FSMC global Interrupt                                */  
  SDIO_IRQn                   = 49,     /*!< SDIO global Interrupt                                */  
  TIM5_IRQn                   = 50,     /*!< TIM5 global Interrupt                                */  
  SPI3_IRQn                   = 51,     /*!< SPI3 global Interrupt                                */  
  UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                               */  
  UART5_IRQn                  = 53,     /*!< UART5 global Interrupt                               */  
  TIM6_IRQn                   = 54,     /*!< TIM6 global Interrupt                                */  
  TIM7_IRQn                   = 55,     /*!< TIM7 global Interrupt                                */  
  DMA2_Channel1_IRQn          = 56,     /*!< DMA2 Channel 1 global Interrupt                      */  
  DMA2_Channel2_IRQn          = 57,     /*!< DMA2 Channel 2 global Interrupt                      */  
  DMA2_Channel3_IRQn          = 58,     /*!< DMA2 Channel 3 global Interrupt                      */  
  DMA2_Channel4_5_IRQn        = 59      /*!< DMA2 Channel 4 and Channel 5 global Interrupt        */

自行根据此内容进行查询选择即可。查询到对应的中断处理函数后,在自己的文件中实现对应的函数即可。
这里以 PE4 的中断为例:

// 中断响应函数  
void EXTI4_IRQHandler()  
{  
    if (EXTI_GetFlagStatus(EXTI_Line4) == SET)  
    {  
        GPIO_Toggle(GPIOB,GPIO_Pin_5);  
        //清除中断标志位  
        EXTI_ClearITPendingBit(EXTI_Line4);  
    }  
}

其中的 EXTI_GetFlagStatus 函数用于防抖,用法如下:
exti4_irqn,STM32,stm32,单片机,嵌入式硬件
此函数与 EXTI_GetITStatus 函数作用相同,看个人爱好。
exti4_irqn,STM32,stm32,单片机,嵌入式硬件


清除中断标志位

清除中断标志位十分重要!不进行清除程序将一直处于中断中。
主要使用的函数是 EXTI_ClearITPendingBit
其用法如下:
exti4_irqn,STM32,stm32,单片机,嵌入式硬件
示例代码如下:文章来源地址https://www.toymoban.com/news/detail-795159.html

EXTI_ClearITPendingBit(EXTI_Line4);  

到了这里,关于STM32 外部中断 标准库函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】STM32学习笔记-EXTI外部中断(11)

    中断 :在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 中断优先级 :当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加

    2024年02月04日
    浏览(31)
  • 【STM32教程】第四章 STM32的外部中断EXTI

    案例代码及相关资料下载链接: 链接:https://pan.baidu.com/s/1hsIibEmsB91xFclJd-YTYA?pwd=jauj  提取码:jauj   中断系统的定义:中断是指在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂

    2024年02月09日
    浏览(34)
  • 嵌入式-stm32-江科大-EXTI外部中断

    1.1 STM32 中断系统 中断 是指在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续执行, 当中断发生时是由硬件自动调用中断函数执行的,期间编译器会保护现场最后还原现场

    2024年01月25日
    浏览(42)
  • STM32的HAL库开发系列 - GPIO中断/外部中断EXTI

    STM32的HAL库开发系列 - GPIO中断/外部中断EXTI 中断它可以在GPIO口的电平发生变化时产生中断,从而使得STM32微控制器能够及时响应外部设备的变化。 STM32的GPIO中断/外部中断EXTI可以配置为上升沿中断、下降沿中断和双边沿中断三种类型,分别在GPIO口电平从低电平变为高电平、从

    2024年02月12日
    浏览(28)
  • STM32单片机(五)第二节:EXTI外部中断练习2(旋转编码器计次)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月11日
    浏览(35)
  • 明解STM32—GPIO应用设计篇之IO外部中断EXTI原理及使用方法

    ​ 一、前言         在之前针对STM32的GPIO相关API函数及配置使用进行了详细的介绍,GPIO作为输入引脚时,调用相关读信号引脚函数接口就可以在程序的循环中,轮询的对输入信号进行读取检测操作,除了轮询的方式访问输入引脚,还可以通过另外一种叫做外部中断的方式

    2024年02月08日
    浏览(33)
  • STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江科大自化协 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   本篇文章的内容我愿称之为 史诗级副本 (感觉

    2024年02月16日
    浏览(34)
  • STM32单片机(五)第二节:EXTI外部中断练习(对射式红外传感器计次和旋转编码器计次)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月09日
    浏览(35)
  • STM32库函数开发外部中断

    目录 函数介绍:                STC32F10x_rcc: GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct) NVIC_PriorityGroupConfig(uint32_tNVIC_PriorityGroup) NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct) EXTI15_10_IRQHandler ITStatus EXTI_GetITStatus(uint32_t EXTI_Line) EXTI_ClearITPendingB

    2024年02月16日
    浏览(34)
  • stm32标准库和HAL库的对比学习3.《学习外部中断EXIT和应用》

            本人是大一的学生,学习了一段时间的stm32,此系列博客为个人的学习笔记,方便个人复习,如有错误或问题,非常非常欢迎大家来大力指正。 简单用文字说一下原理。 如果先要清楚了解建议去b站看一下keysking大佬的教程,很有趣易懂( 本视频的部分图也来自keys

    2024年01月19日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包