GD32F103单片机-GPIO
一、GPIO介绍 二、GD32F103库函数介绍 三、GPIO输入输出 3.1 GPIO输出-LED闪烁 3.2 GPIO输入-独立按键
STM32GPIO部分见STM32F1单片机-GPIO
一、GPIO介绍
GD32的GPIO同STM32一样,GPIO可以配置成8种输入输出模式 ,由软件配置成推挽输出 、开漏输出 、复用推挽输出 、复用开漏输出 、上拉输入 、下拉输入 、浮空输入 、模拟输入 (ADC) 当GPIO配置成输入模式 时,可以选择弱上拉和下拉电 阻,输出缓冲器禁用(不可以输出 ) 当GPIO配置成输出模式 时,弱上拉和下拉电阻禁用 ,开漏模式 输出低电平,高电平时为高阻态 (无法输出高电平 ),允许外置上拉电阻拉高电平,从而可以准确读取外部输入信号 。推挽模式 下,可以输出高低电平 ,可以进行读引脚输出电平 的操作,若需要读取外部信号输入,必须重新初始化GPIO为输入模式 复用输出模式 由单片机外设 控制引脚,模拟输入 模式下接到ADC外设 ,模拟输出 模式接到DAC外设 下图为GPIO结构图
二、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) ;
三、GPIO输入输出
3.1 GPIO输出-LED闪烁
GD32单片机同STM32一样需要在使用外设前开启时钟,具体步骤如下:开启GPIO时钟 — 初始化GPIO口 — 给GPIO高低电平 GD32官方提供Systick.c定时器延时函数 ,使用时需要初始化滴答定时器
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 ) ;
}
}
3.2 GPIO输入-独立按键
按键部分原理图如下 使用按键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 ( ) ;
}
}
}