一、简介
GPIO的英文全称General-Purpose Input/Output ports,中文意思是通用输入/输出端口
二、GPIO输入输出配置模式介绍
每个通用I/0端口都可以通过两个32为的控制寄存器(GPIOxCTL0 / GPIOx_CTL1)和两个32为的数据寄存器(GPIOx_ISTAT,GPIOx_OCTL)配置8中模式如下:


2.1、由于GD32的图过于简化,很多细节没办法表示出来,具体需要参考STM32 GPIO输入输出模式原理(八种工作方式附电路图详解)_gpio四种输入输出模式-优快云博客)

三、寄存器介绍
3.1、GPIO寄存器基地址描述
| 名称 | 基地址 | 名称 | 基地址 |
| GPIOA | 0x4001 0800 | GPIOE | 0x4001 1800 |
| GPIOB | 0x4001 0C00 | GPIOF | 0x4001 1C00 |
| GPIOC | 0x4001 1000 | GPIOG | 0x4001 2000 |
| GPIOD | 0x4001 1400 | AFIO | 0x4001 0000 |
3.2、端口控制寄存器0(GPIOx_CTL0,x=A~G)

| 位/位域 | 名称 | 描述 |
| [31:30] [27:26] [23:22] …… [3:2] | CTL0~7[1:0] | Portx配置位 该位由软件置位和清除。 输入模式(MD[1:0]=00) 00:模拟输入 01:浮空输入 10:上拉输入/下拉输入 11:保留 输出模式(MD[1:0])>00 00:GPIO推挽输出 01:GPIO开漏输出 10:AFIO推挽输出 11:AFIO开漏输出 |
| [29:28] [25:24] [21:20] …… [1:0] | MD0~7[1:0] | Prot模式位 该位由软件置位和清除 00:输入模式(复位状态) 01:输出模式(10MHz) 10:输出模式(20MHz) 11:输出模式(50MHz) |

这个描述参考端口控制寄存器0
3.3、端口输入状态寄存器(GPIOx_ISTAT,x=A~G)

| 位/位域 | 名称 | 描述 |
| [31:16] | 保留 | 必须保持复位值 |
| [15:0] | ISTATy | 端口输入状态位(y=0~15) 这些位由软件置位和清零 0:引脚输入信号为低电平 1:引脚输入信号为高电平 |
3.4、端口输入控制寄存器(GPIOx_OCTL,x=A~G)

3.5、端口位操作寄存器(GPIOx_BOP,x=A~G)

3.6、位清除寄存器(GPIOx_BC,x=A~G)

3.7、端口配置锁定寄存器(GPIOx_LOCK,x=A,B)

3.8、APB2使能寄存器(RCU_APB2EN)

| 位/位域 | 名称 | 描述 |
| [31:22] | 保留 | 必须保持复位值 |
| [21] | TIMer10EN | TIMER10时钟使能 由软件置位或复位 0:关闭TIMER10时钟 1:开启TIMER10时钟 |
| [20] | TIMER9EN | TIMER9时钟使能 由软件置位或复位 0:关闭TIMER9时钟 1:开启TIMER9时钟 |
| [19] | TIMER8EN | TIMER8时钟使能 由软件置位或复位 0:关闭TIMER8时钟 1:开启TIMER8时钟 |
| [18:16] | 保留 | 必须保持复位值 |
| [15] | ADC2EN | ADC2时钟使能 由软件置位或复位 0:关闭ADC2时钟 1:开启ADC2时钟 |
| [14] | USART0EN | USART0时钟使能 由软件置位或复位 0:关闭USART0时钟 1:开启USART1时钟 |
| [13] | TIMER7EN | TIMER7时钟使能 由软件置位或复位 0:关闭TIMER7时钟 1:开启TIMER7时钟 |
| [12] | SPI0EN | SPI0时钟使能 由软件置位或复位 0:关闭SPI0时钟 1:开启SPI0时钟 |
| [11] | TIMER0EN | TIMER0时钟使能 由软件置位或复位 0:关闭TIMER0时钟 1:开启TIMER0时钟 |
| [10] | ADC1EN | ADC1时钟使能 由软件置位或复位 0:关闭ADC1时钟 1:开启ADC1时钟 |
| [9] | ADC0EN | ADC0时钟使能 由软件置位或复位 0:关闭ADC0时钟 1:开启ADC0时钟 |
| [8] | PGEN | GPIO端口G时钟使能 由软件置位或复位 0:关闭GPIO端口G时钟 1:开启GPIO端口G时钟 |
| [7] | PFEN | GPIO端口F时钟使能 由软件置位或复位 0:关闭GPIO端口F时钟 1:开启GPIO端口F时钟 |
| [6] | PEEN | GPIO端口E时钟使能 由软件置位或复位 0:关闭GPIO端口E时钟 1:开启GPIO端口E时钟 |
| [5] | PDEN | GPIO端口D时钟使能 由软件置位或复位 0:关闭GPIO端口D时钟 1:开启GPIO端口D时钟 |
| [4] | PCEN | GPIO端口C时钟使能 由软件置位或复位 0:关闭GPIO端口C时钟 1:开启GPIO端口C时钟 |
| [3] | PBEN | GPIO端口B时钟使能 由软件置位或复位 0:关闭GPIO端口B时钟 1:开启GPIO端口B时钟 |
| [2] | PAEN | GPIO端口A时钟使能 由软件置位或复位 0:关闭GPIO端口A时钟 1:开启GPIO端口A时钟 |
| [1] | 保留 | 必须保持复位值 |
| [0] | AFEN | 复位功能IO时钟使能 由软件置位或复位 0:关闭复用功能IO时钟 1:开启复用功能IO时钟 |
四、程序
4.1、原理图

4.2、函数介绍
4.2.1、rcu_periph_clock_enable(功能:使能外设时钟)

4.2.2、gpio_init(功能:GPIO参数初始化)


4.2.3、gpio_bit_reset(功能:复位引脚值)

4.2.4、gpio_bit_set(功能:置位引脚值)

4.3、程序介绍

图中1:
是初始化IO函数rcu_periph_clock_enable是使能GPIOA时钟,这里面描述可以查看“RCU_APB2EN”寄存器
gpio_init()就是配置GPIOx_CTL0或GPIOx_CTL1,配置对应的IO,具体参考则两个寄存器对应位
图中2:
Gpio_bit_reset给对应的位写入1,具体描述参考GPIOx_BC寄存器
Gpio_bit_set给对应的位写1,具体描述参考GPIOx_BOP寄存器
其实这两个函数就是控制IO输出低电平或者高电平
从上述程序中可以看出这个程序就是控制LED灯闪烁,
5845

被折叠的 条评论
为什么被折叠?



