HAL Driverが使えるSTM32系開発環境を作る

ARM,Eclipse,HAL Driver,STM32

オヒサシブリデス

ARM Coreは昨今の組込技術には無くてはならない存在になってますね。
きがついたら
hbol.jp

Softbankが買収してたりと、最近になってARMという存在を知らなかった人にも名前くらいは浸透したのではないでしょうか。

さて、もちろん私もこの業界にいる限り避けては通れない存在です。
ARM Core CPUを販売しているメーカーのひとつにSTMicroがあります。STM32シリーズは価格が安く機能が充実しているものが多いので重宝されます。
今回はこのSTM32系の開発環境を構築していく手順をまとめます。

今回使用したものは、STMicro社のNucleo-F030R8ボードです。
評価ボードなので、ICEもついてて非常に使いやすいです。
秋月で1500円くらいで売ってます。
搭載されてるCPUはSTM32030R8T6で、STM32F0xシリーズに分類されます。

この記事では上記のボード、CPUを前提に進めますがそれ以外のものでも基本大丈夫なはずです。
少々手を加える必要はありますが。

STMicroが提供しているライブラリは現時点で2種類

Standard Peripheral Driver(通称SPD)
Hardware Abstraction Layer(通称HAL)
があります。
SPDの方が最初に提供されていたライブラリなのですが、後にHALが登場。
なのでネットなどを調べてもSPDを用いたものと、HALを用いたものでは出てくる量が全然違います。特に日本語(
しかし、STMicroは今後HALを推し進めていくようです。
さらには、一部評価ボードなどではもうSPDで操作できない部分もあるようで完全に切り捨てるようですね(
SPDとHALは互換性もないので、楽してSPDを使うと今後使えなくなった時にキッツイので。。。
なのでHALを使うことを目標に環境を立ち上げます。

色々と試行錯誤の末デバッグ環境までこぎつけた感じなので、もしかしたらいらない工程が含まれてるかもしれません。
とりあえず、現時点での私の環境をそのまま再現する手順を書きました。
これいらなかったとかアレばコメントなどください。

System Workbench for STM32のインストール

今回使うIDEEclipseベースで作られた、System Workbench for STM32(以後、SW4STM32)を使います。
こちらはSTM32系の開発に必要なHAL Driverなどが含まれているので、まっさらなEclipseから構築するより楽です。

こちらのサイトへアクセスし、インストールファイルをDLしてください。
http://www.openstm32.org/HomePage

ユーザー登録が必要になりますのでご注意ください。

Eclipseプラグイン各種追加

SW4STM32のインストールが完了したら、早速起動します。
起動したらプラグインの導入に入ります。

Help -> Install New Software…を選択。
開いた窓でAdd…をクリック。
Add Repositoryダイアログが開くので、ここで追加するプラグインを指定します。
今回導入するプラグインは2種類です。
ここまでの手順は同じなので割愛して解説します。

GNU ARM Eclipse Plug-ins

さきほど開いたダイアログに

Name     : GNU ARM Eclipse Plug-ins
Location : http://gnuarmeclipse.sourceforge.net/updates

と入力。
該当したもの全てにチェックを入れて追加してください。

CubeMX

CubeMXとは、STMicroが提供するコードジェネレーターです。
CPUやボードの種類を選択して、各種GPIOやPeripheral Moduleの設定などを視覚的に行えます。
なくても問題なく書けますが、あると便利なので追加しました。
こちらのリンクからEclipseプラグインのzipファイルをDLしてください。
STM32CubeMX – STM32Cube initialization code generator – STMicroelectronics

DLしたら先ほど開いたダイアログで

Name     : STM32CubeMX(任意)
Location : Archive...ボタンをクリックし、DLしたzipファイルを選択

これでSW4STM32からCubeMXを呼び出せます。

ツールチェインのインストール

ARM用のコンパイラアセンブラ、リンカなどが含まれてます。
こちらからインストーラーをDLしてください。
GNU Arm Embedded Toolchain project files : GNU Arm Embedded Toolchain
なおWin32しかないです。64bitマシンでの動作は試してませんのでどうなるかわかりません(
DLしたらインストーラ起動、特に指定するものはありません。
ただ、インストール先のディレクトリは指定したほうがいいかもしれません。
デフォルトでもいけますが、スペースが間に入ったり、パスが長くなったりしますので。
特にWindowsだと260文字制限もありますし。なるべく浅めの階層で短いディレクトリネームにして作っておくほうが事故が少なく済みます。

ビルドツールのインストール

make、rmなどです。
こちらからインストーラーをDL。
Releases · xpack-dev-tools/windows-build-tools-xpack · GitHub
DLした後は先程のツールチェインと同様です。
こちらには64bit対応したものがあります。組み合わせによる不具合などは検証してません。

OpenOCDのインストール

OpenOCDとはGDBサーバーとプログラマの機能を持ったものです。
こちらからDLしてインストールしてください。
Releases · ilg-archived/openocd · GitHub
こちらもツールチェイン同様です。

ST-LINKとはSTMicro社が出しているICEです。
評価ボードに搭載されているICEもこれと同様のものなので、デバッガーを動かすために色々準備しましょう。
こちらのページから色々DLしてつっこみます。
ST-LINK/V2 – ST-LINK/V2 in-circuit debugger/programmer for STM8 and STM32 – STMicroelectronics
STM32 ST-LINK utility
 ST-LINKを使ってbinファイルを書き込んだりするソフトです。
ST-LINK/V2 firmware upgrade
 読んでそのまま、ST-LINKのファームウェアアップデートに使います。
ST-Link, ST-Link/V2, ST-Link/V2-1 USB driver signed for XP, Windows7, Windows8
 ST-LINKのドライバです。

OpenOCDの設定

メニューバーのRun -> External Tools -> External Tools Configurations…を選択。
左側ツリーのProgramを選択し、更に左上にある白紙のマーク、Newをクリック。
各種設定を記述します。

Name      : OpenOCD(Nucleo F0)

Mainタブから

Location          : ${openocd_path}\${openocd_executable}
Working Directory : ${openocd_path}\..\scripts
Arguments         : -s "${openocd_path}\..\scripts" -f board/st_nucleo_f0.cfg

board/st_nucleo_f0.cfgの部分は、使用するCPUやボードによって変更してください。
OpenOCDのインストールディレクトリ/scriptの中にある該当するパスを記述してください。
ST-Link V2でデバッグする場合は

interface/stlink-v2.cfg

を指定します。

  • fコマンドは付け忘れないように。
-s "${openocd_path}\..\scripts" -f interface/stlink-v2.cfg -f target/stm32f1x.cfg

Buildタブから
Build before launchのチェックを外す

Commonタブから
Display in favorites menuのExternal Toolsにチェックを入れる

Applyで設定を適用する

次にString Substitution(ストリング置換)の記述を確認する。
Window -> PreferencesからPreferencesダイアログを表示
以下の2つがあるかを確認する。なければNew…から追加する。

Variable           : Value
openocd_executable : openocd.exe
openocd_path       : {OpenOCDのインストールディレクトリパス}/bin

とりあえず開発環境の構築まではできあがりました。
ここからはプロジェクトの作成にはいります。

CubeMXからプロジェクトを作成する

メニューバーのWindow -> Show View -> Otherを選択。
ツリー内、Otherの中にCubeMXがあるので、コレを選択してCubeMXを起動。
使用するCPU、またはボードを選択してPeripheralの設定を済ませます。
設定が済んだらCode Generateでプロジェクトを生成します。
CubeMXの使い方はここでは詳しく触れません。メンドクサイ比較的わかりやすいので。

SW4STM32のプロジェクトに追加する

SW4STM32にもどり、File -> Importを選択。
ツリー内、General -> Existing Projects into Workspaceを選択してNext。
Select root directory;に先ほど生成したプロジェクトディレクトリを指定。
すべて選択してFinishをクリック。
これでプロジェクトが追加されました。

デバッグする

Run -> Debug Configurationsを選択。
左側ツリーのAc6 STM32 Debuggingを選択。
Newから新規作成。
Nameなどは初期のままでOK。
変更する箇所はStartupタブのInitialization Commandsのテキストボックス内を編集

monitor reset
monitor halt
monitor flash protect 0 0 11 off

これを使えばデバッグ作業が可能になります。

トラブルシューティング

Program “arm-none-eabi-gcc” not found in PATHというエラーが出る

Projectツリーからプロジェクトを選択して右クリック。Propertiesを選択。
C/C++ Build -> SettingsからTool Settingsタブを選択。
ツリーからMCU Settingsを選択し、Pathを

{ツールチェインのインストールディレクトリ}/bin

にする。

Error: jtag status contains invalid mode value でデバッガが止まる

こんなメッセージを出してデバッガが応答しなくなることがある。

Error: jtag status contains invalid mode value - communication failure
Polling target stm32f1x.cpu failed, GDB will be halted. Polling again in 100ms

入力ピンに内部・外部のプルアップ・プルダウン抵抗がついておらず、開放状態になってないか確認。
ハイインピーダンス状態になっていて、消費電流が極端に上がっている可能性があります。

導入方法は以上になります。
HALの使い方を勉強していかなきゃなぁ。。。
過去のものが使えないというのは大変。頑張りますかぁ。。。