GD32F103单片机-GPIO

GD32F103单片机-GPIO

一、GPIO介绍

  • GD32的GPIO同STM32一样,GPIO可以配置成8种输入输出模式 ,由软件配置成推挽输出开漏输出复用推挽输出复用开漏输出上拉输入下拉输入浮空输入模拟输入(ADC)
  • 当GPIO配置成输入模式 时,可以选择弱上拉和下拉电 阻,输出缓冲器禁用(不可以输出)
  • 当GPIO配置成输出模式 时,弱上拉和下拉电阻禁用开漏模式 输出低电平,高电平时为高阻态 (无法输出高电平 ),允许外置上拉电阻拉高电平,从而可以准确读取外部输入信号推挽模式 下,可以输出高低电平 ,可以进行读引脚输出电平 的操作,若需要读取外部信号输入,必须重新初始化GPIO为输入模式
  • 复用输出模式 由单片机外设 控制引脚,模拟输入 模式下接到ADC外设模拟输出 模式接到DAC外设
  • 下图为GPIO结构图

二、GD32F103库函数介绍

  • 下面给出GD32F103库函数中GPIO部分
c 复制代码
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定时器延时函数 ,使用时需要初始化滴答定时器
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
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
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
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();
		}

	}
}
相关推荐
清风6666665 小时前
基于单片机的螺旋藻生长大棚PH智能控制设计
单片机·嵌入式硬件·毕业设计·课程设计
ting_zh6 小时前
微控制器(Micro Controller Unit, MCU)基础整理
单片机·嵌入式硬件
清风6666667 小时前
基于单片机的图书馆智能座位管理平台
数据库·单片机·嵌入式硬件·毕业设计·课程设计
得单片机的运8 小时前
STM32的以太网的搭建
stm32·单片机·嵌入式硬件·物联网·以太网·iot·w5500
酷飞飞9 小时前
RTC和看门狗基于GD32F407VE的天空星的配置
stm32·单片机·嵌入式硬件·mcu
WD1372980155710 小时前
WD5030A,24V降5V,15A 大电流,应用于手机、平板、笔记本充电器
stm32·单片机·嵌入式硬件·智能手机·汽车·电脑·51单片机
日更嵌入式的打工仔10 小时前
GPIO 中断通用配置指南
stm32·单片机·嵌入式硬件
平凡灵感码头11 小时前
基于 STM32 的智能门锁系统,系统界面设计
stm32·单片机·嵌入式硬件
报错小能手12 小时前
linux学习笔记(32)网络编程——UDP
单片机·嵌入式硬件
xyx-3v14 小时前
SPI四种工作模式
stm32·单片机·嵌入式硬件·学习