ARM開発環境構築手順
出典: Wikimura
目次 |
使用機器・ソフトウェア
- ARM-USB-TINY: Olimex社のJTAGケーブル
- STM32-P103: Olimex社のSTM32F103RBT6マイコン搭載ボード(周辺回路あり)
- STM32-H103: Olimex社のSTM32F103RBT6マイコン搭載ボード(周辺回路なし)
- OpenOCD: JTAGデーモン
- OpenOCDドライバ: JTAGケーブル用ドライバ
- Eclipse + CDT: EclipseとC/C++開発ツール
- SourceryG++ Lite: ビルド済みCortex-M3対応GCCツールチェイン
- STM32F10x_StdPeriph_Lib: STM32用ペリフェラルライブラリ
入手
ハードウェア
ARMマイコンボード・JTAGコネクタは、Strawberry LinuxやSolitonwaveで取り扱われている。 千石電商で店頭販売されていたこともあったが、今はあるかどうか... もちろんここに無いボードを使用することも可能。各自の開発環境に合わせて読み進めること。
ここでは、JTAGコネクタとしてARM-USB-TINYを、ターゲットボードとしてSTM32-P103およびSTM32-H103を使用する。
ソフトウェア
Eclipse + CDT (IDE)
EclipseダウンロードページのEclipse + CDTをダウンロードする。
SourceryG++ Lite(GCC toolchain)
CodeSourceryのLite ARM版をダウンロードする。
OpenOCD
OpenOCDダウンロードサイトからダウンロードする。
JTAGコネクタドライバ
JTAGコネクタに付属しているものを使用。ただ、ARM-USB-TINY付属CDのドライバは、旧式の開発環境を強制インストールされてしまう。 それが嫌なので ここにドライバだけを置いておく。 (付属CDについているものと全く同じもの)
STM32F10x_StdPeriph_Lib
ファイルリストから、STM32F10xStdPeriph_Libをダウンロードする。
OpenOCDの導入
JTAGでマイコンとやり取りするための窓口、OpenOCDを導入する。
OpenOCD本体インストール
ダウンロードしたインストーラを実行。なるべく日本語、空白文字を含まない場所にインストールすること。
ドライバインストール
ドライバファイルを解凍した状態で、ARM-USB-TINYをUSBへ接続する。 ドライバをインストールせよというダイアログが出たら、「特定の場所からインストールする」を選択。 ドライバファイルのあるフォルダを指定すればインストールが始まる。 2~3回同じことを行えば使用可能になる。
設定ファイル作成
ターゲットデバイス用のJTAG設定ファイルを用意する。詳しくは、「OpenOCDが動くまで」「Stm32.cfgを読む」「OpenOCDのTcl」などを参照されたい。なお、ARM-USB-TINYとSTM32-P/H103の組み合わせで動作する設定ファイルを用意した(→ARM-USB-TINY+STM32-P/H103用OpenOCD設定ファイル)同じ構成であれば、そのまま使うことが可能である。
動作確認
STM32-P/H103対応LED点滅プログラムをダウンロードして、どこかに解凍する。 これを使用してOpenOCDの動作確認を行う。
OpenOCDデーモン起動
OpenOCDはバックグラウンドで動くデーモン(サーバとかサービスとも)である。 OpenOCDはコマンドプロンプトから起動する。 起動する際、設定ファイルを「-f」オプションで指定する。ファイルは絶対パス・相対パスで指定する。 今回はOpenOCD.exeと同じディレクトリにopenocd.cfgを置いたが、これと異なる場合は適宜変更すること。
起動したらそのコマンドプロンプト上で動き続けるので、以降の操作は別のコマンドプロンプトから行う。
>openocd -f openocd.cfg Open On-Chip Debugger 0.1.0 (2009-01-21-21:15) Release BUGS? Read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS $URL: https://kc8apf@svn.berlios.de/svnroot/repos/openocd/tags/openocd-0.1.0/src/openocd.c $ jtag_speed: 1 500 kHz Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (Manufacturer: 0x23b, Part: 0xba00, Version: 0x3) Info : JTAG Tap/device matched Info : JTAG tap: stm32.bs tap/device found: 0x16410041 (Manufacturer: 0x020, Part: 0x6410, Version: 0x1) Info : JTAG Tap/device matched Warn : no tcl port specified, using default port 6666
書き込み&実行テスト
デーモンを実行しているのとは別のコマンドプロンプトを開く。プロンプトからtelnet localhost 4444を実行することで、OpenOCDにコマンドを送れるようになる。 4444番ポートは設定ファイルで指定した値なので、別の値にした場合は変えること。
OpenOCDが開けたら、haltコマンドでマイコンを停止状態にする。 続いてflash write_imageコマンドでデータを書き込む。なお、ファイル名は相対パス、フルパスどちらでも良いが、今回はカレントディレクトリにあった場合を示しており、ファイル名だけで指定できている。
書き込み後はresetでリセットをかけ、resumeで停止状態を解除し実行状態にすることで、LEDの点滅が確認できる。 OpenOCDとの通信を切断する場合は、shutdownコマンドを実行する。
telnet localhost 4444 Open On-Chip Debugger > halt > flash write_image erase blink.elf 0x0 auto erase enabled device id = 0x20036410 flash size = 128kbytes Padding image section 0 with 0 bytes wrote 11008 byte from file blink.elf in 2.437500s (4.410256 kb/s) > reset JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (Manufacturer: 0x23b, Part: 0xb a00, Version: 0x3) JTAG Tap/device matched JTAG tap: stm32.bs tap/device found: 0x16410041 (Manufacturer: 0x020, Part: 0x64 10, Version: 0x1) JTAG Tap/device matched target state: halted target halted due to breakpoint, current mode: Thread xPSR: 0x21000000 pc: 0x08000530 > resume > shutdown
Eclipseの導入
Eclipseではプロジェクトごとにツールチェインの設定を行うため、ここではEclipse全体として設定すべきことを取り扱う。
Eclipse + CDTのインストール
なるべく日本語、空白文字を含まない場所にインストールする。 必要ならアップデートを行う。
GCCツールチェインのインストール
なるべく日本語、空白文字を含まない場所にSourceryG++をインストールする。 パスはここでは設定しなくても良い。(Cygwinが必要ならインストールしておくこと)
OpenOCDとの連携設定と確認
OpenOCDデーモンをEclipseから起動できるようにする。 External ToolsからOpenOCDを起動するためのコマンドを指定する。 LocationにはOpenOCDの実行ファイルへのフルパスを設定する。 ArgumentsにはOpenOCDに設定ファイルを渡すために、「-f 設定ファイルのフルパス」を設定する。 フルパスを引数で渡す際は、ダブルクォーテーションで囲むこと。
Eclipse Galileo CDTの場合
このページを書いた段階ではGanymedeというバージョンだったが、一月ほど前にGalileoがリリースされた。 Galileoも同様に設定できるが、組み込み用デバッガ[Zylin embedded debug]が標準で付いてこないらしい。 インストール方法は[8]に載っていた。
- Eclipseの[Help]->[Install New Software..]を開く
- [type or select a site]に[1]を入力して[Add]ボタンを押す
- リストに表示されるソフトウェアをインストールする
個別プロジェクトのツールチェイン設定
ここでは、Cygwin系のツールチェインであるSourcery G++ Liteの設定を示す。 プロジェクトごとの設定は、プロジェクトプロパティを開いて行う。
環境変数の設定
以降のツールチェイン指定でフルパスを入力したくない場合、ここで環境変数を設定すると良い。 環境変数PATHに、先にインストールしたSourcery G++ Liteのbinディレクトリを追加してある。
アセンブラの設定
アセンブラのコマンドを指定する。 Sourcery G++ Liteの場合、arm-none-eabi-acを設定する。 PATHを通していない場合は、フルパスを指定すること。 他に設定すべきことは特にない。 アセンブラオプションを指定したい場合は、下図のGCC Assembler以下のGeneralにオプションを追加する。
コンパイラの設定
まずC/C++コンパイラのコマンドを指定する。 Sourcery G++ Liteの場合、arm-none-eabi-gccを設定する。 PATHを通していない場合は、フルパスを指定すること。
次に、オプションを指定する。 必須なのは以下の3つ。オプションリストのCompiler以下にあるGeneralに以下の3つを記述する。
| オプション | 効果 | -c | コンパイルのみ行う(ここではリンクを行わないため) | -mcpu=cortex-m3 | ARM系のオプション。ターゲットがCortex-M3であることを示す。 | -mthumb | 出力命令セットの指定。Cortex-M3はThumb命令セットしか使えないため必須らしい。 |
|---|
後は、最適化オプション( -O0,-O1,..)や、デバッグ情報(-g, -g1,..)、インクルードディレクトリの追加などを適宜行う。
リンカの設定
リンカのコマンドを指定する。 Sourcery G++ Liteの場合、arm-none-eabi-gccを設定する。 PATHを通していない場合は、フルパスを指定すること。 (リンカにldではなくgccを指定したのは、-Xlinkerオプションが用意されていたため)
まず、スタートアップファイルは自分で用意するため、-nostartfilesを指定する。 これはLinker以下のGeneralで指定する。
次に、リンカに渡すオプションを指定する。gccには、対応するリンカであるldに「オプションを渡すための-Xlinkerオプション」がある。 Linker以下のMiscellaneousに、-Xlinker用オプションを指定するリストがある。 下図では、リンカに2つのオプションを渡すために、3つの-Xlinkerオプションを指定している。
- --script="リンカスクリプトへのフルパス"
- -Map
- "配置結果(マップファイル)保存先のフルパス"
結果として、「--script="リンカスクリプトへのフルパス" -Map "配置結果(マップファイル)保存先のフルパス"」というオプションがリンカldに与えられる。
-Xlinkerオプションでは、空白で区切られたトークンが「オプションとその引数」であろうと、別々に-Xlinkerで指定しなくてはならない。
そのため、上記のような変な指定の仕方になっている。
このオプションにより、リンカスクリプトの指定と、リンカの配置結果ファイルの保存先を指定している。
LED点滅プログラムでビルドのテスト
上記の設定を確認するための「 LED点滅プログラム」を用意した。 ダウンロードし、プロジェクト内にファイルをコピーする。 正しく設定すればビルドが行われ、以下のようになる。(実行形式がtest2.exeなのは、もともとtest2というプロジェクト名だったため。それにしてもexeが拡張子なのは...)
デバッガの設定
新しくデバッグコンフィギュレーションを作る。
実行ファイル指定
デバッグする実行ファイルを指定する。
デバッガ指定
使用するデバッガを指定し、オプションを設定する。
起動時のコマンドを設定
OpenOCDに3333番ポートで接続し、JTAG操作コマンドを送る。 OpenOCDへのコマンドには、全てmonitorをつける。 なお、thbreakはGDBコマンド(一時ハードウェアブレークポイントを設定)なので、monitorはつかない。
通常のデバッグ用に以下のコマンドを設定した。
target remote localhost:3333 | OpenOCDへ接続 monitor halt | マイコン停止(OpenOCDコマンド) monitor reset | マイコンリセット(OpenOCDコマンド) thbreak main | 一時ハードウェアブレークポイントをmainへ設定 monitor resume | マイコン再開(OpenOCDコマンド)
書き込んでからデバッグするために、以下のコマンドを設定した。
target remote localhost:3333 | OpenOCDへ接続
monitor halt | マイコン停止(OpenOCDコマンド)
monitor flash write_image erase "書き込むイメージへのフルパス" 0x0
| Flash書き込み(OpenOCDコマンド)
monitor reset | マイコンリセット(OpenOCDコマンド)
thbreak main | 一時ハードウェアブレークポイントをmainへ設定
monitor resume | マイコン再開(OpenOCDコマンド)
デバッグテスト
デバイスを接続し、External ToolsからOpenOCDデーモンを起動した状態でデバッガを起動する。 設定がうまくいけばコンソールに以下のような経過が表示され、mainで停止する。
target remote localhost:3333 main () at ../main.c:45 45 RCC_Configuration(); monitor halt monitor reset JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (Manufacturer: 0x23b, Part: 0xba00, Version: 0x3) JTAG Tap/device matched JTAG tap: stm32.bs tap/device found: 0x16410041 (Manufacturer: 0x020, Part: 0x6410, Version: 0x1) JTAG Tap/device matched target state: halted target halted due to single-step, current mode: Thread xPSR: 0x61000000 pc: 0x080003f0 thbreak main Hardware assisted breakpoint 1 at 0x80003f0: file ../main.c, line 45. monitor resume target state: halted target halted due to breakpoint, current mode: Thread xPSR: 0x61000000 pc: 0x080003f0
まとめ
OpenOCDは独立したツールであり、OpenOCD本体とドライバをインストールすることでJTAGが操作できるようになる。 OpenOCDでJTAGを操作するには、ターゲット用設定ファイルを正しく設定する必要がある。 OpenOCDはデーモンとして機能する。Telnetでlocalhost:4444へ接続し、OpenOCDを操作する。 GDBとはlocalhost:3333で接続する。 Eclipseとの連携は、External Toolsで行う。
Eclipse+CDTはC/C++開発環境の外側だけを提供する。 GCCツールチェインを指定することで、具体的な機能を実現する仕組みになっている。 この設定はプロジェクトごとに行う。
プログラムのデバッグを行うためには、Debug Configurationの設定が必要となる。 デバッガの指定、起動時のコマンド設定を行う。 起動時コマンドでOpenOCDのFlash書き込みコマンドを書けば、書き込み後にデバッグが可能となる。 Flash書き込みの有無でコンフィギュレーションを分ければ、無駄にFlashメモリの寿命を縮めずにすむ。
コメント
- メンバへ:質問・要望がありましたら、ここに箇条書きで書いてください。
- CygwinかMinGWが入っていないと動かないようです。私のPCではCygwinを入れていたので全く気付かなかったのですが...それについては今後調べます。とりあえず動かなかった方は、MinGWを持ってきてインストールしてください。それだけで動くようになるはずです。Cygwinの場合、makeやGCCが必要なのでしょうか。
- Eclipse Galileoにアップグレードできました。組み込み用デバッガは自分でインストールすることになっているようです。
- Cygwinの場合かどうかは不確かですが、標準のmakeだと「multiple target」がどうというエラーが起こるようです。これはドライブレターに付いているコロンがデリミタとして認識されてしまい、ターゲットが複数あるように見えてしまうことによるらしいです。Sourcery G++を使用している場合、cs-makeという実行形式が付属するので、これを使用するよう設定すれば治りました。

