学会使用 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_ODkey_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 有总共上面八种模式