• 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 有总共上面八种模式
  • 相关阅读:
    Nginx目录结构与配置文件详解
    SQL语句该如何写?
    Flink1.17 DataStream API
    RocksDB 在 vivo 消息推送系统中的实践
    2022/08/08 day05:Jedis
    图文详解Linux基础经典教程(07)——CentOS安装Tomcat
    PHP跨域解决
    Tomcat部署
    vm.$set函数的个人总结
    Java中的this关键字
  • 原文地址:https://blog.csdn.net/hmh520i/article/details/138068138