前言
在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小灯亮灭。