学习目标
GPIO初始化,需要考虑到当前引脚的初始状态,初始化配置为不上拉也不下拉。
因此,抬起时,默认为低电平;按下时,为高电平。
实现逻辑
/********************* PE3 LED0引脚 *********************/
// 1. 时钟初始化
rcu_periph_clock_enable(RCU_GPIOE);
// 2. 配置GPIO 输入输出模式
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_3);
// 3. 配置GPIO 模式的操作方式
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_3);
/********************* PA0 按键引脚 *********************/
// 时钟初始化
rcu_periph_clock_enable(RCU_GPIOA);
// 配置GPIO模式
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
FlagStatus pre_state = RESET;
while(1) {
FlagStatus state = gpio_input_bit_get(GPIOA, GPIO_PIN_0);
if(SET == state && pre_state == RESET) {
// 当前高电平, 上一次为低电平,按下开灯
pre_state = state;
gpio_bit_set(GPIOE, GPIO_PIN_3);
} else if(RESET == state && pre_state == SET) {
// 当前低电平, 上一次为高电平,抬起关灯
pre_state = state;
gpio_bit_reset(GPIOE, GPIO_PIN_3);
}
}
按键点灯二
GPIO初始化,需要考虑到当前引脚的初始状态,初始化配置为上拉,给一个默认的状态。
因此,抬起时,默认为高电平;按下时,为低电平。
实现逻辑
/********************* PE3 LED0引脚 *********************/
// 1. 时钟初始化
rcu_periph_clock_enable(RCU_GPIOE);
// 2. 配置GPIO 输入输出模式
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_3);
// 3. 配置GPIO 模式的操作方式
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_3);
/********************* PD0 按键引脚 *********************/
// 时钟初始化
rcu_periph_clock_enable(RCU_GPIOD);
// 配置GPIO模式
gpio_mode_set(GPIOD, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_0);
FlagStatus pre_state2 = SET;
while(1) {
FlagStatus state = gpio_input_bit_get(GPIOD, GPIO_PIN_0);
if(RESET == state && pre_state2 == SET) {
// 当前低电平, 上一次为高电平,按下
pre_state2 = state;
gpio_bit_set(GPIOE, GPIO_PIN_3);
} else if(SET == state && pre_state2 == RESET) {
// 当前高电平, 上一次为低电平,抬起
pre_state2 = state;
gpio_bit_reset(GPIOE, GPIO_PIN_3);
}
delay_1ms(20);
}
完整代码
#include "gd32f4xx.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
/**
PA0为按键引脚
**/
static void GPIO_config() {
/********************* PE3 LED0引脚 *********************/
// 1. 时钟初始化
rcu_periph_clock_enable(RCU_GPIOE);
// 2. 配置GPIO 输入输出模式
gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_3);
// 3. 配置GPIO 模式的操作方式
gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_2MHZ, GPIO_PIN_3);
/********************* PA0 按键引脚 *********************/
// 时钟初始化
rcu_periph_clock_enable(RCU_GPIOA);
// 配置GPIO模式
gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
/********************* PD0 按键引脚 *********************/
// 时钟初始化
rcu_periph_clock_enable(RCU_GPIOD);
// 配置GPIO模式
gpio_mode_set(GPIOD, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_0);
}
int main(void)
{
systick_config();
GPIO_config();
FlagStatus pre_state = RESET;
FlagStatus pre_state2 = SET;
while(1) {
FlagStatus state = gpio_input_bit_get(GPIOA, GPIO_PIN_0);
if(SET == state && pre_state == RESET) {
// 当前高电平, 上一次为低电平,按下开灯
pre_state = state;
gpio_bit_set(GPIOE, GPIO_PIN_3);
} else if(RESET == state && pre_state == SET) {
// 当前低电平, 上一次为高电平,抬起关灯
pre_state = state;
gpio_bit_reset(GPIOE, GPIO_PIN_3);
}
state = gpio_input_bit_get(GPIOD, GPIO_PIN_0);
if(RESET == state && pre_state2 == SET) {
// 当前低电平, 上一次为高电平,按下
pre_state2 = state;
gpio_bit_set(GPIOE, GPIO_PIN_3);
} else if(SET == state && pre_state2 == RESET) {
// 当前高电平, 上一次为低电平,抬起
pre_state2 = state;
gpio_bit_reset(GPIOE, GPIO_PIN_3);
}
delay_1ms(20);
}
}
练习题
- 实现按键点灯