Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Programming and Flashing MCU without any IDE

2025年10月03日に「Dev.to」が公開したITニュース「Programming and Flashing MCU without any IDE」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

STM32F4マイコンをIDEを使わず開発する手法を解説。PlatformIOでC言語プログラムをビルドし、ファームウェア(バイナリ)を作成する。書き込みはSWDインターフェースとST-LINK、OpenOCD/st-flash、またはUSBとdfu-utilで行う。

出典: Programming and Flashing MCU without any IDE | Dev.to公開日:

ITニュース解説

システムエンジニアを目指す初心者の方々にとって、統合開発環境(IDE)を使わずにマイコンをプログラミングし、実際に動作させる経験は、組み込みシステムの深い理解への貴重な一歩となる。通常、マイコン開発ではSTMicroelectronicsが提供するSTM32CubeIDEのような高機能なIDEを利用するが、この記事ではIDEの裏側で行われている「プログラミング」と「書き込み(フラッシング)」のプロセスを、コマンドラインツールを駆使して手動で実行する方法を解説している。これは、開発の各ステップを詳細に把握し、問題発生時の原因究明能力を高める上で非常に役立つ知識となる。

まず、プログラミングの準備から始める。ARM Cortex-Mベースのマイコンを扱う際、主に二つの重要なライブラリが必要となる。一つは、マイコンの製造元であるSTMicroelectronicsが提供する「STM32 Cube HAL(Hardware Abstraction Layer)」ライブラリである。これは、マイコンの複雑なハードウェア機能を、開発者が汎用的な関数呼び出しで扱えるようにするためのソフトウェア層だ。もう一つは、ARM社が策定した「CMSIS(Common Microcontroller Software Interface Standard)」ライブラリであり、ARM Cortex-Mプロセッサを搭載したマイコン全般に共通のインターフェースを提供する。これらのライブラリに加えて、プログラムのメモリ配置を決める「リンカスクリプト」や、マイコン起動時に最初に実行される「スタートアップコード」などのファイルも不可欠である。

これらの準備作業を効率的に行うため、記事ではVisual Studio Code(VS Code)の拡張機能である「PlatformIO」の利用を推奨している。PlatformIOは、多様なマイコンボードや開発環境をサポートする組み込み開発プラットフォームだ。VS CodeにPlatformIO拡張機能をインストールし、新しいプロジェクトを作成するだけで、HALやCMSISといった必要なライブラリやコンパイラなどのツールチェインが自動的にダウンロードされ、設定される。プロジェクトの設定はplatformio.iniファイルで行い、使用するマイコンの種類や開発フレームワークなどを指定することで、PlatformIOが適切にプロジェクトを構成してくれる。

具体的なプログラムの例として、記事にはsrc/main.cに記述されたサンプルコードが掲載されている。このコードは、マイコンの「GPIO」(General Purpose Input/Output、汎用入出力)ピンの一つであるPA0ピンを、電気信号を出力する「プッシュプル出力」として設定し、そのピンに「High」(論理1、通常3.3Vの電圧)の信号を出力するという非常にシンプルなものだ。プログラムは、HAL_Init()でHALライブラリを初期化し、OscClockConfig()でマイコンの動作に必要なクロックを設定する。その後、__HAL_RCC_GPIOA_CLK_ENABLE()などのマクロで特定のGPIOポートへのクロック供給を開始し、GPIO_InitTypeDef構造体を使ってPA0ピンの詳細な動作モードを設定する。最後にHAL_GPIO_Init()で設定を適用し、HAL_GPIO_WritePin()関数でPA0ピンにHighを出力し、無限ループに入っている。

プログラムが完成したら、次のステップはソースコードをマイコンが理解できる「バイナリ」形式に変換する「コンパイル」(ビルド)作業だ。IDEを使わないこの環境では、コマンドラインからpio runというPlatformIOのコマンドを実行する。このコマンドをプロジェクトのルートディレクトリで実行すると、PlatformIOは必要なコンパイラを呼び出し、ソースコードを機械語に変換する。この際、HALやCMSISライブラリ、リンカスクリプトなども適切に処理され、最終的にマイコンに書き込むための実行可能なファイルが生成される。コマンドの出力には、使用されているプラットフォーム、ボード、メモリ使用量などの詳細な情報が段階的に示される。

ビルドが成功すると、通常./pio/buildディレクトリ内に二つの重要なファイルが生成される。一つはfirmware.elf、もう一つはfirmware.binだ。firmware.elfは、純粋な機械語コードに加えて、デバッグ情報やプログラムの各部分がメモリのどこに配置されるかといった詳細な情報(「セクション」情報)を含んだファイルである。これは主にデバッガーがプログラムの実行状況を解析するために利用されるため、ファイルサイズは大きくなる。一方、firmware.binは、マイコンのフラッシュメモリ(プログラムを保存する記憶領域)に直接書き込むための、純粋な機械語コードのみを含むファイルで、デバッグ情報を含まないためファイルサイズは小さい。firmware.binをマイコンに書き込む際には、プログラムがフラッシュメモリのどこから始まるべきか、その「ベースアドレス」(STM32F4の場合、通常は0x08000000)を明示的に指定する必要がある。

生成されたバイナリファイルの内容を詳細に確認することも可能だ。例えば、arm-none-eabi-objdump -h firmware.elfコマンドを使うと、firmware.elfファイルに含まれるさまざまなセクションの情報を表示できる。セクションとは、プログラムの命令やデータがメモリ内でどのように構成されているかを示す論理的な区画のことだ。例えば、.textセクションにはプログラムの実際の命令(機械語コード)が格納される。.dataセクションには初期値を持つ変数が、.bssセクションには初期値を持たない変数が、.rodataセクションには読み出し専用の定数などが格納される。また、.isr_vectorセクションは、ARM Cortexマイコン特有の割り込み処理ルーチン(ISR)のアドレスリストを含んでいる。このように、バイナリファイルを解析することで、プログラムの内部構造やメモリ使用状況を深く理解できる。さらに、arm-none-eabi-objdump -s .text -d firmware.elfコマンドを使えば、.textセクション内の機械語コードと、それに対応するアセンブリ命令を表示させることができ、プログラムの低レベルな動作を確認できる。

バイナリファイルが準備できたら、いよいよそれをマイコンのフラッシュメモリに書き込む「フラッシング」の段階に移る。この作業にはいくつかのツールとインターフェースの選択肢がある。主要な書き込みツールとして「OpenOCD」、「st-flash」、「dfu-util」が挙げられる。そして、マイコンとPCを接続するインターフェースには、主に「SWD(Serial Wire Debug)」と「USB」の二種類が存在する。ARMベースのマイコンではSWDが標準的なプログラミングおよびデバッグインターフェースであり、SWDを利用するには「ST-LINK」のような専用のハードウェアデバッガーが必要だ。多くのマイコンはUSBケーブル経由でファームウェアを更新するための「DFU(Device Firmware Update)」インターフェースもサポートしている。DFUモードでマイコンに書き込む場合は、特定のピン(BOOT0ピン)を「High」に設定してからマイコンをリセットする必要がある。どちらのインターフェースにも利点があり、自身の環境や目的に応じて選択することになる。記事の例ではSWDインターフェースとST-LINKデバイスを使用しており、Linux環境ではlsusbコマンドでST-LINKがPCに正しく認識されているかを確認できる。

ST-LINKが認識されたら、OpenOCD(Open On-Chip Debugger)を使って書き込みを行う。OpenOCDはオープンソースで多機能なツールであり、ST-LINKのようなデバッガーとマイコンの間でブリッジのような役割を果たす。OpenOCDを使ってファームウェアを書き込むには、次のコマンドを実行する。openocd -f interface/stlink.cfg -f target/stm32f4x.cfg -c "program firmware.elf verify reset exit"。このコマンドは、ST-LINKとSTM32F4シリーズマイコンの設定ファイルを読み込み、firmware.elfをマイコンに書き込み、書き込み内容の検証、マイコンのリセットを行い、最後にOpenOCDセッションを終了する。もしfirmware.binを書き込む場合は、プログラムの開始アドレスを明示的に指定する必要があるため、コマンドはopenocd -f interface/stlink.cfg -f target/stm32f4x.cfg -c "program firmware.bin 0x08000000 verify reset exit"のようになる。実行結果には、プログラミングと検証が成功したことが表示される。

OpenOCDは書き込みだけでなく、プログラムのデバッグにも利用できる。デバッグを行う場合は、まず一つのターミナルでOpenOCDをサーバーモードで起動し、次に別のターミナルでGDB(GNU Debugger)を起動してfirmware.elfファイルを読み込む。GDBセッション内で、OpenOCDが提供するGDBサーバーに接続し、マイコンをリセットして停止させ、ファームウェアをロードする。これでマイコンにプログラムが書き込まれ、デバッグの準備が整う。info registersでレジスタ情報を表示したり、break mainmain関数の開始点にブレークポイントを設定したり、continueで実行を再開したりする基本的なデバッグ操作が可能となる。

OpenOCDの他にも、st-flashというツールも存在する。これはOpenOCDと同様にSWDインターフェースとST-LINKを利用してSTM32マイコンに書き込みを行うためのツールで、st-flash write firmware.bin 0x8000000のように比較的シンプルなコマンドで実行できる。最後に、dfu-utilというツールについても触れられている。このツールは、USB経由でDFUインターフェースを利用してマイコンに書き込む際に使用され、dfu-util -a 0 -s 0x08000000:leave -D firmware.binのようにコマンドを実行する。

このように、IDEを使わずコマンドラインツールを駆使してマイコンのプログラミングと書き込みを行うプロセスは、組み込み開発の各層を深く理解する上で非常に有益である。ソースコードの準備からコンパイル、バイナリファイルの解析、そして最終的なマイコンへの書き込みとデバッグまでの一連の流れを自らの手で経験することで、普段何気なく使っているIDEが裏側で何をしているのかを肌で感じ、より強固な技術基盤を築くことができるだろう。これはシステムエンジニアとして、組み込みシステムのトラブルシューティング能力や設計能力を高める上で不可欠な知識となる。

関連コンテンツ

関連IT用語

関連ITニュース