gpio-baremetal

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

GPIO (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
EXTI->PR
, clear with write-1.
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):检查
EXTI->PR
寄存器,通过写1操作清除中断标志。

4. nRF52 / ESP32 notes

4. nRF52 / ESP32 注意事项

PlatformPattern
nRF52
NRF_P0->PIN_CNF[n]
— direction, pull, drive
ESP32
GPIO.out_w1ts
,
GPIO.enable
; IO_MUX for function
Always enable peripheral clock / power domain before pin config.
平台编程范式
nRF52
NRF_P0->PIN_CNF[n]
— 方向、上拉/下拉、驱动能力
ESP32
GPIO.out_w1ts
GPIO.enable
;使用IO_MUX配置功能
引脚配置前务必启用外设时钟/电源域。

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 STM32F4

Common Problems

常见问题

SymptomCauseFix
Pin stuckWrong MODER / not AFRe-read RM pin table
EXTI stormNo debounce / floating inputEnable pull; debounce in software
AF mismatchWrong AFR nibblePin-specific AF table in RM
No toggle visibleWrong port bit / LED active lowCheck schematic
症状原因解决方法
引脚状态异常MODER配置错误/未设置复用功能重新查阅参考手册(RM)引脚表
EXTI中断风暴未消抖/输入引脚浮空启用上拉/下拉;软件消抖
复用功能不匹配AFR四位域配置错误查看参考手册(RM)中引脚专属复用表
LED无闪烁效果端口位选择错误/LED低电平有效检查原理图

Related Skills

相关技能

  • skills/baremetal/mmio-and-bit-manipulation
    — BSRR/MODER masks
  • skills/baremetal/peripherals-from-datasheet
    — RM pinout tables
  • skills/baremetal/uart-serial-baremetal
    — AF mux for serial
  • skills/baremetal/mmio-and-bit-manipulation
    — BSRR/MODER掩码操作
  • skills/baremetal/peripherals-from-datasheet
    — 参考手册(RM)引脚分配表
  • skills/baremetal/uart-serial-baremetal
    — 串口复用功能配置