stm32HAL_GPIO输入

学会使用 GPIO 采集 KEY 的数据信息,这种信息采集技术在生活中常见于对大自
然环境的各种信息的采集。比如环境温度,湿度等等。我们这里以 key 为入门设
备。
一,什么是信息采集
比如环境温度,湿度等等。我们需要把这些温度,湿度的数值以传感器转换为电
流或者电压数值。这些电流数值或者电压数值进过 GPIO 传输到芯片内部,芯片

感受到电流

.GPIO 的输入控制与原理
输入:我们以开关( key )为入门设备,学习 GPIO 的信息采集

或者电压数值的变化从而反推环境中电压电流数值。

2.1KEY 硬件原理如图:
看上图:结论当 PA0 采集到高电平信号时候,认为按键 KEY 触发。
                      当 PE2 采集到低电平信号的时候,认为按键 KEY 触发。
输入输出,这里的输入指的是 信息流 输入 到芯片里。输出是指 信息流输
出到芯片外面。是信息流的方向,而不是 电流方向。
2.2.2 原理图搜索 key0,key1,key2
key 图得出结论:
找到 KEY0 对应引脚号 PE4, 而且 低电平 为触发信号。 KEY1 KEY2 可以等同。
最关键的结论:当开关按下去的时候,引脚接地为低电平,当采集到低信号的时
候,就知道开关按下去了。
结果 : 确认 key0 连接引脚 PE4,key1 连接引脚 PE3,key2 连接引脚 PE2,
得到结果 :PE4 解释 gpio 引脚第 E 组的第 4 个成员。
组号: GPIOE
成员号: GPIO_Pin_4/GPIO_Pin_2/GPIO_Pin_3/
2.3 编码实现
2.3.1 代码程序流程图。
2.3.2 ;流程图第一步时钟使能函数
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph,NewState);
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph, NewState);
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph,NewState);
RCC_APB1PeriphClockCmd( RCC_APB1Periph, NewState);
RCC_APB2PeriphClockCmd(RCC_APB2Periph, NewState);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
函数解释:让第 F 组成员都有时钟控制。没有这个时钟信号,都无法工作。
参数 1:RCC_AHB1Periph_GPIOF, 选择第几组。 参数 2 DISABLE/ENABLE
2.3.3 流程图第二部 GPIO 基本配置:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
函数解释:让程序决定第几组第几根引脚,如何工作。 参数 1 GPIOx :第几
组, 说明:查看确认引脚号,例如 PF9, 对应组为: GPIOF 。 参数 2 :第几根,如
何干活。
GPIO_InitTypeDef key_gpio_initstruct;
key_gpio_initstruct.GPIO_Mode = GPIO_Mode_IN;
// 输入输出类型: GPIO_Mode_IN/GPIO_Mode_OUT/
key_gpio_initstruct.GPIO_OType = GPIO_OType_OD;
// 推挽还是开漏 GPIO_OType_PP/GPIO_OType_OD
key_gpio_initstruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3;
// 引脚编号,说明是第几根引脚。
key_gpio_initstruct.GPIO_PuPd = GPIO_PuPd_UP;
// 上拉电阻还是下拉电阻
key_gpio_initstruct.GPIO_Speed = GPIO_High_Speed;
// 引脚的最高反应速度,默认最高就好了
GPIO_Init(GPIOE,&key_gpio_initstuct);
key_gpio_initstruct.GPIO_PuPd = GPIO_PuPd_UP;
该项配置需要与有效信号相反。有效信号为低,决定默认信号为高。用于区分开
关两种状态。
GPIO_PuPd_NOPULL: 默认信号高低都是触发信号。
GPIO_PuPd_UP: 默认高电
平,触发低电压为有效。
GPIO_PuPd_DOWN: 默认低信号,触发高电平有效。
2.3.4 :流程图第三步 GPIO 基本操作,电平数值读取:
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t
GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
key = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4);
函数:读取一根引脚的电平。以返回值形式给出。
参数 1 :第几组, GPIOE 说明
E 组成员。
参数 2 :第几个成员。 GPIO_pin_4 说明的第 4 个。
返回值:高电平
1 ,低电平为 0

 

翻转 LED 灯:
由于引脚默认为高电平,读取的数值为 1
请默认 LED 灯 为灭。
当电平信号为
低电平,数值 0.
请点亮 LED. 请自行观察 LED 灯,证明 KEY 正常工作。
4.4 完成代码整体展示:
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
GPIO_InitTypeDef key_gpio_initstruct;
key_gpio_initstruct.GPIO_Mode = GPIO_Mode_IN;
key_gpio_initstruct.GPIO_OType = GPIO_OType_OD;
key_gpio_initstruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3;
key_gpio_initstruct.GPIO_PuPd = GPIO_PuPd_UP;
key_gpio_initstruct.GPIO_Speed = GPIO_High_Speed;
GPIO_Init(GPIOE,&key_gpio_initstruct);
while(1)
{
key = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4);
key1 = GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3);
if (key1 == 0)
{
led0(0);
}
key1 = 1;
led0(1);
if (key == 0)
{
led1(0);
}
key = 1;
led1(1);
}

 

总结一下:
GPIO 四种输出模式:
开漏输出 推挽输出 开漏复用输出 推挽复用输出
GPIO 四种输入模式: 输入上拉 输入下拉 浮空输入,模拟输入
GPIO 有总共上面八种模式

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-23 08:04:04       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-23 08:04:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-23 08:04:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-23 08:04:04       18 阅读

热门阅读

  1. 张量堆叠函数torch.stack()

    2024-04-23 08:04:04       10 阅读
  2. 资料总结分享:临床重要数据库

    2024-04-23 08:04:04       13 阅读
  3. 可信通信(TLS/SSL协议)

    2024-04-23 08:04:04       11 阅读
  4. <基础数学> 平面向量基本定理

    2024-04-23 08:04:04       9 阅读
  5. 数学分析复习:中值定理、反函数定理

    2024-04-23 08:04:04       14 阅读
  6. linux系统安装docker-compose

    2024-04-23 08:04:04       11 阅读