概述
GPIO即通用性I/O,AFIO即复用功能I/O。芯片最多支持97个GPIO,共分为7组(GPIOA/GPIOB/GPIOC/GPIOD/GPIOE/GPIOF/GPIOG),每组 16个端口(F 组共 10 个,G 组共 7 个)。GPIO 端口和其他的复用外设共用引脚,用户可以根据需求灵活配置。每个 GPIO 引脚都可以独立配置成输出、输入或复用的外设功能端口。除了模拟功能引脚外,其他的 GPIO引脚都有大电流通过能力。
GPIO的工作模式
四种输入模式
- GPIO_Mode_AIN:模拟输入
- GPIO_Mode_IN_FLOATING:浮空输入
- GPIO_Mode_IPD:下拉输入
- GPIO_Mode_IPU:上拉输入
四种输出模式
- GPIO_Mode_Out_OD:开漏输出
- GPIO_Mode_Out_PP:推挽输出
- GPIO_Mode_AF_OD:开漏复用功能
- GPIO_Mode_AF_PP:推挽复用功能
输出速度
- GPIO_INPUT:输入
- GPIO_Speed_2MHz:低速
- GPIO_Speed_10MHz:中速
- GPIO_Speed_50MHz:高速
IO端口的基本结构
我们所用到的每一个GPIO其内部结构都是这样,分别对应着GPIO的八种模式 这里我们简单的介绍下:
- 保护二极管: IO引脚上那个二极管用于防止引脚外部过低,造成引脚损坏,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁 。
- 上拉、下拉电阻:控制引脚默认状态的电压,开启上拉的时候引脚默认电压为高电平,开启下拉的时候引脚默认电压为低电平
- 施密特触发器:基本原理是当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;IO口信号经过触发器后,模拟信号转化为0和1的数字信号 也就是高低电平。
- P-MOS管和N-MOS管:信号由P-MOS管和N-MOS管,依据两个MOS管的工作方式,使得GPIO具有“推挽输出”和“开漏输出”的模式 ,P-MOS管高电平导通,低电平关闭,下方的N-MOS低电平导通,高电平关闭
输入模式
当 I/O 端口配置为输入模式时:
- 出现在 I/O 脚上的数据在每个 APB2 时钟被采样到输入数据寄存器
- 对输入数据寄存器的访问可以得到 I/O 状态
- 输出缓冲器被禁止
- 施密特触发输入被激活
- 根据输入配置(上拉,下拉或浮空)的不同,弱上拉和下拉电阻被连接
输出模式
当 I/O 端口配置为输出时:
- 施密特触发输入被激活,出现在 I/O 脚上的数据在每个 APB2 时钟被采样到输入数据寄存器,对输入数据寄存器的读访问可得到 I/O 状态
- 弱上拉和下拉电阻被禁止
- 输出缓冲器被激活
- 开漏模式: 输出寄存器上的’0’激活 N-MOS,引脚输出低电平
输出寄存器上的’1’使端口置于高阻状态(P-MOS 从不被激活) - 推挽模式: 输出寄存器上的’0’激活 N-MOS,引脚输出低电平
输出寄存器上的’1’激活 P-MOS,引脚输出高电平
- 开漏模式: 输出寄存器上的’0’激活 N-MOS,引脚输出低电平
- 对输出数据寄存器的读访问得到最后写入的值
复用功能模式
当 I/O 端口配置为复用功能时:
- 施密特触发输入被激活,在每个 APB2 时钟周期,对输入数据寄存器的访问可以得到 I/O 状态,对输入数据寄存器的读访问可得到 I/O 状态
- 对输出数据寄存器的读访问得到最后一次写的值
- 弱上拉和下拉电阻被禁止
- 在开漏或推挽式配置中,输出缓冲器被打开
- 内置外设的信号驱动输出缓冲器
模拟输入
当IO端口被配置成模拟输入时:
- 弱上拉和下拉被禁止
- 读取输入数据寄存器的值为“0”
- 输出缓冲器被禁止
- 施密特触发器被禁止,输出值强制为“0”
复位后的状态
复位期间和刚复位后,复用功能未开启, I/O端口被配置成模拟功能模式( PCFGy[1:0]=00b ,PMODEy[1:0]=00b)。但有以下几个例外的信号:
- BOOT0、NRST、OSC_IN、OSC_OUT 默认无 GPIO 功能:
- BOOT0 引脚默认输入下拉
- NRST 上拉输入输出
- 复位后,调试系统相关的引脚默认状态为启动 SWD-JTAG,JTAG 引脚被置于输入上拉或下拉模式:
- PA15:JTDI 置于输入上拉模式
- PA14:JTCK 置于输入下拉模式
- PA13:JTMS 置于输入上拉模式
- PB4:NJTRST 置于输入上拉模式
- PB3:JTD0 置于推挽输出无上下拉
- PD0 和 PD1 在 80 及以上引脚封装默认为模拟模式
- PD0 和 PD1 在 80 以下引脚封装复用到 OSC_IN/OUT
- PC13~15 为备电域下的三个 IO,备份域初次上电默认为模拟模式;
- PB2/BOOT1:
- PB2/BOOT1 默认处于下拉输入状态
- BOOT0 默认输入下拉,参照下表,若 BOOT 的引脚未连接,则默认选择 Flash 主存储区。
软件重新映射 I/O 复用功能
为拓展不同器件封装下的复用外设功能灵活性,可以把一些外设复用功能重新映射到其他引脚上。可以通
过软件配置相应的寄存器(AFIO_RMP_CFG, AFIO_RMP_CFGx)来完成。这时,复用功能就和他原来的引
脚断开,重新映射到新的引脚上了。
JTAG/SWD 复用功能重映射
芯片上电默认使能 SWD-JTAG 调试接口,调试接口被映射到 GPIO 端口上,如下表所示。
如调试期间需要使用其 GPIO 功能,可通过设置 AFIO_RMP_CFG. SW_JTAG_CFG[2:0]位,可以改变上述
重映像配置。参见下表。
实现代码如下
//JTAG模式设置,用于设置JTAG的模式
//mode: jtag,swd模式设置;00, 全使能;01, 使能SWD;10, 全关闭;
//JTAG,SWD但没有NJTRST选项没有写入
void JTAG_Set(UINT8 mode)
{
UINT32 temp;
temp = mode;
temp <<= 25;
RCC->APB2PCLKEN |= 1<<0; //开启辅助时钟
AFIO->RMP_CFG &= 0XF8FFFFFF; //清除MAPR的[26:24]
AFIO->RMP_CFG |= temp; //设置jtag模式
}
外设的 IO 配置
GPIO 锁定机制
锁定机制用于冻结 IO 配置以防止被意外更改。当在一个端口位上执行了锁定(LOCK)程序,在下一次复
位之前,不能再更改端口的配置,参考端口配置锁定寄存器 GPIOx_PLOCK_CFG。
GPIO的初始化
void GPIO_Init(void)
{
GPIO_InitType GPIO_InitStructure; //定义初始化结构体
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA, ENABLE);//使能引脚时钟
GPIO_InitStructure.Pin = Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitPeripheral(GPIOx, &GPIO_InitStructure);
}