ARM32开发——GPIO输入

ops/2024/9/22 21:34:05/

🎬 秋野酱:《个人主页》
🔥 个人专栏:《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左右再判断
● 使用嘀嗒定时器,记录并判断高低电平变化的间隔时间


http://www.ppmy.cn/ops/47219.html

相关文章

MaaS玩家:希望AI大模型价格战再狠一点

明知产能严重过剩的新能源企业却还在重金扩产&#xff0c;多半因为他们花的不是自己的钱&#xff1b;明知极度烧钱的AI大模型却开始打价格战&#xff0c;多半因为他们并不靠这东西挣钱。 所有投资人必备的一项技能&#xff0c;就是中观行业景气度及商业模式对比。很明显&#…

Django 解决 CSRF 问题

在 Django 出现 CSRF 问题 要解决这个问题&#xff0c;就得在 html 里这么修改 <!DOCTYPE html> <html><head></head><body><form action"/login/" method"post">{% csrf_token %}</form></body> </…

【异常分析:四分位距与3σ原则】

文章目录 前言四分位距&#xff08;IQR&#xff09;3σ原则使用步骤计算四分位距应用3σ原则 代码 前言 异常分析的目标是识别数据中的异常值&#xff0c;这些异常值可能是由于错误的记录、设备故障或者其他未知原因导致的。四分位距&#xff08;interquartile range, IQR&…

WebStorm 2024.1.1 Mac激活码 前端开发工具集成开发环境(IDE)

WebStorm 2024 Mac激活码 搜索Mac软件之家下载WebStorm 2024 Mac激活版 WebStorm 2024 功能介绍 WebStorm 2024是由JetBrains公司开发的一款专为前端开发设计的集成开发环境&#xff08;IDE&#xff09;。它提供了一整套功能&#xff0c;旨在提高Web开发者的工作效率和代码质…

数字塔问题

#include<iostream> using namespace std; //从下向上得到最优值 void dtower(int a[][100],int s[][100],int n) {for(int in; i>1; i--){for(int j1; j<i; j){if(in)s[i][j]a[i][j];else{int ts[i1][j];if(t<s[i1][j1])ts[i1][j1];s[i][j]a[i][j]t;}}} } void…

音视频开发13 FFmpeg 音频 相关格式分析 -- AAC ADTS格式分析

这一节&#xff0c;我们学习常用的音频的格式 AAC&#xff0c;重点是掌握 AAC的传输格式 ADTS 头部的信息&#xff0c;目的是 &#xff1a; 当音频数据有问题的时候&#xff0c;如果是AAC的编码&#xff0c;在分析 头部信息的时候能够根据头部信息 判断问题是否出现在 头部。 A…

探秘Android系统启动的神秘面纱

系统启动过程对于任何操作系统来说都是一个非常关键的环节&#xff0c;Android作为移动设备领域中占据主导地位的操作系统&#xff0c;其启动过程也是个值得深入研究的重点话题。本文将为您解开Android启动过程的神秘面纱&#xff0c;详细剖析其中的每一个步骤&#xff0c;并通…

LLM的基础模型3:Transformer变种

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…