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();
		}

	}
}
相关推荐
创界工坊工作室11 小时前
55-基于STC89C52宠物智能饲喂控制系统设计
stm32·单片机·嵌入式硬件·51单片机·proteus·宠物
极客 - L U14 小时前
卡尔曼滤波从零到精通
c语言·数据结构·单片机·嵌入式硬件·mcu
AMASENSYS艾马斯15 小时前
变频器滤波器选型与EMC合规建议
驱动开发·单片机·其他·硬件工程·精益工程
2501_9226395819 小时前
率能半导体 SS6628E直流双向马达驱动芯片:20V/7A,覆盖电子锁、玩具、无线充电、机器人四大应用场景
单片机·嵌入式硬件·硬件工程
硅基造物主19 小时前
STM32 从 0 到 1 做智能家居(五):工程结构与代码骨架
stm32·单片机·嵌入式硬件·智能家居
深圳老胡19 小时前
STM32F103 硬件 SPI 与软件 IO 模拟 SPI 最高速度差异详解
笔记·stm32·单片机·代码规范·1024程序员节
smartpi_ai20 小时前
机芯智能离线语音模块实战问答:SU-03T、CI-03T、SU-63T 与 JX-A7T 高频问题排查
人工智能·单片机·嵌入式硬件·ci/cd·语音识别
2501_9226395820 小时前
率能半导体 SS6635E直流双向马达驱动芯片:30V/4.5A,覆盖电子锁、玩具、无线充电、机器人四大应用场景
单片机·嵌入式硬件·硬件工程
wuyk55520 小时前
TinyML 初探:在 MCU 上部署异常检测模型,实现本地振动故障诊断
stm32·单片机·嵌入式硬件·重构
新晨单片机设计20 小时前
S031A-基于STM32单片机指纹考勤系统【Proteus仿真+Keil程序+原理图】
stm32·单片机·嵌入式硬件·proteus·指纹考勤系统