GD32F103学习笔记(4)——GPIO接口使用
一、简介
最多可支持112个通用I/O引脚(GPIO),分别为PA0 ~ PA15,PB0 ~ PB15,PC0 ~ PC15,PD0 ~ PD15,PE0 ~ PE15,PF0 ~ PF15和PG0 ~ PG15,各片上设备用其来实现逻辑输入/输出功能。每个GPIO端口有相关的控制和配置寄存器以满足特定应用的需求。外设GPIO引脚上的外部中断在中断/事件控制器(EXTI)中有相关的控制和配置寄存器。GPIO端口和其他的备用功能(AFs)共用引脚,在特定的封装下获得最大的灵活性。GPIO引脚通过配置相关的寄存器可以用作备用功能引脚,备用功能输入/输出都可。每个GPIO引脚可以由软件配置为输出(推挽或开漏)、输入、外设的备用功能或者模拟模式。每个GPIO引脚都可以配置为上拉、下拉或无上拉/下拉。 除模拟模式外,所有的GPIO引脚都具备大电流驱动能力。
二、API说明
2.1 外设寄存器说明
GPIO寄存器列表如下表所示:
寄存器名称 | 寄存器描述 |
---|---|
GPIOx_CTL0 | 端口控制寄存器0 |
GPIOx_CTL1 | 端口控制寄存器1 |
GPIOx_ISTAT | 端口输入状态寄存器 |
GPIOx_OCTL | 端口输出状态寄存器 |
GPIOx_BOP | 端口位操作寄存器 |
GPIOx_BC | 位清除寄存器 |
GPIOx_LOCK | 端口配置锁定寄存器 |
AFIO_EC | 事件控制寄存器 |
AFIO_PCF0 | AFIO端口配置寄存器0 |
AFIO_EXTISS0 | EXTI源选择寄存器0 |
AFIO_EXTISS1 | EXTI源选择寄存器1 |
AFIO_EXTISS2 | EXTI源选择寄存器2 |
AFIO_EXTISS3 | EXTI源选择寄存器3 |
AFIO_PCF1 | AFIO端口配置寄存器1 |
2.2 外设库函数说明
以下 GPIO 接口位于 GD32F10x_Firmware_Library_V2.2.2\Firmware\GD32F10x_standard_peripheral\Include\gd32f10x_gpio.h。
2.2.1 gpio_init
功能 | GPIO参数初始化。注意:首先要保证使用的GPIO的时钟开启 |
---|---|
函数定义 | void gpio_init(uint32_t gpio_periph,uint32_t mode,uint32_t speed,uint32_t pin) |
参数 |
gpio_periph:GPIO端口x(x = A,B,C,D,E,F,G) mode:GPIO引脚模式 speed:GPIO输出最大速度最大 pin:GPIO引脚x(x=0…15) |
返回 | 无 |
mode: IO模式,在GD32标准固件库中,共有四种输入模式,四种输出模式,详细列表如下:
值 | 含义 | 官方解释 |
---|---|---|
GPIO_MODE_AIN | 模拟输入 | analog input mode |
GPIO_MODE_IN_FLOATING | 浮空输入 | floating input mode |
GPIO_MODE_IPD | 下拉输入 | pull-down input mode |
GPIO_MODE_IPU | 上拉输入 | pull-up input mode |
GPIO_MODE_OUT_OD | 开漏输出 | GPIO output with open-drain |
GPIO_MODE_OUT_PP | 推挽输出 | GPIO output with push-pull |
GPIO_MODE_OUT_OD | 复用开漏输出 | AFIO output with open-drain |
GPIO_MODE_OUT_PP | 复用推挽输出 | AFIO output with push-pull |
speed: IO输出速度最大值,详细列表如下:
值 | 含义 | 官方解释 |
---|---|---|
GPIO_OSPEED_10MHZ | 输出速度最大为10MHz | output max speed 10MHz |
GPIO_OSPEED_2MHZ | 输出速度最大为2MHz | output max speed 2MHz |
GPIO_OSPEED_50MHZ | 输出速度最大为50MHz | output max speed 50MHz |
2.2.2 gpio_bit_set
功能 | 将一个GPIO引脚拉高 |
---|---|
函数定义 | void gpio_bit_set(uint32_t gpio_periph, uint32_t pin) |
参数 |
gpio_periph:GPIO端口x(x = A,B,C,D,E,F,G) pin:GPIO引脚x(x=0…15) |
返回 | 无 |
2.2.3 gpio_bit_reset
功能 | 将一个GPIO引脚拉低 |
---|---|
函数定义 | void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin) |
参数 |
gpio_periph:GPIO端口x(x = A,B,C,D,E,F,G) pin:GPIO引脚x(x=0…15) |
返回 | 无 |
2.2.4 gpio_bit_write
功能 | 将特定值写入引脚 |
---|---|
函数定义 | void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value) |
参数 |
gpio_periph:GPIO端口x(x = A,B,C,D,E,F,G) pin:GPIO引脚x(x=0…15) bit_value:SET设置或RESET清除 |
返回 | 无 |
2.2.5 gpio_input_bit_get
功能 | 获取引脚的输入值 |
---|---|
函数定义 | FlagStatus gpio_input_bit_get(uint32_t gpio_periph,uint32_t pin) |
参数 |
gpio_periph:GPIO端口x(x = A,B,C,D,E,F,G) pin:GPIO引脚x(x=0…15) |
返回 | SET高电平或RESET低电平 |
2.2.6 gpio_pin_remap_config
功能 | 配置GPIO引脚重映射 |
---|---|
函数定义 | void gpio_pin_remap_config(uint32_t remap, ControlStatus newvalue) |
参数 |
remap:选择重映射 newvalue:是否使能,ENABLE使能或DISABLE除能 |
返回 | 无 |
remap: 重映射,详细列表如下:
值 | 含义 |
---|---|
GPIO_SPI0_REMAP | SPI0重映射 |
GPIO_I2C0_REMAP | I2C0重映射 |
GPIO_USART0_REMAP | USART0重映射 |
GPIO_USART1_REMAP | USART1重映射 |
GPIO_USART2_PARTIAL_REMAP | USART2部分重映射 |
GPIO_USART2_FULL_REMAP | USART2全部重映射 |
GPIO_TIMER0_PARTIAL_REMAP | TIMER0部分重映射 |
GPIO_TIMER0_FULL_REMAP | TIMER0全部重映射 |
GPIO_TIMER1_PARTIAL_REMAP0 | TIMER1部分重映射 |
GPIO_TIMER1_PARTIAL_REMAP1 | TIMER1部分重映射 |
GPIO_TIMER1_FULL_REMAP | TIMER1全部重映射 |
GPIO_TIMER2_PARTIAL_REMAP | TIMER2部分重映射 |
GPIO_TIMER2_FULL_REMAP | TIMER2全部重映射 |
GPIO_TIMER3_REMAP | TIMER3重映射 |
GPIO_PD01_REMAP | PD01重映射 |
GPIO_CAN_PARTIAL_REMAP | CAN部分重映射(仅适用于GD32F10X_MD,GD32F10X_HD和GD32F10X_XD) |
GPIO_CAN_FULL_REMAP | CAN全部重映射(仅适用于GD32F10X_MD,GD32F10X_HD和GD32F10X_XD) |
GPIO_SPI2_REMAP | SPI2重映射(仅适用于GD32F10X_CL) |
GPIO_TIMER4CH3_IREMAP | TIMER4 channel3内部重映射(仅适用于GD32F10X_CL和GD32F10X_HD) |
GPIO_ADC0_ETRGINS_REMAP | ADC0外部触发注入转换重映射(仅适用于GD32F10X_MD,GD32F10X_HD和GD32F10X_XD) |
GPIO_ADC0_ETRGREG_REMAP | ADC0外部触发规则转换重映射(仅适用于GD32F10X_MD,GD32F10X_HD和GD32F10X_XD) |
GPIO_ADC1_ETRGINS_REMAP | ADC1外部触发注入转换重映射(仅适用于GD32F10X_MD,GD32F10X_HD和GD32F10X_XD) |
GPIO_ADC1_ETRGREG_REMAP | ADC1外部触发规则转换重映射(仅适用于GD32F10X_MD,GD32F10X_HD和GD32F10X_XD) |
GPIO_SWJ_NONJTRST_REMAP | 全部的SWJ(JTAG-DP + SW-DP),但是不包括NJTRST |
GPIO_SWJ_SWDPENABLE_REMAP | JTAG-DP除能,SW-DP使能 |
GPIO_SWJ_DISABLE_REMAP | JTAG-DP除能,SW-DP除能 |
GPIO_CAN0_PARTIAL_REMAP | CAN0部分重映射(仅适用于GD32F10X_CL) |
GPIO_CAN0_FULL_REMAP | CAN0全部重映射(仅适用于GD32F10X_CL) |
GPIO_ENET_REMAP | ENET重映射(仅适用于GD32F10X_CL) |
GPIO_CAN1_REMAP | CAN0重映射(仅适用于GD32F10X_CL) |
GPIO_TIMER1ITI1_REMAP | TIMER1内部触发1重映射(仅适用于GD32F10X_CL) |
GPIO_PTP_PPS_REMAP | 以太网PTP PPS重映射(仅适用于GD32F10X_CL) |
GPIO_TIMER8_REMAP | TIMER8重映射 |
GPIO_TIMER9_REMAP | TIMER9重映射 |
GPIO_TIMER10_REMAP | TIMER10重映射 |
GPIO_TIMER12_REMAP | TIMER12重映射 |
GPIO_TIMER13_REMAP | TIMER13重映射 |
GPIO_EXMC_NADV_REMAP | EXMC_NADV 连接/断开 |
三、GPIO输出
3.1 引脚确定
我使用的是 光子MINI-GD32F103RCT6
开发板
有个 IO 口为 PB4 的 LED 灯
在复位期间或复位之后,备用功能并未激活,所有GPIO端口都被配置成输入浮空模式,这种输入模式禁用上拉(PU)/下拉(PD)电阻。但是复位后,串行线调试端口(JTAG/Serial-Wired Debug pins)为输入PU/PD模式:
PA15:JTDI为上拉模式;
PA14:JTCK / SWCLK为下拉模式;
PA13:JTMS / SWDIO为上拉模式;
PB4:NJTRST为上拉模式;
PB3:JTDO为浮空模式。
所以PB4要当GPIO需要重映射
//管脚复用时钟使能
rcu_periph_clock_enable(RCU_AF);
//PB4管脚默认是NJTRST,要当GPIO,需要重映射
gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE)
3.2 编程要点
- 使能 GPIO 端口时钟
- 初始化 GPIO 目标引脚为推挽输出
- 控制 GPIO 引脚输出高、低电平
3.3 外设寄存器方法
//GPIOB时钟使能
rcu_periph_clock_enable(RCU_GPIOB);
//配置GPIO端口
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);//引脚输出低电平
GPIO_BC(GPIOB) = GPIO_PIN_4;
//引脚输出高电平
GPIO_BOP(GPIOB) = GPIO_PIN_4;
3.4 外设库函数方法
//GPIOB时钟使能
rcu_periph_clock_enable(RCU_GPIOB);
//PB4配置成输出
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);//引脚输出低电平
gpio_bit_reset(GPIOB, GPIO_PIN_4);
//引脚输出高电平
gpio_bit_set(GPIOB, GPIO_PIN_4);
//引脚输出低电平
gpio_bit_write(GPIOB, GPIO_PIN_4, RESET);
//引脚输出高电平
gpio_bit_write(GPIOB, GPIO_PIN_4, SET);
四、GPIO输入
4.1 引脚确定
我使用的是 光子MINI-GD32F103RCT6
开发板
有个 IO 口为 PA1 的按键
4.2 编程要点
- 使能 GPIO 端口时钟
- 初始化 GPIO 目标引脚为输入模式(由于硬件电路没有外部上拉电阻,这里使用内部上拉输入)
- 检测按键的状态
4.3 外设库函数方法
//GPIOA时钟使能
rcu_periph_clock_enable(RCU_GPIOA);
//PA1配置成上拉输入
gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_1);//读取引脚电平
gpio_input_bit_get(GPIOA, GPIO_PIN_1);
五、轮询读取按下按键,LED灯闪烁
5.1 board_gpio.c
/********************************************************************** INCLUDES*/
#include "gd32f10x.h"#include "board_gpio.h"/********************************************************************** PUBLIC FUNCTIONS*/
/*=========================================================================*/
/* 输入 */
/*=========================================================================*/
/**@brief 按键驱动初始化@param 无@return 无
*/
void Key_GPIO_Init(void)
{// GPIO时钟使能rcu_periph_clock_enable(RCU_GPIOA);// 配置为内部上拉输入模式gpio_init(KEY1_GPIO_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, KEY1_GPIO_PIN);
}/**@brief 获取按键状态@param keyNum -[in] 按键编号@return 1 - 按下;0 - 松开
*/
uint8_t Key_GPIO_Read(uint8_t keyNum)
{uint8_t value = 0;if(KEY1 == keyNum){value = gpio_input_bit_get(KEY1_GPIO_PORT, KEY1_GPIO_PIN);}
// else if(KEY2 == keyNum)
// {// value = gpio_input_bit_get(KEY2_GPIO_PORT, KEY2_GPIO_PIN);
// }return value;
}/*=========================================================================*/
/* 输出 */
/*=========================================================================*/
/**@brief LED灯驱动初始化@param 无@return 无
*/
void LED_GPIO_Init(void)
{// PB4管脚默认是NJTRST,要当GPIO,需要重映射rcu_periph_clock_enable(RCU_AF); // 管脚复用时钟使能gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE);// GPIO时钟使能rcu_periph_clock_enable(RCU_GPIOB);// 配置为推挽输出模式gpio_init(LED1_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED1_GPIO_PIN);LED_GPIO_Write(LED1, LED_OFF);
}/**@brief 配置LED灯工作模式@param ledNum -[in] LED灯编号@param ledMode -[in] 工作模式@return 无
*/
void LED_GPIO_Write(uint8_t ledNum, uint8_t ledMode)
{if(LED1 == ledNum){gpio_bit_write(LED1_GPIO_PORT, LED1_GPIO_PIN, ledMode);}
// else if(LED2 == ledNum)
// {// gpio_bit_write(LED2_GPIO_PORT, LED2_GPIO_PIN, ledMode);
// }
}/**@brief 获取LED灯工作模式@param ledNum -[in] LED灯编号@return 工作模式
*/
uint8_t LED_GPIO_Read(uint8_t ledNum)
{uint8_t ledMode = 0;if(LED1 == ledNum){ledMode = gpio_output_bit_get(LED1_GPIO_PORT, LED1_GPIO_PIN);}
// else if(LED2 == ledNum)
// {// ledMode = gpio_output_bit_get(LED2_GPIO_PORT, LED2_GPIO_PIN, &ledMode);
// }return ledMode;
}
5.2 board_gpio.h
#ifndef _BOARD_GPIO_H_
#define _BOARD_GPIO_H_/********************************************************************** INCLUDES*/
#include "gd32f10x_gpio.h"/********************************************************************** DEFINITIONS*/
/*=========================================================================*/
/* 输入 */
/*=========================================================================*/
#define KEY1_GPIO_PORT GPIOA
#define KEY1_GPIO_PIN GPIO_PIN_1
#define KEY_OFF 0x01
#define KEY_ON 0x00
#define KEY1 1
#define KEY2 2/*=========================================================================*/
/* 输出 */
/*=========================================================================*/
#define LED1_GPIO_PORT GPIOB
#define LED1_GPIO_PIN GPIO_PIN_4
#define LED_OFF 0x01
#define LED_ON 0x00
#define LED1 1
#define LED2 2/********************************************************************** API FUNCTIONS*/
void Key_GPIO_Init(void);
uint8_t Key_GPIO_Read(uint8_t keyNum);void LED_GPIO_Init(void);
void LED_GPIO_Write(uint8_t ledNum, uint8_t ledMode);
uint8_t LED_GPIO_Read(uint8_t ledNum);#endif /* _BOARD_GPIO_H_ */
5.3 main.c
#include "gd32f10x.h"
#include "systick.h"#include "board_gpio.h"int main(void)
{systick_config();//系统主频108MHZ,采用外部晶振,由两个宏决定(__SYSTEM_CLOCK_108M_PLL_HXTAL与HXTAL_VALUE)Key_GPIO_Init();// 按键模块初始化LED_GPIO_Init();// LED灯模块初始化while(1){if(KEY_ON == Key_GPIO_Read(KEY1)){delay_1ms(100);//等待100msLED_GPIO_Write(LED1, LED_ON);delay_1ms(100);//等待100msLED_GPIO_Write(LED1, LED_OFF);}}
}
5.4 工程代码
百度网盘:https://pan.baidu.com/s/1_tjTeP_xVNC-KdVDLbN-Ww?pwd=0h8m 提取码:0h8m
• 由 Leung 写于 2022 年 4 月 12 日
• 参考:GD32F103基础教程—GPIO输出实验(五)
GD32实战3__点亮LED灯
GD32F103学习笔记(4)——GPIO接口使用相关推荐
- GD32F103学习笔记(8)——ADC接口使用
一.简介 ADC(Analog-to-Digital Converter),即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理. GD32F ...
- PhalAPI学习笔记 ——— 第二章接口服务请求
PhalAPI学习笔记 --- 第二章接口服务请求 前言 接口服务请求 接口服务请求案例 自定义接口路由 开启匹配路由 配置路由规则 nginx apache 服务请求 结束语 前言 公司业务需要转学 ...
- 【STM32F407学习笔记】GPIO(一)
[STM32F407学习笔记]GPIO(一) 1. GPIO基础知识 1.1 GPIO工作方式 1.2 GPIO相关配置寄存器 1.2.1 端口模式寄存器:GPIOx_MODER 1.2.2 输出类型 ...
- 启明云端分享|ESP32学习笔记参考GPIO口操作
提示:作为Espressif(乐鑫科技)大中华区合作伙伴及sigmastar(厦门星宸)VAD合作伙伴,我们不仅用心整理了你在开发过程中可能会遇到的问题以及快速上手的简明教程供开发小伙伴参考.同时也用 ...
- 学习笔记二:接口与继承(内部类)
学习笔记参考来源 java学习路线-推荐链接:java-接口与继承-内部类 学习笔记难免出错 望多指正!!! 什么是内部类呢? 什么是内部类?定义很简单 内部类就是定义在另一个类中的类 内部类的分类 ...
- TMS320F28377S 学习笔记1 GPIO及学习资料
参考资料 使用的DSP型号为28377s,不过最近似乎更新了 TMS320F28378S 使用的硬件开发板,居然已经停产了.C2000 Delfino MCUs F28377S LaunchPad D ...
- 嵌入式学习笔记之GPIO详解
一. 什么是GPIO GPIO,英文全称为General-Purpose IO ports,也就是通用IO口.在嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要 ...
- 31 天重构学习笔记9. 提取接口
摘要:由于最近在做重构的项目,所以对重构又重新进行了一遍学习和整理,对31天重构最早接触是在2009年10月份,由于当时没有订阅Sean Chambers的blog,所以是在国外的社区上闲逛的时候链接 ...
- LTE学习笔记三:接口协议
上一笔记说明了LTE网络的网元组成,网元之间的联系是通过标准化的接口.接下来学习LTE终端和网络的空中接口Uu.基站之间的X2接口.基站与核心网之间的S1接口,以及LTE接口协议栈和以往无线制式相比的 ...
- 《如何了解软件的设计》学习笔记0——模型-接口-实现
如何理解软件的设计?一套流程:模型-接口-实现. 模型 找类与类之间的关系,绘制整体图,这个步骤就是找模型.有个整体地图. 接口 类中的各方法就是接口. 接口反映模型. 实现 类中方法的函数体就是实现 ...
最新文章
- 忘掉什么鬼并发,先听完这个故事!
- [转]inux Kernel部分选项意义
- KMP算法之 好理解的模板
- shell脚本编译规范(编写第一个脚本,脚本变量的作用,类型 ,了解read命令,let命令,环境变量和预定义变量)
- SAP Spartacus 项目里的 ng-package.json
- 第7章 输入/输出系统
- 代理proxy网络代理自动发现wpad代理自动配置pac三个概念解析
- 抛体运动的小框架的源代码(rar)
- 12.6 static类成员
- mac系统和鸿蒙,鸿蒙发力,或将超越苹果系统
- vscode统计代码行数
- php字符串的截取方式
- centos8解压war包
- 谷歌:AI系统需要“自我怀疑”能力,方能作出更好的决定!
- 2021各厂免费云服务器申请攻略(阿里云/腾讯云/华为云)
- FineBI 的关联视图及多表关联 自助数据集
- 蝇量级的JSON模型转换库(OC,Swift通用)
- MySQL数据库实现双向自动同步
- 大众点评美食商家电话爬虫
- 数据库设计(理论实例)