学会使用
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;
总结一下:
GPIO
四种输出模式:
开漏输出
,
推挽输出
,
开漏复用输出
,
推挽复用输出
GPIO
四种输入模式:
输入上拉
,
输入下拉
,
浮空输入,模拟输入
。
GPIO
有总共上面八种模式