gpio-baremetal
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseGPIO (Bare-Metal)
GPIO(裸机)
Purpose
用途
Configure and use GPIO without HAL: input/output modes, alternate function mapping, pull-up/down, speed/slew, and pin-change interrupts for LEDs, buttons, and peripheral pin mux.
无需HAL库即可配置和使用GPIO:包括LED、按钮和外设引脚复用的输入/输出模式、复用功能映射、上拉/下拉、速度/压摆率以及引脚变化中断。
When to Use
使用场景
- Blink LED or read button before bringing up UART/SPI
- Mux pins to USART/SPI alternate functions
- EXTI line interrupts on pin edges
- Porting GPIO code between vendors
- 在启用UART/SPI之前实现LED闪烁或按钮读取
- 将引脚复用到USART/SPI复用功能
- 引脚边沿触发的EXTI线中断
- 在不同厂商的MCU之间移植GPIO代码
Workflow
工作流程
1. STM32 GPIO pattern
1. STM32 GPIO编程范式
c
/* Enable GPIOA clock */
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
/* PA5 output — MODER[11:10] = 01 */
GPIOA->MODER &= ~(3U << (5 * 2));
GPIOA->MODER |= (1U << (5 * 2));
/* Toggle via BSRR — atomic set/reset */
GPIOA->BSRR = (1U << 5); /* set */
GPIOA->BSRR = (1U << (5+16)); /* reset */Alternate function (e.g., USART2 TX on PA2):
c
GPIOA->MODER &= ~(3U << (2*2));
GPIOA->MODER |= (2U << (2*2)); /* AF mode */
GPIOA->AFR[0] &= ~(0xFU << (2*4));
GPIOA->AFR[0] |= (7U << (2*4)); /* AF7 = USART2 */c
/* Enable GPIOA clock */
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
/* PA5 output — MODER[11:10] = 01 */
GPIOA->MODER &= ~(3U << (5 * 2));
GPIOA->MODER |= (1U << (5 * 2));
/* Toggle via BSRR — atomic set/reset */
GPIOA->BSRR = (1U << 5); /* set */
GPIOA->BSRR = (1U << (5+16)); /* reset */复用功能(例如,PA2作为USART2 TX引脚):
c
GPIOA->MODER &= ~(3U << (2*2));
GPIOA->MODER |= (2U << (2*2)); /* AF mode */
GPIOA->AFR[0] &= ~(0xFU << (2*4));
GPIOA->AFR[0] |= (7U << (2*4)); /* AF7 = USART2 */2. Input with pull-up
2. 上拉输入配置
c
/* PC13 input, pull-up */
GPIOC->MODER &= ~(3U << (13*2)); /* input mode 00 */
GPIOC->PUPDR &= ~(3U << (13*2));
GPIOC->PUPDR |= (1U << (13*2)); /* pull-up */
int pressed = !(GPIOC->IDR & (1U << 13)); /* active low */c
/* PC13 input, pull-up */
GPIOC->MODER &= ~(3U << (13*2)); /* input mode 00 */
GPIOC->PUPDR &= ~(3U << (13*2));
GPIOC->PUPDR |= (1U << (13*2)); /* pull-up */
int pressed = !(GPIOC->IDR & (1U << 13)); /* active low */3. EXTI interrupt (STM32)
3. EXTI中断(STM32)
c
/* SYSCFG: map EXTI13 to PC13 */
SYSCFG->EXTICR[3] = (SYSCFG->EXTICR[3] & ~0xFU) | 0x2; /* port C */
EXTI->IMR |= (1U << 13);
EXTI->FTSR |= (1U << 13); /* falling edge */
NVIC_EnableIRQ(EXTI15_10_IRQn);ISR: check , clear with write-1.
EXTI->PRc
/* SYSCFG: map EXTI13 to PC13 */
SYSCFG->EXTICR[3] = (SYSCFG->EXTICR[3] & ~0xFU) | 0x2; /* port C */
EXTI->IMR |= (1U << 13);
EXTI->FTSR |= (1U << 13); /* falling edge */
NVIC_EnableIRQ(EXTI15_10_IRQn);中断服务程序(ISR):检查寄存器,通过写1操作清除中断标志。
EXTI->PR4. nRF52 / ESP32 notes
4. nRF52 / ESP32 注意事项
| Platform | Pattern |
|---|---|
| nRF52 | |
| ESP32 | |
Always enable peripheral clock / power domain before pin config.
| 平台 | 编程范式 |
|---|---|
| nRF52 | |
| ESP32 | |
引脚配置前务必启用外设时钟/电源域。
5. Agent usage
5. Agent 使用方式
/gpio-baremetal Configure PA2 as USART2 TX alternate function on STM32F4/gpio-baremetal Configure PA2 as USART2 TX alternate function on STM32F4Common Problems
常见问题
| Symptom | Cause | Fix |
|---|---|---|
| Pin stuck | Wrong MODER / not AF | Re-read RM pin table |
| EXTI storm | No debounce / floating input | Enable pull; debounce in software |
| AF mismatch | Wrong AFR nibble | Pin-specific AF table in RM |
| No toggle visible | Wrong port bit / LED active low | Check schematic |
| 症状 | 原因 | 解决方法 |
|---|---|---|
| 引脚状态异常 | MODER配置错误/未设置复用功能 | 重新查阅参考手册(RM)引脚表 |
| EXTI中断风暴 | 未消抖/输入引脚浮空 | 启用上拉/下拉;软件消抖 |
| 复用功能不匹配 | AFR四位域配置错误 | 查看参考手册(RM)中引脚专属复用表 |
| LED无闪烁效果 | 端口位选择错误/LED低电平有效 | 检查原理图 |
Related Skills
相关技能
- — BSRR/MODER masks
skills/baremetal/mmio-and-bit-manipulation - — RM pinout tables
skills/baremetal/peripherals-from-datasheet - — AF mux for serial
skills/baremetal/uart-serial-baremetal
- — BSRR/MODER掩码操作
skills/baremetal/mmio-and-bit-manipulation - — 参考手册(RM)引脚分配表
skills/baremetal/peripherals-from-datasheet - — 串口复用功能配置
skills/baremetal/uart-serial-baremetal