寄存器 | 功能 | 位宽 | 关键位域 |
---|---|---|---|
GPIOx_CRL/CRH | 配置引脚模式(输入/输出/复用/模拟)和输出参数 | 32位 | 每4位控制1个引脚:CNF[1:0] (模式) + MODE[1:0] (速度) |
GPIOx_IDR | 读取引脚输入电平 | 32位 | 低16位有效(1位对应1个引脚),只读 |
GPIOx_ODR | 设置引脚输出电平 | 32位 | 低16位有效,直接写入可能引发竞态(慎用) |
GPIOx_BSRR | 原子操作电平控制:低16位置位(1→高),高16位复位(1→低) | 32位 | 写0无效,无中断风险,替代ODR的首选 |
GPIOx_BRR | 复位寄存器(功能被BSRR高16位替代,旧型号兼容) | 16位 | 写1复位对应引脚 |
GPIOx_LCKR | 锁定配置防篡改 | 32位 | 位16=1时,位0-15锁定对应引脚配置 |
⚠️ 注意:
- 所有寄存器必须按32位字访问(禁止半字/字节操作);
- 操作前必须使能时钟(
RCC_APB2ENR
对应位),否则配置无效。
// 配置PA5为推挽输出(50MHz)
GPIOA->CRL &= ~(0xF << 5 * 4); // 清除原配置
GPIOA->CRL |= (0x3 << 5 * 4); // MODE=11 (50MHz), CNF=00 (推挽输出)
CNF[1:0] | MODE[1:0] | 模式 | 应用场景 |
---|---|---|---|
00 | >00 | 推挽输出 | LED、高速信号(PWM) |
01 | >00 | 开漏输出 | I²C、5V兼容设备 |
10 | 00 | 浮空输入 | 中断检测、数字信号读取 |
11 | 00 | 模拟输入 | ADC采集 |
if (GPIOA->IDR & (1<<6)) { // 检测PA6是否为高电平
// 高电平逻辑
}
GPIOA->ODR |= (1<<8); // 置PA8高电平(不推荐)
GPIOA->BSRR = (1<<5); // PA5置高(原子操作)
GPIOA->BSRR = (1<<(16+5));// PA5置低(等效BRR)
GPIOA->BRR = (1<<5); // PA5置低
复用模式需通过AFR寄存器选择功能编号(如SPI、USART):
// 配置PA9为USART1_TX(AF7)
GPIOA->CRH |= (0x2 << 9 * 4); // 复用模式(CNF=10)
GPIOA->AFR[1] |= (0x7 << ((9-8)*4)); // AFRH[1]对应PA8-PA15,PA9=AF7
RCC->APB2ENR |= (1<<2); // 使能GPIOA时钟
RCC->APB2ENR |= (1<<3); // 使能GPIOB时钟
GPIOB->CRL &= ~(0xF << 0 * 4); // 清除PB0配置
GPIOB->CRL |= (0x8 << 0 * 4); // CNF=10(下拉输入),MODE=00(输入模式)
GPIOB->ODR &= ~(1<<0); // ODR=0启用下拉
GPIOA->CRL &= ~(0xF << 5 * 4); // 清除PA5配置
GPIOA->CRL |= (0x3 << 5 * 4); // CNF=00(推挽输出),MODE=11(50MHz)
while (1) {
if (GPIOB->IDR & (1<<0)) { // 检测按键按下(PB0高电平)
GPIOA->BSRR = (1<<5); // PA5亮(原子操作)
} else {
GPIOA->BSRR = (1<<(16+5));// PA5灭
}
}
电平兼容性:
JTAG引脚释放:
若需使用PA13~PA15/PB3~PB4作GPIO,需禁用JTAG
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN; // 使能AFIO时钟
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE; // 关闭JTAG
配置锁定(LCKR):
防止关键引脚(如复位脚)被意外修改
GPIOA->LCKR = (1<<5) | (1<<16); // 锁定PA5配置
开漏输出必需上拉电阻:
I²C等总线场景,外部需接4.7kΩ上拉电阻。
特性 | 寄存器操作 | 库函数(如HAL) |
---|---|---|
执行效率 | ⭐⭐⭐⭐⭐(直接写寄存器) | ⭐⭐(函数调用开销) |
代码可读性 | ⭐(需查手册) | ⭐⭐⭐⭐⭐(函数名自注释) |
移植性 | ⭐(与芯片绑定) | ⭐⭐⭐(跨系列兼容) |
适用场景 | 实时控制、高频信号 | 快速开发、复杂外设初始化 |
推荐:混合使用
- 高频操作(如PWM)用寄存器提升性能;
- 复杂外设(USB、ETH)用库函数保证可维护性。