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库函数介绍

  • 下面给出GD32F103库函数中GPIO部分
  • void gpio_init(uint32_t gpio_periph,uint32_t mode,uint32_t speed,uint32_t pin);//GPIO初始化:GPIOX,输入输出模式,速度,Pin口
    void gpio_bit_set(uint32_t gpio_periph, uint32_t pin);//GPIO置高电平
    void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin);//GPIO置低电平
    void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value);//GPIO写一位高低电平
    void gpio_port_write(uint32_t gpio_periph, uint16_t data);//GPIO写16位口
    FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin);//读GPIO一位输入状态
    uint16_t gpio_input_port_get(uint32_t gpio_periph);//读GPIO输入16位状态
    FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin);//读GPIO一位输出的状态
    uint16_t gpio_output_port_get(uint32_t gpio_periph);//读GPIO输出16位状态
    void gpio_pin_remap_config(uint32_t remap, ControlStatus newvalue);//GPIO重映射
    void gpio_exti_source_select(uint8_t output_port, uint8_t output_pin);//外部中断源引脚选择
    

    三、GPIO输入输出

    3.1 GPIO输出-LED闪烁

  • 如下电路图所示,PB0给高电平,LED亮
  • GD32单片机同STM32一样需要在使用外设前开启时钟,具体步骤如下:开启GPIO时钟初始化GPIO口给GPIO高低电平
  • GD32官方提供Systick.c定时器延时函数,使用时需要初始化滴答定时器
  • int main()
    {
    	rcu_periph_clock_enable(RCU_GPIOB);//开启GPIOB时钟
    	systick_config();初始化滴答定时器
    	gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_0);初始化PB0,配置成推挽输出
    	while(1)
    	{
    		gpio_bit_set(GPIOB,GPIO_PIN_0);//PB0输出高电平
    		delay_1ms(1000);//延时1000ms
    		gpio_bit_reset(GPIOB,GPIO_PIN_0);//PB0输出低电平
    		delay_1ms(1000);
    	}
    }
    

    3.2 GPIO输入-独立按键

  • 按键部分原理图如下
  • 使用按键A点亮LED1,按键B点亮LED2
  • 具体步骤:开启GPIO时钟初始化GPIO口(LED和KEY) — 读取按键状态LED反转
  • 先给出LED.c
  • #include "gd32f10x.h"                   // Device header
    
    /*
    @brief:LED初始化
    @param:无
    @retval:无
    */
    void LED_Init()
    {
    	//开启GPIOB时钟
    	rcu_periph_clock_enable(RCU_GPIOB);
    	//初始化PB0PB1,推挽输出
    	gpio_init(GPIOB,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_0|GPIO_PIN_1);
    }
    
    /*
    @brief:LED1状态反转
    @param:无
    @retval:无
    */
    void LED1_Turn()
    {
    	if(gpio_output_bit_get(GPIOB,GPIO_PIN_0) == 0)//判断PB0输出低电平?
    	{
    		gpio_bit_set(GPIOB,GPIO_PIN_0);//PB0输出高电平
    	}
    	else
    	{
    		gpio_bit_reset(GPIOB,GPIO_PIN_0);//PB0输出低电平
    	}
    }
    
    /*
    @brief:LED2状态反转
    @param:无
    @retval:无
    */
    void LED2_Turn()
    {
    	if(gpio_output_bit_get(GPIOB,GPIO_PIN_1) == 0)//判断PB1输出低电平?
    	{
    		gpio_bit_set(GPIOB,GPIO_PIN_1);//PB1输出高电平
    	}
    	else
    	{
    		gpio_bit_reset(GPIOB,GPIO_PIN_1);//PB1输出低电平
    	}
    }
    
  • 给出Key.c
  • #include "gd32f10x.h"                   // Device header
    #include "systick.h"
    
    /*
    @brief:Key初始化
    @param:无
    @retval:无
    */
    void Key_Init()
    {
    	//开启GPIOA时钟
    	rcu_periph_clock_enable(RCU_GPIOA);
    	//初始化PA0PA1,上拉输入
    	gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_0|GPIO_PIN_1);
    	//初始化滴答定时器
    	systick_config();
    }
    
    /*
    @brief:获取按键键码
    @param:无
    @retval:按键键码1 2
    */
    uint8_t Key_GetNum()
    {
    	uint8_t KeyNum = 0;
    	if(gpio_input_bit_get(GPIOA, GPIO_PIN_0) == 0)//按键1按下
    	{
    		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)//按键2按下
    	{
    		delay_1ms(25);
    		while(gpio_input_bit_get(GPIOA, GPIO_PIN_1) == 0);//检测松手
    		delay_1ms(25);
    		KeyNum  = 2;
    	}
    	return KeyNum;
    }
    
  • 下面是main.c
  • #include "gd32f10x.h"                   // Device header
    #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();
    		}
    
    	}
    }
    

    作者:侥幸哥f

    物联沃分享整理
    物联沃-IOTWORD物联网 » GD32F103单片机-GPIO

    发表回复