赞
踩
STM32F103系列的I/O引脚共有8种工作模式,
其中输入模式有四种:输入浮空(GPIO_Mode_IN_FLOATING)、输入上拉(GPIO_Mode_IPU)、输入下拉(GPIO_Mode_IPD)、模拟输入(GPIO_Mode_AIN)
输入引脚即不接高电平,也不接低电平,用于标准的通讯协议,比如IIC、USART的等,如果想用做按键检测等功能,需外部使用上拉或下拉电阻;
相当于输入浮空用来按键检测外加上拉电阻,只不过这个是内部上拉,省去了外部电路;
相当于输入浮空用来按键检测外加下拉电阻,只不过这个是内部下拉,省去了外部电路;
信号进入后不经过上拉电阻或者下拉电阻,关闭施密特触发器,经由另一线路把电压信号传送到片上外设模块。比如传送给ADC模块,由ADC采集电压信号。所以可以理解为模拟输入的信号是未经处理的信号;
读管脚上的信息时,设置为输入上拉(GPIO_Mode_IPU)
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
功能: GPIO初始化
实例:HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:读取引脚的电平状态、函数返回值为0或1
实例:HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
功能:引脚写0或1 、 GPIO_PIN_RESET 或 GPIO_PIN_SET
实例:HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4,0);
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
翻转引脚的电平状态
实例:HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4); 常用在LED上
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
功能: 中断回调函数,可以理解为中断函数具体要响应的动作。
实例:HAL_GPIO_EXTI_Callback(GPIO_PIN_4);
为了介绍GPIO输入模式,这里选择使用示例,按键控制一个LED灯的反转;
即为,设置一个GPIO为输出模式,将这个GPIO连接一个LED灯;
设置另一个GPIO为输入模式,将这个GPIO连接一个按键;
基础STM32CubeMx的配置可以参考这篇STM32 CubeMx教程 – 基础知识及配置使用教程
首先在界面选择建立新的工程
选择芯片型号:
配置RCC时钟,选择外部晶振模式
配置SYS debug模式,由于我使用的是ST-Link ,所以选择使用Serial Wire
观察原理图,可以知道,LED灯是PA8引脚,按键是PC1引脚,所以设置PA8为输出模式,设置PC1为输入模式;
配置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等不同工作模式
GPIO Pull-up/Pul-down
No pull-up/pull-down:无内部上拉或下拉,意味着使用默认初始化电平
Pull-up:内部上拉,GPIO初始化为高电平
User Label:用户标签,可以按照需要给引脚命名
根据上面的原理图可知,按键另一头接的是GND,即为低电平,所以这个按键需要设置初始化为高电平,当按下按键以后就可以读取到低电平;
所以GPIO模式选择,输入模式;GPIO选择上拉输入,初始化为高电平;
时钟树配置:
配置项目设置:
配置Code Generator
生成工程
实现按键转换LED灯的效果;
代码逻辑 :if(按键是否按下) --> 翻转LED灯电平
可以先上面这样写;
经过实验可以知道,按键不灵敏可能实现按一下,闪好几下的现象;
可以在加一个软件的按键消抖;
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的电平
}
}
}
HAL_Delay(200) 是延迟函数,我这里硬件不怎么灵敏所以延时时间大一点,正常的20ms就行了;也可以自己实验,自己选择一个合适的延时参数;
本文中出现的代码:STM32 HAL库 GPIO输入输出
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。