• ARM32开发——GPIO输入


    🎬 秋野酱:《个人主页》
    🔥 个人专栏:《Java专栏》《Python专栏》

    ⛺️心若有所向往,何惧道阻且长

    按键点灯一

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    ● 按下按键,LED1亮
    ● 抬起按键,LED1灭
    开发流程

    1. GPIO初始化
    2. 按键扫描,按下点灯,抬起灭灯
      输入状态
    3. 默认状态:由电路图决定了,当前按键默认接地,因此默认为低电平。
    4. 按下按键:3V3导通,输入变为高电平
      GPIO初始化,需要考虑到当前引脚的初始状态,初始化配置为不上拉也不下拉。
      因此,抬起时,默认为低电平;按下时,为高电平。
      实现逻辑
    /********************* PA0 按键引脚 *********************/
    // 时钟初始化
    rcu_periph_clock_enable(RCU_GPIOA);
    // 配置GPIO模式
    gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
    
    /********************* PB2 LED1引脚 *********************/
    // 1. 时钟初始化
    rcu_periph_clock_enable(RCU_GPIOB);
    // 2. 配置GPIO 输入输出模式
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2);
    // 3. 配置GPIO 模式的操作方式
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_2);
    
    FlagStatus pre_state = RESET;// 默认低电平抬起
    while(1) {
    	FlagStatus state = gpio_input_bit_get(GPIOA, GPIO_PIN_0);
    	if (state != pre_state){
    		if(state == SET){  // 当前高电平, 上一次为低电平,按下开灯
    			gpio_bit_set(GPIOB, GPIO_PIN_2);
    		}else {						 // 当前低电平, 上一次为高电平,抬起关灯
    			gpio_bit_reset(GPIOB, GPIO_PIN_2);
    		}
    		pre_state = state;	
    	}
    }
    

    按键点灯二

    在这里插入图片描述

    ● 按下按键PC0,LED1亮
    ● 抬起按键PC0,LED1灭
    开发流程

    1. GPIO初始化
    2. 按键扫描,按下点灯,抬起灭灯
      输入状态
    3. 默认状态:由电路图决定,当前按键通过开关接地,因此默认什么都没有接,默认状态不确定。
    4. 按下按键,开关导通接地,输入变为低电平
      GPIO初始化,需要考虑到当前引脚的初始状态,初始化配置为上拉,给一个默认的状态。
      因此,抬起时,默认为高电平;按下时,为低电平。
      实现逻辑
    /********************* PC0 按键引脚 *********************/
    // 时钟初始化
    rcu_periph_clock_enable(RCU_GPIOC);
    // 配置GPIO模式
    gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_0);
    
    /********************* PB2 LED1引脚 *********************/
    // 1. 时钟初始化
    rcu_periph_clock_enable(RCU_GPIOB);
    // 2. 配置GPIO 输入输出模式
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2);
    // 3. 配置GPIO 模式的操作方式
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_2);
    // 初始化为低电平
    gpio_bit_reset(GPIOB, GPIO_PIN_2);
    
    FlagStatus pre_state = SET;// 默认高电平抬起
    while(1) {
    	FlagStatus state = gpio_input_bit_get(GPIOC, GPIO_PIN_0);
    	if (state != pre_state){
    		if(state == SET){   // 当前高电平, 上一次为低电平,抬起关灯
    			gpio_bit_reset(GPIOB, GPIO_PIN_2);
    		}else {						 	// 当前低电平, 上一次为高电平,按下开灯
    			gpio_bit_set(GPIOB, GPIO_PIN_2);
    		}
    		pre_state = state;	
    	}
    }
    

    完整代码

    #include “gd32f4xx.h”
    #include “systick.h”
    #include <stdio.h>
    /*********************
    任务目标:

    按键 PA0,PC0
    LED1 PB2

    ● 按下按键,LED1亮
    ● 抬起按键,LED1灭

    **********************/

    void GPIO_config(void) {

    /********************* PA0 按键引脚 *********************/
    // 时钟初始化
    rcu_periph_clock_enable(RCU_GPIOA);
    // 配置GPIO模式
    gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);

    /********************* PC0 按键引脚 *********************/
    // 时钟初始化
    rcu_periph_clock_enable(RCU_GPIOC);
    // 配置GPIO模式
    gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_0);

    /********************* PB2 LED1引脚 *********************/
    // 1. 时钟初始化
    rcu_periph_clock_enable(RCU_GPIOB);
    // 2. 配置GPIO 输入输出模式
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2);
    // 3. 配置GPIO 模式的操作方式
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_2);
    // 初始化为低电平
    gpio_bit_reset(GPIOB, GPIO_PIN_2);

    }

    int main(void) {

    // 系统滴答定时器初始化
    systick_config();
    // GPIO初始化
    GPIO_config();

    FlagStatus pre_state = RESET;// 默认低电平抬起
    FlagStatus pre_state1 = RESET;// 默认低电平抬起
    while(1) {
    FlagStatus state = gpio_input_bit_get(GPIOA, GPIO_PIN_0);
    if (state != pre_state){
    if(state == SET){ // 当前高电平, 上一次为低电平,按下开灯
    gpio_bit_set(GPIOB, GPIO_PIN_2);
    }else { // 当前低电平, 上一次为高电平,抬起关灯
    gpio_bit_reset(GPIOB, GPIO_PIN_2);
    }
    pre_state = state;
    }

    FlagStatus state1 = gpio_input_bit_get(GPIOC, GPIO_PIN_0);
    	if (state1 != pre_state1){
      if(state1 == SET){   // 当前高电平, 上一次为低电平,抬起关灯
    			gpio_bit_reset(GPIOB, GPIO_PIN_2);
    		}else {						 	// 当前低电平, 上一次为高电平,按下开灯
    			gpio_bit_set(GPIOB, GPIO_PIN_2);
    		}
      pre_state1 = state1;	
    	}
    

    }

    }

    按钮输入的接线方式

    上拉电阻
    IO口默认为高电平,按钮按下导通拉低
    在这里插入图片描述

    下拉电阻
    IO口默认为低电平,按钮按下导通拉高
    在这里插入图片描述

    消除抖动

    由于按键在按下或释放时,有机械弹性的影响,会产生一些触点的电平抖动,抖动时长与按钮本身有关,通常为5ms-10ms,如果在抖动期间检测高低电平,会导致判断错误或重复判断。我们必须进行消抖操作,消抖又分为硬件消抖和软件消抖,两者可单独使用也可合并使用。
    在这里插入图片描述

    硬件消抖

    为按钮两边添加滤波电容,可以实现消抖目的
    在这里插入图片描述
    软件消抖
    ● 在代码判定时,主动延时10ms左右再判断
    ● 使用嘀嗒定时器,记录并判断高低电平变化的间隔时间

  • 相关阅读:
    电脑彻底卸载双系统中的Ubuntu ThinkPad X1 Carbon
    js 把对象转为字符串,并以逗号隔开
    21天学习挑战赛——Python pdfplumber读取PDF写入Excel
    Linux上快速安装zookeeper
    springboot基于微信小程序的高校学生疫情在校封闭管理系统的设计与实现毕业设计源码240904
    Android问题解决
    Jlink_V9固件修复教程
    WebDAV之π-Disk派盘 + Keepass2Android
    JAVA应用导致 CPU 100% 占用问题排查
    mysql原理
  • 原文地址:https://blog.csdn.net/qiuyeyyy/article/details/139346454