Visual Studio Codeでstm32の開発環境構築に挑戦した話

2020年6月29日

はじめに

この記事はstm32 Advent Calendar 2017の1日目の投稿です.なおこの段階で書く人が僕含め4人しかいません.まぁいいけど.

stm32の開発環境としてこんな記事を書いたり,こんな本を頒布していました.
最近はメインとしてSystemWorkbench for STM32(SW4STM32)を用いています.インストーラ1つでツールチェインやプログラマ,デバッガのインストール.パスの設定まで一括で行ってくれます.
GUIのペリフェラル設定GUIソフトウェア,「CubeMX」がSW4STM32用のプロジェクトファイルをエクスポートしてくれるので非常に楽です.

しかし,周りを見ていると,宗教上の理由からEclipseベースのソフトウェアを使えないであったり,マシンリソースを非常に酷使してしまうということで使えないという場合もあるようです.
今回はCubeMXからSW4STM32用のプロジェクトではなく,Makefile形式で出力し,Visual Studio Codeでコードのビルド,OpenOCDを用いた実機でのデバッグ方法を紹介します.

環境を作る

1.コンパイラをインストールする.
ARMマイコンではおなじみGNU ARM Embedded Toolchainをインストールします.
Windowsの場合は,追加でMake for WindowsThe GNU MCU Eclipse Windows Build Toolsをインストールします.
パスを通すなりしてターミナルからmakeコマンドが叩けるようにしておきます.

2.デバッガをインストールする.
オープンソースのOpenOCDをインストールします.

3.Visual Studio Code(VSCode)をインストールする.
Micsosoft製のテキストエディタです.Windows,MacOS,LinuxどれでもOKです.
stm32を使えるようにするためにVSCodeに拡張機能C/C++をインストールしましょう.VSCodeでC/C++を開発するのに必要です.

CubeMXで雛形を作る

CubeMXでピンとかペリフェラルの設定をわちゃわちゃやって,コード生成します.この時に,「Project settings」内部の「Toolchain/IDE」から「Makefile」を選択します.(画像はVersion4.22.0のもの)
これでプロジェクト生成すると.各設定の完了したドライバ,ソース,ヘッダファイルごとのフォルダとMakefileの入ったフォルダが生成されます.
CubeMXからMakefile形式でエクスポートするには以下の記事が参考になります.
STM32CubeMXのMakefile出力機能でSTM32お手軽開発環境構築
HALとMakefileの構成でC++を使う

コンパイル

これからはVSCodeでの作業です.
VSCodeの「フォルダを開く」から先程生成したフォルダを開きます.(VSCodeではこれをワークスペースフォルダというらしい)すると,VSCodeの下のバーが紫から青変わります.まずMakefileにさきほどインストールしたコンパイラのパスを通します.
BINPATHという部分に何も記載れていないのでここに指定します.
VSCodeでビルドしてみましょう.VSCodeにはタスクという機能があるのでこれを利用します.
タスクを利用して外部ツールと統合する
VSCodeからmakeコマンドをショートカットで叩けるようにします.とりあえずこんなかんじに書きました.「タスク」→「(ビルド)タスクの実行」とクリックしていくと最初は何もない状態からタスクが構成されていくので,「tasks.json」をいうファイルが生成されます.

これで「コマンドを実行」よりビルドやクリーンができるようになります.

デバッグ

VSCodeでデバッグをする際は「lanuch.json」と呼ばれるファイルを設定する必要があります.Wataraiさんの書かれた記事をかなりパクって参考にしています.
これまでで非常に自分がやりたかったことなのでそれをCubeMXで同じことをやってみたというのが今日のメインテーマです.
VSCodeでデバッグを実行しようとすると,「構成の追加」というのが現れるます,ここで「launch.json」というファイルができるのでここに設定を書き込んでいきます.

 

この構成を利用してやればVSCode上でデバッグが可能になります.

今回の方法ではWindowsでは無事に動作しました.
しかし,MacOS(Sierra)ではOpenOCDこそ起動しましたが,一度実行をすると一時停止を受け付けてくれず,デバッグと言い切ることができませんでした…
MacOSはGDBに署名が必要とのことで,gcc-arm-none-eabi-gdbに署名をしても変化なしです.
どうやら僕以外にも同様の症状が起きているらしく,VSCodeの拡張機能「C/C++」のissueにも上がっていました.
https://github.com/Microsoft/vscode-cpptools/issues/807

どなたか知見があれば教えていただきたいです.

まとめ

VSCodeでstm32の開発環境を作った,Windowsでは無事に動いたが,他のOSでは前途多難…