学习目标
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);}}
练习题
- 实现按键点灯


