GD32F103单片机-GPIO
GD32F103单片机-GPIO
一、GPIO介绍
二、GD32F103库函数介绍
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闪烁
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输入-独立按键
#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输出低电平
}
}
#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;
}
#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