- GD32的GPIO同STM32一样,GPIO可以配置成8种输入输出模式,由软件配置成推挽输出、开漏输出、复用推挽输出、复用开漏输出、上拉输入、下拉输入、浮空输入、模拟输入(ADC)
- 当GPIO配置成输入模式时,可以选择弱上拉和下拉电阻,输出缓冲器禁用(不可以输出)
- 当GPIO配置成输出模式时,弱上拉和下拉电阻禁用,开漏模式输出低电平,高电平时为高阻态(无法输出高电平),允许外置上拉电阻拉高电平,从而可以准确读取外部输入信号。推挽模式下,可以输出高低电平,可以进行读引脚输出电平的操作,若需要读取外部信号输入,必须重新初始化GPIO为输入模式
- 复用输出模式由单片机外设控制引脚,模拟输入模式下接到ADC外设,模拟输出模式接到DAC外设
- 下图为GPIO结构图
GD32F103_10">二、GD32F103库函数介绍
void gpio_init(uint32_t gpio_periph,uint32_t mode,uint32_t speed,uint32_t pin);
void gpio_bit_set(uint32_t gpio_periph, uint32_t pin);
void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin);
void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value);
void gpio_port_write(uint32_t gpio_periph, uint16_t data);
FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin);
uint16_t gpio_input_port_get(uint32_t gpio_periph);
FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin);
uint16_t gpio_output_port_get(uint32_t gpio_periph);
void gpio_pin_remap_config(uint32_t remap, ControlStatus newvalue);
void gpio_exti_source_select(uint8_t output_port, uint8_t output_pin);
GPIOLED_29">3.1 GPIO输出-LED闪烁
int main()
{rcu_periph_clock_enable(RCU_GPIOB);systick_config();gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_0);while(1){gpio_bit_set(GPIOB,GPIO_PIN_0);delay_1ms(1000);gpio_bit_reset(GPIOB,GPIO_PIN_0);delay_1ms(1000);}
}
- 按键部分原理图如下
- 使用按键A点亮LED1,按键B点亮LED2
- 具体步骤:开启GPIO时钟 — 初始化GPIO口(LED和KEY) — 读取按键状态 — LED反转
- 先给出LED.c
#include "gd32f10x.h"
void LED_Init()
{rcu_periph_clock_enable(RCU_GPIOB);gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_0|GPIO_PIN_1);
}
void LED1_Turn()
{if(gpio_output_bit_get(GPIOB,GPIO_PIN_0) == 0){gpio_bit_set(GPIOB,GPIO_PIN_0);}else{gpio_bit_reset(GPIOB,GPIO_PIN_0);}
}
void LED2_Turn()
{if(gpio_output_bit_get(GPIOB,GPIO_PIN_1) == 0){gpio_bit_set(GPIOB,GPIO_PIN_1);}else{gpio_bit_reset(GPIOB,GPIO_PIN_1);}
}
#include "gd32f10x.h"
#include "systick.h"
void Key_Init()
{rcu_periph_clock_enable(RCU_GPIOA);gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_0|GPIO_PIN_1);systick_config();
}
uint8_t Key_GetNum()
{uint8_t KeyNum = 0;if(gpio_input_bit_get(GPIOA, GPIO_PIN_0) == 0){delay_1ms(25);while(gpio_input_bit_get(GPIOA, GPIO_PIN_0) == 0);delay_1ms(25);KeyNum = 1;}if(gpio_input_bit_get(GPIOA, GPIO_PIN_1) == 0){delay_1ms(25);while(gpio_input_bit_get(GPIOA, GPIO_PIN_1) == 0);delay_1ms(25);KeyNum = 2;}return KeyNum;
}
#include "gd32f10x.h"
#include "systick.h"
#include "LED.h"
#include "Key.h"uint8_t KeyNum = 0;int main()
{LED_Init();Key_Init();while(1){KeyNum = Key_GetNum();if (KeyNum == 1){LED1_Turn();}if (KeyNum == 2){LED2_Turn();}}
}