【STM32笔记】STM32的GPIO基础开发(二) (按键,基于STM32CubeMX以及HAL库函数)

前言

 在STM32的GPIO基础开发(一)中讲到了GPIO输出有关的HAL库函数,在这一节中让我们来聊一聊GPIO输入有关的HAL库函数。

一. GPIO输入模式

 GPIO的输入模式一共有4种(浮空输入模式、上拉输入模式、下拉输入模式、模拟输入模式)。

  当I/O端口配置为输入时:

  ● 输出缓冲器被禁止
  ● 施密特触发输入被激活
  ● 根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接
  ● 出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器
  ● 对输入数据寄存器的读访问可得到I/O状态
  
关于GPIO的8种模式我们下一节再聊聊。
在这里插入图片描述

二. 使用STM32CubeMX配置GPIO基础开发-输入模式

  打开STM32CubeMX软件

在这里插入图片描述

  点击file->new project新建一个工程

在这里插入图片描述
在这里插入图片描述

  点开system core->RCC->HSE中选择crystal/ceramic resonator配置RCC使用外部高速时钟源,再点开system core->SYS->Debug中选择serial wire,再到Clock Configuration配置时钟源

在这里插入图片描述
我不到啊
在这里插入图片描述

  我的开发板上的按键是在接在了PA0管脚口上,此时我们需要将其设置为下拉输入模式,按键按下后,该管脚口将会接通左侧的VCC3.3高电平才会输入到芯片中,配置如下。

在这里插入图片描述
在这里插入图片描述

  至此我们就已经配置好了一个GPIO管脚口的输入模式,现在我们学习保存工程,操作如下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

关于STM32CubeMX软件创建一个GPIO输入工程到此就创建好了,接下来我们来聊聊看看GPIO电平输入有关的HAL库函数

三. GPIO输入电平读取有关HAL库函数

  GPIO电平输入HAL库函数

	GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
	/**
	* @概要    读取指定的输入端口引脚
    * @参数    GPIOx: 端口号,其中x可以是A…G(取决于你所使用的设备)来选择GPIO外设。如:GPIOA
	* @参数    GPIO_Pin: 引脚号,指定要写入的端口位。该参数可以是GPIO_PIN_x中的一个,其中x可以是(0..15)。如GPIO_PIN_1
	* @返回值 输入端口引脚值
	*/

  举个例子:判断PA0引脚的输入信号,若为高电平,则将PB4引脚控制的LED灯的开关状态切换。

	if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET)  
	{              
	    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_4);      
	}

  GPIO输入初始化函数源码剖析

	void MX_GPIO_Init(void){
	  GPIO_InitTypeDef GPIO_InitStruct = {0};
	  /* GPIO端口时钟使能 */
	  __HAL_RCC_GPIOD_CLK_ENABLE();
	  __HAL_RCC_GPIOA_CLK_ENABLE();
	  __HAL_RCC_GPIOB_CLK_ENABLE();
	  /*GPIO初始化函数源码剖析*/
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
	  /*配置GPIO引脚: PA0 */
	  GPIO_InitStruct.Pin = GPIO_PIN_0; //GPIO端口的引脚号是:0
	  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;设置当前的GPIO的模式是:输入模式
	  GPIO_InitStruct.Pull = GPIO_PULLDOWN;//设置当前的GPIO的模式是:下拉输入模式
	  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //将参数结构设置到GPIOA端口
	  /*配置GPIO引脚: PB4 */
	  GPIO_InitStruct.Pin = GPIO_PIN_4;
	  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	  GPIO_InitStruct.Pull = GPIO_NOPULL;
	  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
	}

五. 实现点亮开发板上的LED小灯

 在main.c的while(1) { } 中添加如下代码

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET){
		  HAL_Delay(5);
		  if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET){
			  while(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET);
			  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4);
		  }
	  }
	  
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 实现的效果:当开发板检测到接通PA0管脚口的按键按下并回弹后,翻转PB4的电平控制LED小灯亮灭。

请注意:所有自己编写的代码请放在/* USER CODE BEGIN XXX / 到 / USER CODE END XXX */之间 这样我们在STM32CubeMX中修改工程的时候重新生成工程文件的时候自己之前所写的代码就不会被删除啦

下一节我们来聊聊GPIO的8种模式及其工作原理

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值