STM32 HAL库常用GPIO函数以及外部中断配置与响应流程

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

Hello,大家好,这是我第一篇博客,写的不好请大家包涵指教,话不多说直接看内容:

HAL库常用GPIO函数:

void HAL_GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init)

hal库读gpio的函数,stm32,单片机,嵌入式硬件

这个函数主要用来初始化我们需要用到的引脚,设置其工作频率、工作模式、上下拉等参数。如果使用CubeMX配置工程,所有参数在Cube中调配,函数自动在工程中生成。

void HAL_GPIO_DeInit(GPIO_TypeDef  *GPIOx, uint32_t GPIO_Pin)

HAL_GPIO_Init能够实现对GPIO的初始化,那么HAL_GPIO_DeInit就是与其相反的操作,能够将GPIO口恢复至默认状态,即各个寄存器复位时的值。

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

hal库读gpio的函数,stm32,单片机,嵌入式硬件

这个函数主要功能是读取我们想要知道的引脚的电平状态、函数返回值为0或1。

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

hal库读gpio的函数,stm32,单片机,嵌入式硬件

该函数是让某个端口输出0或1。

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

hal库读gpio的函数,stm32,单片机,嵌入式硬件

该函数的功能是翻转某个端口的电平状态。

HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

hal库读gpio的函数,stm32,单片机,嵌入式硬件

该函数的功能是锁住某个端口的电平值,当该端口电平变化时,仍保持原本的值。注意的是:一旦锁住后,就不能再修改,只有复位后才可以重新配置。

论坛某大佬解答:

这是GPIO的模式锁定,根本就不是电平锁定,简单来说就是有个GPIO已经设定为推挽输出模式,只要将该GPIO锁定,后面你的代码执行该GPIO变成输入模式的代码将不起作用,最主要作用是在强干扰环境下防止意外跑飞导致修改io的模式状态导致严重意外问题,只能说一般平常环境是用不上的。

究竟何用待摸索。

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)

hal库读gpio的函数,stm32,单片机,嵌入式硬件

该函数是用来相应外部中断的中断服务函数。(当发生中断的时候,程序就会执行中断服务函数。 每当一个事件发生,就会最终调用相应的中断处理回调函数,我们在回调函数中编写真正的控制逻辑即可。 中断服务函数就是终止程序运行的函数,回调函数是程序在终止之后希望执行的操作

函数有两个功能:

1.clear IT,即清除中断标记位。

2.调用外部中断回调函数。

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

hal库读gpio的函数,stm32,单片机,嵌入式硬件

该函数是外部中断的中断回调函数,在函数中写入外部中断触发的内容。

需要注意的是:回调函数定义为弱函数( __weak ),故不需要在stm32l4xx_hal.c中对其进行修改。HAL_GPIO_EXTI_Callback可以在用户文件中实现。

__weak的使用:加上了__weak修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。

注意:

使用CubeMX创建外部中断时,中断服务函数和中断回调函数并不会在main函数中直接出现,需要到stm32f1xx_hal_gpio.h中去找到这两个函数。(不是gpio.h,gpio.h是用户文件,而stm32f1xx_hal_gpio.h是库文件)

hal库读gpio的函数,stm32,单片机,嵌入式硬件

然后到.c文件中找到回调函数,并且在其中写用户代码。

hal库读gpio的函数,stm32,单片机,嵌入式硬件

但是这样写的话,用户代码就不再main函数以及用户文件夹中了,可以采用以下写法:

由于该回调函数是_weak弱定义,所以我们可以直接在main函数中再定义一个相同的回调函数,并在其中撰写用户代码,这样就解决了上述问题。

其中中断服务函数最后会被stm32f1xx_it.c中的EXIT1_IRQHandler();函数调用。

hal库读gpio的函数,stm32,单片机,嵌入式硬件

然后接着调用中断回调函数。主要流程就简化为:

EXTI1_IRQHandler();

      调用

HAL_GPIO_EXTI_IRQHandler();

      调用

HAL_GPIO_EXTI_Callback();

即系统中断服务函数调用HAL库中断处理函数(使用HAL库函数的好处在下文有讲)。

GPIO外部中断执行流程:

1.打开外部中断:

首先是main函数中GPIO初始化函数:

hal库读gpio的函数,stm32,单片机,嵌入式硬件

然后找到gpio.c文件中的MX_GPIO_Init()函数:

hal库读gpio的函数,stm32,单片机,嵌入式硬件

其中HAL_NVIC_SetPriority();是设置中断优先级函数。

HAL_NVIC_EnabledIRQ();是中断开启函数。

外部中断线和引脚的映射配置在下文提及。

在stm32f1xx_hal_cortex.c文件中可找到HAL_NVIC_SetPriority();和HAL_NVIC_EnabledIRQ();函数,但是重点关注HAL_NVIC_EnabledIRQ();函数:

hal库读gpio的函数,stm32,单片机,嵌入式硬件

再往下就是寄存器的操作了:(在core_cm3.h文件中)

hal库读gpio的函数,stm32,单片机,嵌入式硬件

hal库读gpio的函数,stm32,单片机,嵌入式硬件

2.外部中断响应过程:

当外部中断引脚出现电平变化时,触发外部中断。

微控制器暂停当前程序的执行,根据中断向量表跳转到EXTI1_IRQHandler();函数。

其中中断向量表是在启动文件startup_stm32f103xb.s中由ST公司定义的:

hal库读gpio的函数,stm32,单片机,嵌入式硬件

hal库读gpio的函数,stm32,单片机,嵌入式硬件

其中由ST公司定义的中断服务函数默认为死循环,但是因为他们的函数属性都是_weak,所以在CubeMX中打开中断后,就会在stm32f1xx_it.c中自动生成同名的中断服务函数EXTI1_IRQHandler();

所以如果没用CubeMX的话,打开中断但是不再次定义中断服务函数,外部中断来临时就会卡死。

hal库读gpio的函数,stm32,单片机,嵌入式硬件

接着执行用户编写的中断回调函数,用户需要在main.c文件中重新编写外部中断回调函数HAL_GPIO_EXTI_Callback(),来完成具体的中断处理任务。中断回调函数一般添加在/* USER CODE BEGIN4*/和/* USER CODE END4*/之间。

外部中断线0-15 :

给外部中断使用的硬件外部中断线有16个,但是GPIO端口却远不止16个,所以为了解决这个问题,采用了每一个外部中断线控制一组GPIO端口,即尾号相同的引脚作为一组被一条外部中断线控制:

hal库读gpio的函数,stm32,单片机,嵌入式硬件

当使用外部中断的时候,通过配置,我们可以将某一组中的某一个引脚连接到外部中断线上。所以一组引脚只能有一个作为外部中断引脚。例如,PA0、PB0、PC0、PD0、PE0、PF0、PG0和PH0这些引脚作为一组,如果我们使用PA0引脚作为外部中断引脚,那么该组的其余引脚就不能作为外部中断引脚使用。因此,从本质上讲,可供用户同时使用的外部中断引脚最多只有16个。

而且虽然外部中断线有16个,但是NVIC只为EXTI提供了7个中断通道,其中EXTI0_IRQ、EXTI1_IRQ、EXTI2_IRQ、EXTI3_IRQ、EXTI4_IRQ分别控制一条外部中断线,EXTI9_5_IRQ控制EXTI5-EXTI9,并且这几条外部中断线共享一个外部中断服务程序,EXTI5_10_IRQ同理。

配置过程:

其实将GPIO引脚和中断线相连的配置,在GPIO配置函数中就有提及:

hal库读gpio的函数,stm32,单片机,嵌入式硬件

IT就表示中断模式。

并且在stm32f1xx_hal_gpio.h中有定义:

hal库读gpio的函数,stm32,单片机,嵌入式硬件

选择好模式后就可以在HAL_GPIO_Init();函数中对外部中断进行配置了:

hal库读gpio的函数,stm32,单片机,嵌入式硬件

具体配置过程就设计硬件寄存器了,反正通过模式的选择在这里设置了引脚和外部中断线的映射关系。

注意:

初始化了PB1,如果PC1再初始化中断,那么PB1的中断映射将会被清除。

hal库读gpio的函数,stm32,单片机,嵌入式硬件

即如果在PB1和PB13、PB14中插入一个模式IT的PC1初始化函数,那么PB1的中断配置就会被覆盖。原因上文提及到,一条中断线只能和一个引脚映射。

调用HAL库中断处理函数的好处以及HAL库函数参数GPIO_PIN_(0-15):

通过NVIC分配到七条中断通道我们可以看到,其实外部中断一共有七个中断服务函数,在启动文件中由ST公司设置:

hal库读gpio的函数,stm32,单片机,嵌入式硬件

hal库读gpio的函数,stm32,单片机,嵌入式硬件

hal库读gpio的函数,stm32,单片机,嵌入式硬件

其中只有最后两个是多中断线共享一个中断服务函数。

当我们使用多个外部中断时,如果使用0、1、2三个外部中断,那么我们写中断函数,就要在三个中断服务函数中去写,很麻烦。

但是使用CubeMX时,就会自动生成中断服务函数,并且自动调用HAL库函数:

hal库读gpio的函数,stm32,单片机,嵌入式硬件

hal库读gpio的函数,stm32,单片机,嵌入式硬件

可以看到,不论是那条外部中断线,最后都是调用同一个HAL库中断服务函数, 只不过参数,即GPIO_PIN_()有变化,其实该参数仅仅是用来判断外部中断是由哪一条外部中断线产生的,仅此而已。

hal库读gpio的函数,stm32,单片机,嵌入式硬件

通过这样的处理,我们不论哪条外部中断线响应了,最后都是调用同一个中断回调函数

hal库读gpio的函数,stm32,单片机,嵌入式硬件

这样,我们只需要在回调函数中判断一下形参GPIO_Pin的值,就可以判断是哪个引脚电平变化导致了中断响应,从而去编写相应的响应代码。文章来源地址https://www.toymoban.com/news/detail-771722.html

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

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

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

相关文章

  • 明解STM32—GPIO应用设计篇之IO外部中断EXTI原理及使用方法

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

    2024年02月08日
    浏览(45)
  • HAL库(STM32CubeMX)之外部中断(STM32F103C8T6)

    HAL库(STM32CubeMX)——ADC学习总结(包含单次/连续模式下的轮询/中断/DMA)(蓝桥杯STM32G431RBT6) HAL库(STM32CubeMX)——DAC学习(STM32G431RBT6) HAL库(STM32CubeMX)——USART配置(中断接收/STM32G431RBT6) HAL库(STM32CubeMX)——基本定时器、PWM、输入捕获、输出比较、互补式PWM等综合学习(STM32

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

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

    2024年01月19日
    浏览(47)
  • 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日
    浏览(49)
  • STM32 外部中断 标准库函数

    中断对于单片机来说是必不可少的存在。例如使用一个按键打开一个灯的方法,就可以使用 中断 的方式实现,并且效果更好。 中断的概念比较容易理解,就相当于做饭的时候,你的主任务是炒菜,炒菜炒到一半,来了个电话你就需要优先去接电话,然后电话处理完后才会继

    2024年01月16日
    浏览(50)
  • STM32(三):外部中断 (标准库函数)

    前言 上一篇文章已经介绍了如何用按键点灯,使用的是按键扫描的方式,实现了点灯的第二步。这一篇则介绍如何用外部中断的方式实现按键点灯的过程。 中断想必大家都知道,通俗来说也就是你现在在做事情1,被打扰了先去做了事情2,事情2做完了回去继续做事情1。 而

    2024年04月25日
    浏览(37)
  • Cortex-M3/M4内核NVIC及HAL库函数详解(4):使用HAL库配置外部中断

    Keil uVision5 Cortex M3权威指南(中文) Cortex M3与M4权威指南 stm32f407的HAL库工程 STM32F4xx中文参考手册 前面我们已经熟悉了有关内核部分的寄存器配置,接下来我们结合stm32f407的GPIO外设,从实战角度进一步加深对这些寄存器的认识。 我们这里使用PA0作为输入引脚,可以看到SW1未按

    2024年01月24日
    浏览(46)
  • STM32cubeIDE HAL库中断服务函数解读

    以stm32f103为例 在开启一个中断后,首先会在stm32f1xx_it.c找到自动生成的中断处理函数,这里是TIM1产生的定时器中断:  这个函数又调用了 stm32f1xx_hal_tim.c 中的 HAL_TIM_IRQHandler(htim1),这个htim1是通用定时器的结构体,其定义为 这个结构体的意义可以参考第25章 STM32F429的TIM定时器

    2024年02月02日
    浏览(68)
  • STM32 HAL库的串口中断服务函数详解

    最近在实现利用上位机通过串口发送指令给下位机执行操作的实验,在之前学习串口的过程中我就一直有一个疑惑,那就是为什么在串口中断回调函数内除了要加上自己的操作以外还要在末尾再执行一次 接收中断 ,在查阅了一些资料后我才发现原来和 中断服务函数 有关 我

    2024年02月10日
    浏览(43)
  • STM32 HAL库 中断处理中使用延时函数(HAL_Delay)

    今天在学习STM32 HAL库外部中断,使用的是按键触发外部中断,想在外部中断里面写一个按键消抖,也就是在HAL库外部中断处理函数中使用了HAL_Delay() 函数,后来经过实验,在外部中断处理函数(void EXTI1_IRQHandler(void))和中断回调函数(void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin))里面都

    2024年03月16日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包