ARM32开发——GPIO输入

🎬 秋野酱:《个人主页》

🔥 个人专栏:《Java专栏》《Python专栏》

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

文章目录

按键点灯一


● 按下按键,LED1亮

● 抬起按键,LED1灭

开发流程

  1. GPIO初始化
  2. 按键扫描,按下点灯,抬起灭灯
    输入状态
  3. 默认状态:由电路图决定了,当前按键默认接地,因此默认为低电平。
  4. 按下按键:3V3导通,输入变为高电平
    GPIO初始化,需要考虑到当前引脚的初始状态,初始化配置为不上拉也不下拉。
    因此,抬起时,默认为低电平;按下时,为高电平。
    实现逻辑
csharp 复制代码
/********************* 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);
csharp 复制代码
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初始化,需要考虑到当前引脚的初始状态,初始化配置为上拉,给一个默认的状态。
    因此,抬起时,默认为高电平;按下时,为低电平。
    实现逻辑
csharp 复制代码
/********************* 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);
csharp 复制代码
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左右再判断

● 使用嘀嗒定时器,记录并判断高低电平变化的间隔时间

相关推荐
文火冰糖的硅基工坊15 分钟前
[硬件电路-180]:集成运放,在同向放大和反向放大电路中,失调电压与信号一起被等比例放大;但在跨阻运放中,失调电压不会与电流信号等比例放大。
嵌入式硬件·系统架构·电路·跨学科融合
三佛科技-1341638421227 分钟前
迷你取暖器MCU方案,迷你暖风机方案分析
单片机·嵌入式硬件·智能家居·pcb工艺
国科安芯27 分钟前
前沿探索:RISC-V 架构 MCU 在航天级辐射环境下的可靠性测试
网络·单片机·嵌入式硬件·fpga开发·硬件架构·risc-v
小莞尔1 小时前
【51单片机】【protues仿真】基于51单片机多功能电子秤系统
单片机·嵌入式硬件
范纹杉想快点毕业1 小时前
请创建一个视觉精美、交互流畅的进阶版贪吃蛇游戏
数据库·嵌入式硬件·算法·mongodb·游戏·fpga开发·交互
源远流长jerry1 小时前
STM32之wifi模块与MQTT模块详解
stm32·单片机·嵌入式硬件
Hello_Embed1 小时前
STM32HAL 快速入门(二十四):I2C 编程(一)—— 从 OLED 显示初识 I2C 协议
c语言·stm32·单片机·嵌入式硬件·学习
朱自清的诗.3 小时前
stm32中 中断和事件的区别
stm32·单片机
嫣语岁月5 小时前
【BMS电池管理】基于BQ76920与STM32的BMS设计开发
c语言·vscode·stm32·单片机·嵌入式硬件
sheepwjl8 小时前
《嵌入式硬件(七):使用IMX6ULL所需环境以及编译方法》
单片机·嵌入式硬件·环境·.s编译