ARMマイコンSTM32の学習におすすめの開発環境【初心者必見】
目次
ARMマイコン(STM32)初心者が勉強するのに適した開発環境とは
マイコンの学習を始めようとしてマイコンを選択した後の課題がマイコンの開発環境についてです。
- プログラムを作成するために何を準備すればいいのでしょうか。
- 作成したプログラムが動作するマイコンと周辺回路搭載のハードウェア(インターフェース)はどうすればいいでしょうか。
- 作成したプログラムをマイコンに転送するためのツールはどうすればいいのでしょうか。
具体的には以上のことではないでしょうか。
筆者も組み込みを始めた当初、マイコンをSTM32にターゲットを絞り、具体的に開発するためのツールに関する情報を集めるには結構苦労しました。
マイコンSTM32シリーズの開発環境は世界的に見ても人気のあるマイコンのため選択肢がないのではなくむしろ多すぎるため自分に最も適した開発環境がどれかを絞ることが難しかったからです。
今でも開発環境についての情報は便利なツールも含め更にふえたので入門者ではどれから始めたらよいのかますます困難でしょう。これまで筆者がたどってきた選択のポイントを顧みながら今では当面はこれを使っておけばよいといったものを紹介しましょう。
開発環境の条件としてWindows PCで動作し、学習目的のため無料であること。
ただし、開発環境の無料版のものは数ありますがコード制限のあるものや機能制限のあるものは使えません。
マイコンの開発には通常、総合開発環境(IDE:Integrated Development Environment )とよばれるソフトウェア開発用のさまざまな機能がオールインワンとなったパッケージアプリケーションを使用します。総合開発環境にはプログラムを記述するエディタ、C言語等プログラミングのコンパイラ、アセンブラ、リンカおよびデバッガ等の機能が備わっています。
総合開発環境を使用すると、開発者はプログラミングに集中でき、転送、実行までかんたんな操作で実現できます。
筆者は使用制限のない開発環境を構築したくフリーの総合開発環境のプラットフォームであるEclipseをベースにしたSTM32開発環境の構築もしてきました。自由度があり一度安定したものは自己満足感満載で使いやすくよかったのですが、マイコン仕様変更の際にはプロジェクト再構築やコンパイラの指定などが結構煩わしくとにかく手間ひまかかりました。
手作りで開発環境を構築するのが趣味であればよいかもしれませんが仕事や学習などを優先させたい場合は貴重な時間を技能習得などに割くべきで開発環境を自分で構築するのは避けたほうがよいでしょう。
ファームウェアライブラリ
STM32シリーズでは以前よりスタンダードペリフェラルライブラリ(SPL)と呼ばれるファームウェアライブラリが利用できます。このライブラリはよくできており、インターネット、書籍でも解説記事は多いので使い方に関しての情報は十分取得できます。ハードウェア寄りで具体的なものだからマイコンの学習にはこちらをすすめます。
対して、最新の開発環境ツールではファームウェアライブラリは最新のマイコンにも対応できるように一新(SPLに対してHAL、LLと呼ばれるライブラリ)されているため、今後新しいマイコンの新規開発ではこちらを使うべきなのですが、HALとLLファームウェアライブラリのまとまった解説情報はあまりない状況です。
また、HALコードは抽象化されているためSPLで理解したあとで使用することをすすめます。今後はこちらが主流となるため、解説記事なども増えて使いやすくなるのでしょうが、入門者には敷居が低くなったようにも見えますが向いていないように感じられます。SPLでマイコンの基礎を十分に身に着けてから使用するとHAL、LLには容易に移行できますのでまずじっくり腰を据えて基礎固めに徹してください。
電子工作で大人気のArduinoやARMマイコンのメーカーの垣根を超えた開発環境であるMbedに共通した特徴は手軽にマイコン開発ができるようにハードウェアとのインターフェース部分を抽象化していることです。STM32のコード自動生成機能と組み合わせたHALライブラリも同様な環境で、開発が容易になる反面、インターフェース部を隠蔽しているために、モノづくり、特にマイコンの基礎を勉强しようとする人が初めから使うにはどうかと思います。
ある程度の知識経験をもったエンジニア等が開発の試作などを容易で有利にすすめる場合や、中身はよくわからなくても動作させればよいホビー向けの電子工作、あるいは学生の開発現場などには向いていると思われます。仕事でマイコンを使う場合は基礎がなければつぶしが効きませんのでここではあえてライブラリにハードウェアに近いSPLを使用することを奨励しています。
SPLによりSTM32マイコンにある程度なれたら、STM32CubeIDEの本来の使い方(HALライブラリとコード自動生成)を使うことを始めるのがよいと思います。実際の開発では新しい環境で行うことがマイコンの種類に限りはないし、効率もよいです。SPLで基礎ができていればHAL等への移植は容易です。
技術にはパラダイムシフトにより真空管からドランジスタ、LSI、マイコンに進化して行く過程で例えば真空管の知識などはエンジニアにとって現在ではあえて必要のあるものではありません。マイコン開発を行っていく上では、例えば一昔まえではアセンブリ言語と呼ばれるマイコンに近い低水準言語でプログラムを作成していましたが、今ではアセンブリを使用しなくてもより開発しやすいC言語などで開発ができてしまいます。また、IoTを実現するうえで使う通信のプロトコル・スタックの中身などはあえて知らなくても完成されたものを利用できればそれでよい場合もあります。ただ、すべてがそうではなくて開発するにあたって押さえるべき基礎、例えば古くからある技術でも重要なトランジスタなど初心者のうちからしっかり学習しておかならないポイントは自分でしっかり理解しておいてはじめて使えるエンジニアとして活躍できるようになるのです(ホビー目的の電子工作ではそこまでは求められないかもしれませんが)。現代では数多くある開発プログラム言語のなかでも比較的古典的なプログラミング言語であるC言語が開発ではまだ現役であることがそれを物語っています。SPLをあえて採用しているのはそういった意味も込められています。
STM32マイコンの開発ツール
実際のところツールになにを選べばよいかの話に戻りますが、STM32専用開発環境のIDE(総合開発環境)がよくSTマイクロ社公式のIDEであるTrueSTUDIOが最強です(正確にいえば最強でした)。Eclipseベースでとても使いやすい環境です。機能制限がなく、コンパイラからデバッガまですべてオールインワンでプログラム作成からプログラム転送まで簡単に実現できる開発環境です。
このIDEとの組み合わせで視覚的に周辺機能などの機能を選択するとコードを自動生成してくれるアプリであるSTM32CubeMXもありますが学習段階では自動生成は使う必要はないでしょう。
この原稿を作成している現在は、IDEのTrueSTUDIOと自動生成ツールSTM32CubeMXを統合したSTM32CubeIDEがSTマイクロ純正のIDEとして主流となっています。同時にTrueSTUDIOは新規開発には非奨励対象となりました。
このような状況下ですので将来性を考慮するとこのSTM32CubeIDEを使用して慣れていくのがベストな選択だと考えます。ただ、スタンダードペリフェラルライブラリ(SPL)には対応していませんので、手動で設定したものを使用することにします。
このように開発環境は技術の進化に合わせて更新したり、フルモデルチェンジしたりするものです。最新のマイコンを採用して新規に開発を開始するにはやはり、最新の開発環境は必要で対応できるスキルを身につけることも重要でしょう。
このサイトでは組み込み技術入門者に32ビットマイコンARMコア搭載のSTM32を教材として使用してマイコンをつかいこなすための基本を習得してもらうものが趣旨ですので、総合開発環境STM32CubeIDEに対象マイコンのファームウェアライブラリSPLを組み込んだものを使用することにしています。
持論ですが開発環境はできるだけシンプルなものが好ましいと考えています。その点、STM32CubeIDEは色々な機能が盛り込まれてはいるのですが、使うものを限定するとシンプルです。インストールをするとコンパイラに必要な専用のツールチェインをはじめ、必要なツールすべてが自動的に組み込まれます。手動で追加するのはスタンダードペリフェラルライブラリ(SPL)とFreeRTOSだけです。アプリケーションによっては必要に応じてファームウェアを追加すればよいわけで、基本的なものはオールインワンの開発環境です。
STM32CubeIDEはコード自動生成などの最新のツールも含まれています。ただし、生成されるコードはHALライブラリですのでファームウェアライブラリSPLが使用できる開発環境でSTM32の基礎技能を一通り習得した段階でこのツールを使うと大いに便利でしょう。
いきなりすべての機能を使いこなすのは困難でツールに振り回されます。最新ツールを使うのはインターネットで使いこなすための十分な情報がでるようになってからでもよいでしょう。楽しみはあとにとっておいてください。
マイコンへのプログラム転送書き込みでは数種類の方法があるなかでSWD方式のST-Link/V2を使用します。詳細は「開発環境構築」および「実装」で解説します。当サイトで教材ボードとして使用するNUCLEO-F103RBにはST-Link/V2が含まれています。
STM32CubeIDEの構築
ターゲットマイコン:ARM Cortex-M3 STM32F103RB(NUCLEO-F103RB)
デバッガ:ST-Link/V2 SWD
ここでは、このサイトの教材(Nucleo-STM32F103RB)を使用するための開発環境として、SPLおよびFreeRTOSを組み込んだ仕様を構築します。STM32CubeIDEの開発環境仕様として最も軽快なものではないでしょうか。
初めの手間はかかりますが、一度プロジェクトを構築して無事動作すればアプリごとに転用できます。
このサイトでは使用しませんが、STM32CubeIDEにはコード自動生成機能もありますので、ある程度慣れてきてから挑戦してみてはいかがでしょうか。
STM32マイコンの開発環境として使用するSTM32CubeIDEのダウンロードからインストールまでに関しましてはインターネットで十分な情報が得られますので詳細は割愛します。インストール半ばでST-Link関連のコンポーネントチェック選択箇所がありますのでチェックを入れておいてください。SEGGER-Jlinkドライバは使用しないのでチェックを外しておいてもよいです。
ファームウェアライブラリSPLを組み込んだプロジェクトの作成
ファームウェアライブラリSPL(STM32 Cortex-M3用)
- インストールしたSTM32CubeIDEアイコンをクリックして起動
- 作業用フォルダワークスペースを指定します。
慣れるまではデフォルトでいいと思います。
- この画面がでてきたら新規のプロジェクトを作成するので左のアイコンを選択
あるいはメニューバー「File」-「New」-「STM32 Project」
- 使用する対象のマイコン(MCU/MPU selectorタブ)を選択。
この例ではSTM32F103RB(LQFP64パッケージ)を選択
- プロジェクト名は任意のものをつけます(ここではNUCLEO-F103RB)。プロジェクトにはファームウェアライブラリSPLをプラグインとして手動で追加する方式でコード自動生成は使わないのでTargeted Project TypeにはEmptyを指定して「Finish」をクリック。
- 新規プロジェクトフォルダ(この場合はNUCLEO-F103RB)が作成されました。あらかじめダウンロードしておいたファームウェアライブラリSPLが含まれたLibrariesフォルダをプロジェクト内にコピーしておきます。FreeRTOS(OS)を使用することも前提としているのでSourceフォルダも同様にコピーしておきます(エクスプローラ等ファイルマネーファを使って)。
- アプリケーションプログラムや関連ヘッダファイル類はSrcフォルダに入れます。
- この段階でメニューバー「Project」-「Build All」で一度ビルドを実行します。
デフォルトのままですので、エラーもなく実行ファイルが作成され、追加したフォルダ等がプロジェクトに反映されているはずです。
- これで準備完了です。新規のプロジェクトは標準仕様でこのままでは追加したプラグイン(SPLとFreeRTOS)はまだ使用できませんので、追加フォルダへのインクルードパスを設定したり、SPLを使えるためのシンボルを指定したりします。
インクルードパス
- Project Explorerで編集したいプロジェクトを指定してからメニューバー 「Project」–「Propaties」の順にクリックしてプロパティ画面を開きます。ここで左ペインの「C/C++ General」を開き、「Paths and Symbols」タブを選ぶとインクルードパスの設定画面になります。
- 右の「Add」ボタンをクリックするとパスを指定するダイアログが現れます。
- すべてチェックを入れて「Workspace」をクリックしてからプロジェクト内のパスを通していきます。以下のようにパスが通れば完了です。
- プロジェクトフォルダは 以下の通りです。
- インクルードパスを設定したあとは「Source Location」タブで追加したプラグインフォルダの場所を指定しておきます。これを忘れると、ビルド時にエラーとなります。
- 最後に、ペリフェラルライブラリSPL内でMPUを指定したりするシンボル(Symbol)を登録します。下図のとおり、シンボルを追加してください。
シンボルはそのまま"Name"のところに追加してください。
"Value"は空白のままにしておいてください。
- STM32F10X_MD
- USE_STDPERIPH_DRIVER
- 以上でSTM32CubeIDEの開発環境設定は完了です。
当サイトで使用している教材ボードに搭載しているマイコンはSTMF1シリーズのSTM32F103RBでMedium Desityバリューライン(MD)に属するため、シンボルに”STM32F10X_MD”を指定しています。他の市販ボードに搭載しているマイコンでSTM32F103RB以外ではシンボルをマイコンの種類に相当するものに指定する必要があります。シンボルはペリフェラルライブラリのsystem_stm32f10x.cおよびstm32f10x.h内で定義され各マイコンの機能に合わせるために使用するものです。例えば、STM32F100RBを搭載したSTM32VLDISCOVERYではシンボル”STM32F10X_MD_VL”か”STM32F10X_MD”を、High-DensityパフォーマンスラインのSTM32F103VEを搭載したボードでは”STM32F10X_HD”を指定します。
コンパイル・リンク・ビルド
Cコードでのソース・ファイルが完成したあとはビルド(build)を行い、コンパイル・リンクを経て実行ファイルを作成します。
メニュー「Project」-「Build Project」の順にクリックすると実行ファイルまで作成してくれます。
コンパイルとはCコードで記述されたソース・ファイルをオブジェクトコードのファイルに変換することです。変換されたファイルの拡張子は.oで、プロジェクト内の「Debug」フォルダ内に格納されます。
エラーもなくビルドが無事成功するとプロジェクトツリー内で「Binaries」フォルダが作成されて拡張子elfのファイルがあるはずです。同時に拡張子binのバイナリ実行ファイルも作成されています。ここまでくれば後はデバッガST-Linkでマイコンに実行ファイルを転送するだけです。
コンパイルエラー
初めてSTM32CubeIDEをインストールした場合は、このコンパイルの特性でint8_tとcharが異なりコンパイル時にwarningが発生することがあります。
Warning : pointer targets in passing argument 1 of 'xxxx' differ in signedness
この警告は変数の符号が違うとコンパイラが判断するからです。
これはARM仕様のCMSISがISO C99に準拠した変数宣言の定義としており、通常のchar、intに対して変数のビット数まで明示的に宣言したもの(例えば、8ビット符号付きはint8_t、符号なしはuint8_t)であるからです。
int8_tの定義をsigned charでなくcharにすればよいのですが、これはツールチェイン(コンパイラ)の「machineフォルダ」内の_default_types.h内のものが最優先であるらしく、ここで定義している __INT8_TYPE__ がデフォルトでsigned charであることが問題の原因であることが判明しました。これを強制的にcharにするため、#define __INT8_TYPE__ charを_default_types.h内に追加します。
ツールチェイン(コンパイラ)の「machineフォルダ」内の_default_types.hの場所
(デフォルトの場合)
ST →STM32CubeIDE_xxx → STM32CubeIDE → Plugins→com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.7-2018-q2-update.win32_1.0.0.201904181610→ tools → arm-non-eabi → include → machine →_default_types.h
転送
ビルドで作成された実行ファイルをマイコンのフラッシュメモリに転送(書き込み)して初めてマイコンが機能するようになります。転送用ツールはST-LINKデバイスを使用します。
マイコン側とデータのやり取りにARM通信規格のSWD方式を採用しています。SWDとは2本の信号(SWCLKとSWDIO)でデータを書き込む方式です。
転送用ツールのST-LINK(V2)はPC側にはUSB、マイコン側にはSWDの信号線2本およびGNDの合計3本を接続すれば構成は完成です。ST-LINKはV1ではSTM32CubeIDEで機能しないためV2以上が必要です。
メニューバー「Run」 - 「Debug」の順にクリックすると転送が開始されます。転送が始まるとST-LINKデバイスの赤LEDが点滅はじめます。無事終了すると点灯か消灯に状態が変わります。
以上で、STM32マイコンの開発環境構築からプログラム転送まで解説してきました。あとは実際に動作させてみて順調に転送書き込みが正常に完了するまである程度の試行錯誤を繰り返しながら経験してみてください。
プログラムも含めて、初回で転送まで成功することはないものですが、なんらかの不具合には必ず原因がありますので、自力で原因を探しあてて解決できるようになるのもスキルの一つです。
STM32CubeIDEの具体的な操作方法(コンパイラ・ビルドおよび転送方法)に関しましては、ここでは詳細は解説しませんが、これに関しましてはインターネットで豊富な情報がありますのでそちらを参考にしてください。STM32CubeIDE はeclipseベースですのでeclipse関連の情報が役に立つのではと思います。
組み込み開発環境でよく使われる用語について解説しておきます。知っておかなければならない用語でもないのですが、よく耳にする言葉なのでいちど理解しておいてください。
当サイトで使用するNUCLEO-F103RBやSTM32F100RBを搭載したSTM32VLDISCOVERYボード等STマイクロエレクトロニクス社販売の評価ボードにはデバッガのST-Linkが付属していますので外付けでST-Linkを準備しなくてもUSBケーブルがあれば転送までできてしまいます。ST-Linkデバイスは他社のSTM32搭載ボードや新規に設計した自作マイコンボードに必要となります。
セルフ環境とクロス環境
セルフ環境とは開発環境と実行環境が同じもので例えばPCでVisual C#などをつかってアプリケーション開発を行う環境です。対して、クロス環境は開発環境と実行環境が別でそれ自体に開発環境を持たない組み込み機器で動かすアプリケーションを別のパソコン上で開発する環境のことです。組み込み機器ではさまざまなCPUやOSが使用されるためクロス環境で開発が行われます。
プログラムを作成するPCをホストコンピュータ(開発コンピュータ)といいます。 組み込み機器はターゲットコンピュータといいます。ターゲット用にプログラムをコンパイルするものをクロスコンパイラ/アセンブラ/リンカといい、ライブラリはクロスライブラリ、プログラムのパグ取りはクロスデバッガといいます。 開発環境を構築する際の用語として上記のものをよく耳にすると思われます。
「マイコン学習の初心者にArduinoでなくSTM32Nucleoをすすめるわけ」に当サイトで採用している開発環境を使った学習方法についての優位なポイントを解説しています。
当サイトで紹介しているマイコン開発環境用ツールはフリーで提供しております。
ダウンロードするためにはお問い合わせフォームで登録してパスワードを取得してください。