STM32F4 Discovery を Eclipse で開発

テーマ:
STM32F4 Discovery の開発を Atollic TrueSTUDIO for STM32F4 無償版で行っていたが、他の ARM の版と一緒になったことでこの版がなくなるという。残る無償版はサイズ制限があるか期間制限があるものだけ。STM32F4 の無償版は機能が若干制限されているものの、サイズ制限や期間制限がなかったのでありがたく使わせてもらっていたんだが、どうやら使えなくなりそう。
ということで、Eclipse で開発環境を揃えられないかと探してみると、なんとかなりそうなので構築することにした。

参考にしたサイト
マイコン徹底入門
ねむいさんのぶろぐ
・その他

必要なもの
・Eclipse CDT ( C/C++ Development Tools )
・CodeSourcery
・ARM GCC Toolchain
・Zylin Embedded CDT
・Atollic TrueSTUDIO for STM32F4 に同梱の ST-LINK gdb Server

インストール
1) まずは、下記のページから Eclipse CDT をインストール
http://www.eclipse.org/downloads/

2) CodeSourcery は下記のMenter Graphics 社のサイトの"Download the EABI Release"からダウンロードしてインストール
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/

3) Zylin Embedded CDT は、Eclipse の[Help]-[Install New Software]で下記のサイトを指定してインストール。
http://opensource.zylin.com/zylincdt

4) ARM GCC Toolchain も同様に下記のサイトを指定してインストール。
http://gnuarmeclipse.sourceforge.net/updates

プロジェクトの生成
1) [File]-[New]-[C Project] で C Project ウィンドウを表示。

2) 設定はそれぞれ下記のようにする。
[Project name] 適当に付ける。
[Project type] で [ARM Cross Target Application] [Empty Project] を選択。
[Toolchains] で [ARM Windows GCC (Sourcery G++ Linte )] を選択。

プロジェクトの設定
1) Atollic TrueSTUDIO で作製した SMT32F4 のソースファイルをコピペする。
このとき、アセンブラファイルの拡張子's'は大文字'S'に変更する。

2) プロジェクトの[Propertis] で [C/C++ General]-[Path and Symbols] を設定する。
・CMSIS や STM32F4 のドライバライブラリなどのパスを設定。
・これらのライブラリを使うため、下記のシンボルを設定。
HSE_VALUE 80000000
STM32F4XX
USE_STDPERIPH_DRIVER
USE_STM32F4_DISCOVERY

3) リンカスクリプトファイルを指定する。
プロジェクトの[Propertis]-[C/C++ Build]-[Settings] [Tool Settings]タブを選択して下記のように設定。
[ARM Sourcery Windows GCC C++ Linker]-[General] の [Script File] に "stm32_flash.ld" を指定する。

4) sprintf() 関数が使いたいので、sbrk() とかを何とかする。
ここからダウンロードした中からsyscalls.c と syscalls_if.h を拝借し、ソースに追加する。(システムに合わせて、若干の修正が必要)

5) STM32F4 はfloatのコプロを持っているので浮動小数点を使えるようにする。
プロジェクトの[Propertis]-[C/C++ Build]-[Settings] [Tool Settings]タブを選択して下記のように設定。
・[ARM Sourcery Windows GCC C Linker]-[Librarys] 内の[Libraries (-l)]に 'm' を追加。
・[Target Processor]内で下記のように設定。
[Float ABI] で [Library with FP (-mfloat-abi=softfp)]を選択。
[FPU Type] で [FPv4-SP-D16 (-mfpu=fpv4-sp-d16)] を選択。


ST-LINK gdb Server を起動できるようにする。
[Run]-[External Tools]-[External Tools Configuration] で下記のように設定する。

[Name] 欄に "ST-LINK gdb Server"

[Location] 欄に Atollic の ST-LINK_gdbserver.exe
(例えば、"C:\Program Files\Atollic\TrueSTUDIO for STMicroelectronics STM32 Lite 2.2.0\Servers\ST-LINK_gdbserver\ST-LINK_gdbserver.exe"など)

[Working Directory] に同ディレクトリ

[Arguments] に "-e -d" を指定。
( "-d" が無いと動かない。これが判らず半日ほど悩む。ちょっと挫折しかけた。)

これで [Run]-[External Tools]-[ST-LINK gdb Server] で起動できるようになる。
デバッグする場合は、この事前にこのコマンドを実行してサーバ起動しておく必要がある。


デバッグコンフィギュレーションの作製

1) [Run]-[Debug Configurations] で Debug Configurations ウィンドウを開く。

2) デバッグコンフィギュレーションを生成する。
[Zylin Embedded debug (Native)] を選択し、左上のボタン[New launch configuration] をクリックして生成。

3) デバッグコンフィギュレーションを設定する。

[Name]に "Load and Debug" と入力する。

[Main] タブを下記のように設定。
[Project] の[Browse]ボタンを押してプロジェクトを指定。
[C/C++ Application] には "Debug/foo.elf" を設定。

[Debugger] タブは下記のように設定。
[Debugger] に [Embedded GDB] を選択。
[GDB debugger] に下記を入力。
"C:\Program Files\CodeSourcery\Sourcery_CodeBench_Lite_for_ARM_EABI\bin\arm-none-eabi-gdb.exe"
[GDB commad file] は空にする。
[GDB command set] に [Standard] を選択。
[Protocol] に [mi] を選択。

[Command] タブには下記のように設定。
['Initialize' commands] に下記を入力。
target remote localhost:61234
load
monitor reset init
thbreak main
['Run' commands] に下記を入力。
continue

これで、オブジェクトをロードしてデバッグできるようになる。
同様にして、['Initialize' commands]欄から load を削除したものを作製しておくと、ロードせずにデバッグができるようになる。

とりあえず、これでコンパイル、ダウンロード、デバッグが一通りできるようになった。
TrueSTUDIO では、ブレークポイントが1つしか設定できなかったが、複数設定できるようになったのは思わぬ収穫。

後書き:
Atollic TrueSTUDIO がサイズ制限なしで無償で使用できたのでSTM32F4を使ってシステムを開発していたんだけど、開発途中で使えなくなるとのアナウンスがあり、急遽 Eclipse での開発を模索した。丸2日ほどを費やしたが、Eclipse や ARM、その関連ツールなどについてほとんど知らなかった私でも何とか使えるようにできた。知っている人なら多分半日もあればできるんだろうな。

あと、原因は不明だが、30KB ほどの大きなconstテーブルを関数内に入れていたら、その関数内でHard_Error になってしまう。Hard_Error になる部分が、たまたま vsprintf() を呼び出すあたりだったので、printf 系の処理がうまくいってないのかと悩んだけど、どうも関係無いようだ。テーブルを関数外に置いたらあっさり解決。まだ、ARM は良く判ってない。
AD