Community编程与开发github.com

stm32-固件

使用 STM32CubeMX / STM32CubeIDE + HAL/LL 以及 PlatformIO 进行 STM32 固件开发——包括项目结构与 USER CODE 规则、外设(UART/I2C/SPI/ADC/定时器/DMA)、时钟、低功耗、Flash/选项字节、命令行构建、使用 ST-Link(STM32CubeProgrammer CLI、OpenOCD、GDB、SWV)烧录和调试,以及 HardFault 分析。当用户处理任何 STM32 / Nucleo / Discovery / Blue Pill 板、`.ioc` 文件、CubeMX/CubeIDE、HAL_ 函数、ST-Link 或遇到 HardFault 时——即使他们只说“o meu STM32 não arranca”或粘贴一段 HAL 调用——都应使用本技能。与 embedded-c-cpp 技能结合使用,以保证通用 C/C++ 质量、测试和架构。

stm32-固件 是什么?

该技能为开发人员提供了一套全面的 STM32 固件开发指南,涵盖 STM32CubeMX/CubeIDE 和 PlatformIO 两种项目类型。它详细说明了如何避免 CubeMX 代码生成中常见的陷阱,强调将应用逻辑放在自定义文件中,并通过 `.ioc` 文件管理硬件配置,以保护代码不被重写。技能深入讲解了 HAL/LL 库使用中的关键错误,例如 I2C 地址左移、中断回调中禁止阻塞操作、UART DMA 的正确实现以及数据缓存一致性问题。此外,它还提供了针对 ST-Link 连接失败、HardFault 分析以及系统时钟配置挂起等启动/崩溃问题的故障排除指南,并引用了三个详细的参考文件供深入学习。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/budenga/firmware-skills/tree/HEAD/skills/stm32-firmware

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

STM32 固件(CubeMX/HAL + PlatformIO、ST-Link)

同时加载 embedded-c-cpp 技能以获取编码标准、架构、单元测试和通用调试。本技能包含 STM32 特有的部分。

首先,识别项目

在编写代码之前先阅读仓库。下面这些事实会改变答案:

查找内容在哪里找到
确切型号(例如 STM32G431KBT6)和系列(F0/F1/F4/G0/G4/L4/H7/U5...).ioc(Mcu.UserName)、platformio.ini 的 board =、启动文件名
项目类型.ioc + .project/.cproject → CubeIDE;.ioc + CMakeLists.txt/CMakePresets.json → CubeMX CMake;platformio.ini → PlatformIO
HAL vs LL vs 寄存器Drivers/STM32xx_HAL_Driver、#include "stm32xx_ll_*.h"、每个外设的 CubeMX“高级设置”
RTOSMiddlewares/Third_Party/FreeRTOS、cmsis_os.h
时钟main.c 中的 SystemClock_Config()、.ioc 的 RCC 部分;Nucleo 板通常通过 ST-Link 提供 8 MHz 的 HSE(HSE 旁路)
调试/烧录探针ST-Link(Nucleo/Discovery 板载,或独立的 ST-Link V2/V3)

系列很重要:内核(M0+/M3/M4F/M7/M33)、FPU 有无、Flash 写入粒度(F1 为半字,G4/L4 为双字,H7 为闪存字)、DMA(G0/G4/L4+/H7 有 DMAMUX)、缓存(F7/H7)。当不确定某个寄存器或外设细节时,建议查阅参考手册(RM),而不是猜测。

防止工作丢失的 CubeMX 规则

CubeMX 每次都会重新生成 main.c、stm32xx_it.c、stm32xx_hal_msp.c 和初始化文件。只有位于 /* USER CODE BEGIN x */ 和 /* USER CODE END x */ 之间的文本才会保留。

  • 将应用程序逻辑放在您自己的文件中(App/app.c、App/app.h,或用于 C++ 的 app.cpp),并从 USER CODE BEGIN 2 和 while (1) 的 USER CODE 块中调用 app_init() / app_loop()。
  • 更改引脚、时钟、DMA、中断和外设参数应在 .ioc 中进行,然后重新生成代码——不要通过编辑 MX_xxx_Init() 来实现(它会被覆盖,而且 .ioc 会与代码不匹配)。
  • 提交 .ioc 文件。它是硬件配置的真理之源。
  • 在“项目管理器”→ 代码生成器中启用“将每个外设的初始化生成为一对 .c/.h 文件”:使 main.c 更小,差异更清晰。
  • 详细信息和 C++ 集成:references/cubemx-hal.md。

构建、烧录、调试

选择与项目匹配的路径;完整命令在 references/build-flash-debug.md 中。

项目构建烧录(ST-Link)调试
CubeIDEIDE,或命令行 stm32cubeide ... -buildIDE,或 STM32_Programmer_CLI -c port=SWD -w app.elf -v -rstCubeIDE 调试器(ST-LINK GDB 服务器)
CubeMX CMake(VS Code)cmake --preset Debug && cmake --build --preset DebugSTM32_Programmer_CLI 或 OpenOCDVS Code STM32 扩展 / OpenOCD + GDB
PlatformIOpio run -e <env>pio run -e <env> -t upload(upload_protocol = stlink)pio debug / VS Code(debug_tool = stlink)

烧录会改变板子:在运行上传之前,请先确认用户连接的是哪块板子/探针,并且未经明确确认,切勿运行全片擦除、选项字节或读保护命令(RDP 级别 2 是永久性的)。

HAL 用法——最耗时的错误

  • I2C 地址需要左移后传递:HAL_I2C_Master_Transmit(&hi2c1, 0x76 << 1, ...)。
  • HAL 回调在中断上下文中运行(HAL_UART_RxCpltCallback、HAL_GPIO_EXTI_Callback、HAL_TIM_PeriodElapsedCallback):保持简短,不要使用 HAL_Delay,不要进行阻塞传输。
  • HAL_Delay / HAL_GetTick 需要 SysTick:在更高优先级的中断服务程序或禁用中断时调用它们会导致系统挂起。使用 FreeRTOS 时,在 CubeMX 中将 SYS → Timebase Source 设置为一个基本定时器(TIM6/TIM7)。
  • UART 接收:使用 HAL_UARTEx_ReceiveToIdle_DMA(变长帧)或中断模式配合环形缓冲区;在回调函数和 HAL_UART_ErrorCallback 中重新启动接收(溢出错误会静默停止接收)。
  • F7/H7 上的 DMA 缓冲区(数据缓存):发送前需 clean,接收后需 invalidate,缓冲区要求 32 字节对齐且大小也是 32 字节的倍数;在 H7 上,DMA1/2 无法访问 DTCM RAM——应将缓冲区放在 D2/AXI SRAM 中。
  • 检查每个 HAL 调用的返回值(HAL_OK、HAL_ERROR、HAL_BUSY、HAL_TIMEOUT);出现 HAL_BUSY 通常意味着上一次传输未完成。
  • 超时:在生产路径中永远不要使用 HAL_MAX_DELAY。
  • 更多模式(UART DMA、ADC DMA、定时器/PWM、EXTI、低功耗、Flash 写入、看门狗、复位原因):references/cubemx-hal.md。

当它崩溃或无法启动时

  • HardFault / MemManage / BusFault / UsageFault → references/faults-and-recovery.md(读取 CFSR/HFSR、堆栈中的 PC、用 addr2line 解码)。
  • ST-Link 无法连接(“No target found”、“DEV_TARGET_HELD_UNDER_RESET”)→ 在复位状态下连接;检查 .ioc 中 SWD 引脚是否被重新配置为 GPIO;检查 BOOT0 引脚状态;检查 RDP 级别(另见 references/faults-and-recovery.md)。
  • 在 SystemClock_Config 处挂起 → HSE 不存在或旁路模式不匹配、PLL 设置错误、Flash 等待周期过低。
  • 外设无响应 → 时钟已使能?引脚复用功能正确?MX_xxx_Init 是否确实被调用且顺序正确(DMA 初始化应在使用它的外设之前)?

参考文件

文件何时阅读
references/cubemx-hal.md在 CubeMX 项目中编写/审查代码、C++ 集成、外设模式、低功耗、Flash/EEPROM 仿真、看门狗、复位原因
references/build-flash-debug.md工具链安装、从命令行构建、PlatformIO 的 STM32 设置、烧录、GDB/OpenOCD、printf/SWV 日志记录、大小分析
references/faults-and-recovery.mdHardFault 和其他故障、板子无法连接、选项字节和读保护、恢复看起来已变砖的板子

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

esp32-firmware

ESP32 firmware with PlatformIO — Arduino framework (primary) and ESP-IDF (also inside PlatformIO, or Arduino as an IDF component) — for ESP32, S2, S3, C3, C6. Covers platformio.ini setup, Arduino core 2.x vs 3.x API differences, safe pin selection (strapping/flash/PSRAM/ADC2 pins), FreeRTOS tasks and ISRs, memory/PSRAM, Wi-Fi/BLE, NVS/Preferences, OTA, deep sleep, partitions, flashing over USB/serial, decoding Guru Meditation panics and boot loops. Use this skill whenever the user works on any ESP32 / ESP32-S3 / C3 / C6 board, platformio.ini with espressif32, Arduino sketches for ESP32, idf.py/sdkconfig, or pastes ESP32 serial output (rst:, Guru Meditation, Brownout, watchdog) — even if they only say "a placa reinicia" or "o upload falha". Use together with embedded-c-cpp for general C/C++ quality, testing and architecture.

pic-firmware

Microchip PIC and dsPIC firmware with MPLAB X IDE, XC8 / XC16 / XC-DSC / XC32 compilers and MPLAB Code Configurator (MCC Melody/Classic) for PIC16, PIC18, PIC24, dsPIC33 (F/EP/EV/CK/CH dual-core/A) and PIC32 — configuration bits, oscillator/PLL, TRIS/LAT/PORT/ANSEL, PPS, interrupts per family, 8/16-bit atomicity and hardware-stack limits, dsPIC DSP engine and Q15 fixed-point, high-speed PWM/ADC control loops, motor control and digital power, XC8 memory and optimization, headless builds, programming and debugging with PICkit 4/5, MPLAB Snap and ICD (ipecmd), reset causes and traps. Use this skill whenever the user mentions any PIC or dsPIC part (PIC16F, PIC18F, PIC24F, dsPIC33EP/CK/CH, PIC32MX/MZ), MPLAB X, MCC, XC8/XC16/XC-DSC/XC32, PICkit, Snap, ICD, `#pragma config`, motorBench, or a .X project folder — even for a short question like "o pino não lê nada no PIC" or "o meu controlo PI no dsPIC oscila". Use together with embedded-c-cpp for general C quality, testing and arc...

相关技能