文章目录
- 一.概要
- 二.GD32单片机GPIO内部结构图
- 三.GD32单片机GPIO输入输出信号流向
- 四.GD32单片机GPIO引脚的复用以及重映射
- 五.从零开始创建一个GD32F103C8T6单片机GPIO输出驱动LED灯例程
- 六.工程源代码下载
- 七.小结
一.概要
GPIO(general porpose intput output):单片机通用输入输出端口的简称。可以通过单片机烧录的程序代码控制单片机引脚输出高电平或者低电平,也可以读取引脚电平信号为高电平还是低电平。STM32单片机的GPIO引脚与外部设备连接起来,从而实现与外部模块通信,控制以及数据采集的功能。
输出电压:高电平:3.3V,低电平:0V
输入电压:高电平:3.3V,低电平:0V,部分管脚容忍5V输入
引脚图中的 GPIOA—GPIOD口 等均属于 GPIO 引脚。从引脚图可以看出,GPIO 占用了 GD32芯片大部分的引脚。GPIOA端口,它有 PA0-PA15。
二.GD32单片机GPIO内部结构图
如下图所示,GPIO口可以通过寄存器配置成各种模式:
模拟输入(Analog Input)则用于 ADC 电压采集,一般是采集0~3.3V的电压信号。
浮空输入(Input floating)就是读取引脚高低电平信号,完全由外部的输入决定,一般接按键的时候使用这个模式。
上拉下拉输入(Input Pull-Up,Input Pull-Down)就是读取引脚高低电平信号,但开启上拉时引脚默认电压为高电平,开启下拉时,引脚默认电压为低电平,这样就可以消除引脚不定状态的影响,上下拉电阻的值在40K欧姆左右。
推挽模式输出(Output Push-Pull),推挽模式时双 MOS 管以推挽方式工作,配置寄存器可控制 I/O 输出高电平或者低电平
开漏模式输出(Output Open-Drain)开漏模式输出时,只有 N-MOS 管工作,配置寄存器可控制 I/O 输出高阻态或低电平,没法输出高电平,要输出高电平得外部上拉。
复用功能推挽开漏模式(AF),一般I/O口需配置成通讯外设引脚的都时候都需要配置成这个模式。在这个模式下,输出和输出速度都可配置,可工作在开漏及推挽模式,输出信号由外设接口(比如USART,SPI等)决定。一般直接用外设接口的寄存器来获取引脚输入电平信号。
在程序中通过两个32位的控制寄存器(GPIOx_CTL0/ GPIOx_CTL1)和两个32位
的数据寄存器(GPIOx_ISTAT, GPIOx_OCTL)配置GPIO管脚的各种模式。
三.GD32单片机GPIO输入输出信号流向
如下图上半部分,就是一个GPIO推挽输出的信号流向:
输出数据寄存器输出一个高电平时,P-MOS 管导通,N-MOS 管截止,对外输出高电平(3.3V)。
输出数据寄存器输出一个低电平时,P-MOS 管截止,N-MOS 管导通,对外输出低电平(0V)。
如下图下半部分,就是一个GPIO输入的信号流向:
从单片机I/O引脚进来就连接到TTL施密特触发器就把电压信号转化为0、1的数字信号存储在输入数据寄存器。
施密特触发器,当输入电压高于正向阈值电压,输出为1,当输入电压低于负向阈值电压,输出为0,当输入在正负向阈值电压之间,输出不改变。
四.GD32单片机GPIO引脚的复用以及重映射
GPIO引脚的复用:
GD32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。
例如串口0的发送接收引脚是PA9,PA10,当我们把PA9,PA10不用作GPIO,而用做串口0的发送接收引脚的时候,叫端口复用。
GPIO软件重映射(Remap):
一些引脚复用功能可以重映射到其他两个不同的引脚上,用于优化引脚的输出和PCB的布线,一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口。
比如PB4引脚,默认是下载口的一个复位引脚,现在都用SWD下载,这个引脚就可以作为普通GPIO,根据表格需要重映射配置才可以成为普通GPIO。
查看数据手册中PB4需要重映射才能配置成普通GPIO:
查看应用手册,需要配置AFIO_ PCF0寄存器中的SWJ_CFG位实现重映射。
PB4配置成普通GPIO的配置代码如下(基于GD32标准库):
rcu_periph_clock_enable(RCU_AF);//使能复用功能时钟
gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE);//下载口NJTRST引脚重映射成普通I/O口rcu_periph_clock_enable(RCU_GPIOB);//GPIOB时钟打开
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);//PB4配置成输出
引脚重映射和引脚复用不是一个概念,引脚重映射是把引脚的复用功能,也就是把片上外设的功能映射到其他引脚上。
五.从零开始创建一个GD32F103C8T6单片机GPIO输出驱动LED灯例程
硬件准备:
STLINK接GD32F103C8T6开发板,STLINK接电脑USB口。
软件准备:
电脑上得安装好Keil5软件,并安装好STLINK驱动,GD32F103的Pack包GigaDevice.GD32F10x_DFP。注意Keil5下不同品牌型号单片机需安装对应的Pack包。
Keil5安装使用见CSDN文章:
Keil5安装使用说明
创建工程:
1.Keil5新建工程
2.选择必须添加的系统文件以及外设文件
3.添加main相关的文件到文件夹
4.添加main相关的文件到Keil5工程
6.添加代码
7.编译代码并下载程序到单片机
编译代码
配置下载器选择
下载
下载完后,按下板子复位按键,板子灯就能闪烁了
main代码如下:
#include "gd32f10x.h"
#include "gd32f10x_libopt.h"
#include "systick.h"
int main(void)
{
rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV1);//设置主频108M(#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000)),8M外部晶振 (#define HXTAL_VALUE ((uint32_t)8000000))
systick_config();//配置1ms SysTick
rcu_periph_clock_enable(RCU_AF);//AF时钟使能
gpio_pin_remap_config(GPIO_SWJ_NONJTRST_REMAP, ENABLE);//下载口NJTRST引脚当做普通I/O口
rcu_periph_clock_enable(RCU_GPIOB);//GPIOB时钟打开
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4);//PB4配置成输出
while(1)
{
delay_1ms(1000);//等待1000ms
gpio_bit_set(GPIOB, GPIO_PIN_4);//PB4输出高
delay_1ms(1000);
gpio_bit_reset(GPIOB, GPIO_PIN_4);//PB4输出低
}
}
一般我们工程创建好后,后续工程代码修改添加,就不会每次都重新创建了。我们整理了下我们的GPIO工程,把外设文件,启动文件,系统文件规整到文件夹,后续实验都在这个工程上修改。
六.工程源代码下载
GPIO工程代码及GD32 Keil5 Pack安装文件下载地址
通过百度网盘分享的文件:1.GPIO输出实验.zip,2.GigaDevice.GD32F10…等2个文件
链接:https://pan.baidu.com/s/1ArouHh0wR2-ArVKK4gZJ6w
提取码:b6m1
如果链接失效,可以联系博主给最新链接
CSDN代码下载
七.小结
GPIO是GD32单片机开发中的最基本操作,学会了GPIO,可以驱动继电器,LED灯等基本控制。了解了重映射的配置,同时方便后续画板子布局。