Community程式設計與開發github.com

stm32-firmware

STM32 韌體開發,使用 STM32CubeMX / STM32CubeIDE + HAL/LL 以及 PlatformIO — 涵蓋專案結構與 USER CODE 規則、周邊設備(UART/I2C/SPI/ADC/計時器/DMA)、時脈、低功耗、快閃記憶體/選項位元組、命令列建置、使用 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-firmware 是什麼?

此技能專為 STM32 韌體開發者設計,涵蓋基於 STM32CubeMX、STM32CubeIDE 與 PlatformIO 的專案設定、建置、燒錄及除錯流程。它強調 CubeMX 的 USER CODE 區塊保護機制,確保使用者自訂程式碼在重新生成時不會遺失。技能詳細說明如何使用 HAL 與 LL 驅動程式正確操作 STM32 的常見周邊設備,並指出開發者最常犯的錯誤,例如 I2C 位址偏移、在中斷上下文中使用阻塞函式,以及忽略 HAL 函式的返回值。此外,它還提供完整的故障處理指引,包含 HardFault 分析、ST-Link 連線問題排除以及時脈設定失敗等常見問題的解決方法。本技能支援 CubeIDE、CubeMX CMake 與 PlatformIO 三種專案類型,並提供對應的命令列建置與除錯指令。

相容平台~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、快閃記憶體寫入粒度 (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()。
  • 在 .ioc 檔案中修改腳位、時脈、DMA、中斷與周邊設備參數,然後重新產生——而不是直接編輯 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 server)
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 level 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 緩衝區 (資料快取):傳送前清除,接收後無效化,需 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、低功耗、快閃記憶體寫入、看門狗、重置原因):請參閱 references/cubemx-hal.md。

當系統崩潰或無法啟動時

  • HardFault / MemManage / BusFault / UsageFault → 請參閱 references/faults-and-recovery.md (讀取 CFSR/HFSR、堆疊的程式計數器、用 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 設定錯誤、快閃記憶體延遲設定過低。
  • 周邊設備無反應 → 時脈已啟用?腳位替代功能 (AF) 正確?MX_xxx_Init 是否已被呼叫且順序正確 (先初始化 DMA,再初始化使用它的周邊設備)?

參考檔案

檔案閱讀時機
references/cubemx-hal.md在 CubeMX 專案中撰寫/審查程式碼、C++ 整合、周邊設備模式、低功耗、快閃記憶體/EEPROM 模擬、看門狗、重置原因
references/build-flash-debug.md工具鏈安裝、從命令列建置、STM32 的 PlatformIO 設定、燒錄、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...

相關技能