简介:
最多可支持 112 个通用 I/O 引脚(GPIO),分别为 PA0 ~ PA15,PB0 ~ PB15,PC0 ~ PC15,PD0 ~ PD15,PE0 ~ PE15,PF0 ~ PF15 和 PG0 ~ PG15,各片上设备用其来实现逻辑输入/输出功能。每个 GPIO 端口有相关的控制和配置寄存器以满足特定应用的需求。外设 GPIO 引 脚上的外部中断在中断/事件控制器(EXIT)中有相关的控制和配置寄存器。 GPIO 端口和其他的备用功能(AFs)共用引脚,在特定的封装下获得最大的灵活性。GPIO 引脚 通过配置相关的寄存器可以用作备用功能输入/输出。每个 GPIO 引脚可以由软件配置为输出(推挽或开漏)、输入、外设备用功能或者模拟模式。每 个 GPIO 引脚都可以配置为上拉、下拉或浮空。除模拟模式外,所有的 GPIO 引脚都具备大电 流驱动能力。
原理图:

案例演示使用寄存器的方式点亮PA8引脚对应的led灯
GPIO寄存器的基地址如下所示:
- GPIOA 基地址:0x4001 0800
- GPIOB 基地址:0x4001 0C00
- GPIOC 基地址:0x4001 1000
- GPIOD 基地址:0x4001 1400
- GPIOE 基地址:0x4001 1800
- GPIOF 基地址:0x4001 1C00
- GPIOG 基地址:0x4001 2000
- AFIO 基地址:0x4001 0000
查看数据手册可知端口控制寄存器:偏移地址为0x40,PA8端口位于端口控制寄存器1的位置

模式为与配置位如下所示:


寄存器配置参考:
配置位:

模式位:

端口输出控制寄存器:


或运算:有真为真,全假为假
片上外设工作需要配置时钟源:通过寄存器打开时钟源


程序:
cpp
#include <stdint.h>
// 基础地址,将16进制数转换为地址:基地址 + 偏移量
#define GPIOA_CTL1 (*(uint32_t *)(0x40010800 + 0x04))
// 配置
#define GPIOA_OCTL (*(uint32_t *)(0x40010800 + 0x0C))
// 外设总线控制,时钟使能控制寄存器
#define RCU_APB2EN (*(uint32_t *)(0x40021000 + 0x18))
static void Delay(uint32_t count)
{
while (count--);
}
int main(void)
{
/*使能GPIO的时钟*/
RCU_APB2EN |= 1 << 2;
/*配置为推挽输出模式*/
GPIOA_CTL1 = 0x44444442;
/*配置为输出高电平*/
while (1)
{
GPIOA_OCTL |= 1 << 8; //00000000 00000000 00000001 00000000
Delay(1000000);
GPIOA_OCTL &= ~(1 << 8); //11111111 11111111 11111110 11111111
Delay(1000000);
}
}