当前位置:   article > 正文

STM32 HAL库 STM32CubeMx -- GPIO输入_hal库gpio输入

hal库gpio输入


一、GPIO输入模式详解

STM32F103系列的I/O引脚共有8种工作模式,
其中输入模式有四种:输入浮空(GPIO_Mode_IN_FLOATING)、输入上拉(GPIO_Mode_IPU)、输入下拉(GPIO_Mode_IPD)、模拟输入(GPIO_Mode_AIN)

输入浮空(GPIO_Mode_IN_FLOATING)

输入引脚即不接高电平,也不接低电平,用于标准的通讯协议,比如IIC、USART的等,如果想用做按键检测等功能,需外部使用上拉或下拉电阻;

输入上拉(GPIO_Mode_IPU)

相当于输入浮空用来按键检测外加上拉电阻,只不过这个是内部上拉,省去了外部电路;

输入下拉(GPIO_Mode_IPD)

相当于输入浮空用来按键检测外加下拉电阻,只不过这个是内部下拉,省去了外部电路;

模拟输入(GPIO_Mode_AIN)

信号进入后不经过上拉电阻或者下拉电阻,关闭施密特触发器,经由另一线路把电压信号传送到片上外设模块。比如传送给ADC模块,由ADC采集电压信号。所以可以理解为模拟输入的信号是未经处理的信号;

读管脚上的信息时,设置为输入上拉(GPIO_Mode_IPU)


二、GPIO 相关函数介绍

void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);

功能: GPIO初始化

实例:HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:读取引脚的电平状态、函数返回值为01

实例:HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
功能:引脚写01 、 GPIO_PIN_RESET 或 GPIO_PIN_SET

实例:HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4,0);


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
翻转引脚的电平状态   

实例:HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4);    常用在LED上


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
功能:  中断回调函数,可以理解为中断函数具体要响应的动作。

实例:HAL_GPIO_EXTI_Callback(GPIO_PIN_4);    


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

三、STM32CubeMx 配置

为了介绍GPIO输入模式,这里选择使用示例,按键控制一个LED灯的反转
即为,设置一个GPIO为输出模式,将这个GPIO连接一个LED灯;
设置另一个GPIO为输入模式,将这个GPIO连接一个按键;

基础STM32CubeMx的配置可以参考这篇STM32 CubeMx教程 – 基础知识及配置使用教程

首先在界面选择建立新的工程

界面选择
选择芯片型号:

选择芯片
配置RCC时钟,选择外部晶振模式

RCC配置

配置SYS debug模式,由于我使用的是ST-Link ,所以选择使用Serial Wire

SYS
观察原理图,可以知道,LED灯是PA8引脚,按键是PC1引脚,所以设置PA8为输出模式,设置PC1为输入模式;

原理图

PA8PC1
配置GPIO输出模式配置:

GPIO输出配置
初始电平设置为低电平,输出模式采用推挽输出(大部分情况下使用这个,有些还会使用开漏输出),不使用内部电阻设置上拉下拉,最大输出速度设置为高;

配置GPIO输入模式:

GPIO输入模式
GPIO mode:

Output Push Pull:推挽输出,能输出高低电平,且高低电平都有驱动能力,对应标准库函数中的“GPIO_Mode_Out_PP”

Output Open Drain:开漏输出,只能输出低电平,需要借助外部上拉电阻才能输出高电平,对应标准库函数中的“GPIO_Mode_Out_OD”

Analog mode:模拟输入,ADC采样信号输入引脚的配置模式,对应标准库函数中的“GPIO_Mode_AIN”

Alternate Function Push Pull:推挽式复用功能,对应标准库函数中的“GPIO_Mode_AF_PP”

Input mode:输入模式,配合No pull-up/pull-down可形成GPIO_Mpde_IN_FLOATING、GPIO_Mode_IPD、GPIO_Mode_IPU等不同工作模式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

GPIO Pull-up/Pul-down

No pull-up/pull-down:无内部上拉或下拉,意味着使用默认初始化电平

Pull-up:内部上拉,GPIO初始化为高电平
  • 1
  • 2
  • 3

User Label:用户标签,可以按照需要给引脚命名

根据上面的原理图可知,按键另一头接的是GND,即为低电平,所以这个按键需要设置初始化为高电平,当按下按键以后就可以读取到低电平;

所以GPIO模式选择,输入模式;GPIO选择上拉输入,初始化为高电平;

时钟树配置:

时钟树配置
配置项目设置:

Project

配置Code Generator
Code Generator
生成工程

生成工程

四、代码讲解

实现按键转换LED灯的效果;
代码逻辑 :if(按键是否按下) --> 翻转LED灯电平

1

可以先上面这样写;
经过实验可以知道,按键不灵敏可能实现按一下,闪好几下的现象;
可以在加一个软件的按键消抖;

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_1)==GPIO_PIN_RESET)  //判断PC1引脚是否为低电平
		{
			HAL_Delay(200); //延时200ms
		if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_1)==GPIO_PIN_RESET)  //判断PC1引脚是否为低电平
			{
				HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_8);  //  翻转PA8的电平
			}
		}
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

HAL_Delay(200) 是延迟函数,我这里硬件不怎么灵敏所以延时时间大一点,正常的20ms就行了;也可以自己实验,自己选择一个合适的延时参数;

附录

本文中出现的代码:STM32 HAL库 GPIO输入输出

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/126093
推荐阅读
相关标签
  

闽ICP备14008679号