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 LinuxSolitonwaveで取り扱われている。 千石電商で店頭販売されていたこともあったが、今はあるかどうか... もちろんここに無いボードを使用することも可能。各自の開発環境に合わせて読み進めること。

ここでは、JTAGコネクタとしてARM-USB-TINYを、ターゲットボードとしてSTM32-P103およびSTM32-H103を使用する。

ソフトウェア

Eclipse + CDT (IDE)

EclipseダウンロードページEclipse + CDTをダウンロードする。

SourceryG++ Lite(GCC toolchain)

CodeSourceryLite ARM版をダウンロードする。

OpenOCD

OpenOCDダウンロードサイトからダウンロードする。

JTAGコネクタドライバ

JTAGコネクタに付属しているものを使用。ただ、ARM-USB-TINY付属CDのドライバは、旧式の開発環境を強制インストールされてしまう。 それが嫌なので ここにドライバだけを置いておく。 (付属CDについているものと全く同じもの)

STM32F10x_StdPeriph_Lib

ファイルリストから、STM32F10xStdPeriph_Libをダウンロードする。


OpenOCDの導入

JTAGでマイコンとやり取りするための窓口、OpenOCDを導入する。

OpenOCD本体インストール

ダウンロードしたインストーラを実行。なるべく日本語、空白文字を含まない場所にインストールすること。

OpenOCDディレクトリ

ドライバインストール

ドライバファイルを解凍した状態で、ARM-USB-TINYをUSBへ接続する。 ドライバをインストールせよというダイアログが出たら、「特定の場所からインストールする」を選択。 ドライバファイルのあるフォルダを指定すればインストールが始まる。 2~3回同じことを行えば使用可能になる。

ARM-USB-TINY用ドライバ

設定ファイル作成

ターゲットデバイス用の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++ Litebinディレクトリを追加してある。

環境変数追加

アセンブラの設定

アセンブラのコマンドを指定する。 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という実行形式が付属するので、これを使用するよう設定すれば治りました。

参考文献

  1. OpenOCDが動くまで
  2. OpenOCDのTcl
  3. Stm32.cfgを読む
  4. ARM-USB-TINY+STM32-P/H103用OpenOCD設定ファイル
  5. GCCオプション
  6. GCCリンカオプション
  7. リンカldオプション
  8. Eclipse GalileoでのJTAGデバッグ
個人用ツール