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-firmware とは?

このスキルは、STM32マイコン(Nucleo、Discovery、Blue Pillボードなど)向けファームウェア開発を支援する専門スキルです。対応プラットフォームはSTM32CubeMX/CubeIDE(HAL/LLライブラリ)およびPlatformIOです。プロジェクトの特定、CubeMXのUSER CODEルール(コード消失防止)、ペリフェラル設定のベストプラクティス(I2Cアドレスシフト、割り込みコンテキストでの注意点、DMAバッファのキャッシュ整合性など)、コマンドラインビルド、ST-Linkを使ったフラッシュ・デバッグ(STM32CubeProgrammer CLI、OpenOCD/GDB、SWV)、HardFaultや接続不能などのトラブルシューティングを網羅しています。このスキルは、`.ioc`ファイル、HAL関数、ST-Link、HardFaultといったSTM32固有の要素が現れたときに自動的に読み込まれ、一般的なC/C++品質やテストには`embedded-c-cpp`スキルと併用します。

対応~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に質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

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 ペリフェラルごとの "Advanced settings"
RTOSMiddlewares/Third_Party/FreeRTOS、cmsis_os.h
クロックmain.c 内の SystemClock_Config()、.ioc の RCC セクション; Nucleo ボードは通常 ST-Link から HSE 8 MHz を供給 (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() を呼び出してください。
  • ピン、クロック、DMA、割り込み、ペリフェラルパラメータは .ioc ファイルで変更し、その後再生成してください。MX_xxx_Init() を直接編集しないでください (上書きされ、.ioc とコードの一致が失われます)。
  • .ioc ファイルをコミットしてください。これがハードウェア設定の信頼できる唯一の情報源です。
  • Project Manager → Code Generator で "Generate peripheral initialization as a pair of .c/.h files per peripheral" を有効にすると、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 を必要とします: これらをより高い優先度の ISR や割り込み禁止状態から呼び出すとハングします。FreeRTOS を使用する場合、CubeMX で SYS → Timebase Source を基本タイマー (TIM6/TIM7) に設定してください。
  • UART 受信: HAL_UARTEx_ReceiveToIdle_DMA (可変長フレーム) または割り込みモードでリングバッファを使用します。コールバック内および HAL_UART_ErrorCallback 内で受信を再開してください (オーバーランは受信を静かに停止させます)。
  • F7/H7 の DMA バッファ (データキャッシュ): TX の前にクリーニング、RX の後に無効化。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、低消費電力、フラッシュ書き込み、ウォッチドッグ、リセット原因): 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") → リセット状態で接続してみる。SWD ピンが .ioc で GPIO に変更されていないか確認。BOOT0 を確認。RDP レベル → references/faults-and-recovery.md を参照。
  • SystemClock_Config でハング → HSE が存在しない / バイパス設定の不一致、PLL 設定ミス、フラッシュレイテンシが低すぎる。
  • ペリフェラルが動作しない → クロックが有効か?ピンの AF 設定は正しいか?MX_xxx_Init が実際に呼び出され、正しい順序で実行されているか (DMA はそれを使用するペリフェラルの前に初期化する)?

参考ファイル

ファイル読むタイミング
references/cubemx-hal.mdCubeMX プロジェクトのコードを書く/レビューするとき、C++ 統合、ペリフェラルパターン、低消費電力、フラッシュ/EEPROM エミュレーション、ウォッチドッグ、リセット原因
references/build-flash-debug.mdツールチェーンインストール、CLI からのビルド、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...

関連スキル