GD32F103单片机-GPIO

ops/2024/9/23 9:33:56/

GD32F103单片机-GPIO

  • 一、GPIO介绍
  • 二、GD32F103库函数介绍
  • 三、GPIO输入输出
    • 3.1 GPIO输出-LED闪烁
    • 3.2 GPIO输入-独立按键

GPIO_2">一、GPIO介绍

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

在这里插入图片描述

GD32F103_10">二、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_28">三、GPIO输入输出

GPIOLED_29">3.1 GPIO输出-LED闪烁

  • 如下电路图所示,PB0给高电平,LED亮

在这里插入图片描述

  • GD32单片机同STM32一样需要在使用外设前开启时钟,具体步骤如下:开启GPIO时钟初始化GPIOGPIO高低电平
  • 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);//延时1000msgpio_bit_reset(GPIOB,GPIO_PIN_0);//PB0输出低电平delay_1ms(1000);}
}

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

http://www.ppmy.cn/ops/110601.html

相关文章

keep-alive缓存不了iframe

最近做了个项目&#xff0c;其中有个页面是由 iframe 嵌套了一个另外的页面&#xff0c;在运行的过程中发现 KeepAlive 并不生效&#xff0c;每次切换路由都会触发 iframe 页面的重新渲染&#xff0c;代码如下&#xff1a; <router-view v-slot"{ Component }">…

Spring Cloud之二 微服务注册

1&#xff1a;Intellij 新建服务 user-service 2&#xff1a;pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"…

GD32E230 RTC报警中断功能使用

GD32E230 RTC报警中断使用 GD32E230 RTC时钟源有3个&#xff0c;一个是内部RC振动器产生的40KHz作为时钟源&#xff0c;或者是有外部32768Hz晶振.,或者外部高速时钟晶振分频作为时钟源。 &#x1f516;个人认为最难理解难点的就是有关RTC时钟异步预分频和同步预分频的计算。在对…

Servlet学习详解--基本涵盖所有Servlet知识点

目录 一、Servlet二、 Servlet入门2.1. 执行原理2.2. 实现Servlet接口重写其五个方法及其生命周期 三、Request请求对象3.1. 获取请求消息数据3.2. 获取请求头数据3.3. 获取请求体数据3.4. 设置编码3.5. 其他通用功能3.6. 请求转发(Forward)3.7. 转发共享数据 四、Response对象…

使用lspci命令获取加速卡型号

文章目录 前言一、lspci -nn 获取具体厂商及设备ID二、使用步骤三、使用3080Ti再查询一下 前言 新到的实验机器和加速卡&#xff0c;安装好之后发现lspci命令没有显示型号&#xff0c;这里记录下使用 Vendor ID和Device ID 通过网页查询获取加速卡具体型号的过程。 一、lspci …

数据中台 | 数据资源管理平台介绍

01 产品概述 数据资源的盘查、集成、存储、组织、共享等全方位管理能力&#xff0c;无论对于企业的数字化转型&#xff0c;还是对企业数据资产的开发、运营、交易及入表&#xff0c;都具有极为关键的作用。今天&#xff0c;小兵就来为大家介绍我们自研数据智能平台中的核心产品…

Spring Boot 技术提升房屋租赁系统性能

第2章 技术介绍 2.1 相关技术 房屋租赁系统是在JSP MySQL开发环境的基础上开发的。JSP是一种服务器端脚本语言&#xff0c;易于学习&#xff0c;实用且面向用户。全球超过35&#xff05;的JSP驱动的互联网站点使用JSP。MySQL是一个数据库管理系统&#xff0c;因为它的体积小但…

往年互联网大厂腾讯华为百度等校招面试笔试题合集

踏入互联网巨头的第一步&#xff0c;从征服这份笔试真题集开始&#xff01;小编搜集了多家顶尖互联网企业的历年校招面试笔试题&#xff0c;从基础扎实的数据结构与算法&#xff0c;到考验创新能力的产品设计案例&#xff0c;再到紧跟时代脉搏的前沿科技问答&#xff0c;全方位…