EclipseでSTM32CubeF7のサンプルを動かす

# EclipseでSTM32CubeF7のサンプルを動かす

    Development Environment
    Date : 2016/01/10
    OS   : Windows 7 (32bit)
    IDE  : Eclipse 4.5 Mars (Pleiades All in One)
    Board: 32F746GDISCOVERY
    ICE  : None (OnBoard ST-LINK/V2-1)
    Cable: USB Mini-B


EclipseでSTM32CubeF7のサンプルをコンパイルできるようにします。

ボードの呼び方は幾つかあって、下記であればどれでも通じます。
32F746GDISCOVERY(正式名称: データシートの記述)
STM32F746G-DISCO(略称: STのWEBサイトの記述)
STM3746G-Discovery(略称: STM32CubeF7のディレクトリ名)
STM32F7 Discovery(商品名: パッケージの記述)
たくさんあってややこしいです。

<br />

## 環境を構築する

開発環境は、下記を参考にしてください。
[EclipseとOpenOCDでSTM32(ARM)マイコン開発](http://qiita.com/Ted-HM/items/760759b6b152230b48a8)

[ST-LINK Utility](http://www.st-japan.co.jp/web/jp/catalog/tools/PF258168)を追加で使用します。

<br />

## STM32CubeF7をダウンロードする

[STM32CubeF7](http://www.st-japan.co.jp/web/jp/catalog/tools/PF261909)
上記ページ最下部のサンプル＆購入にあるDownloadボタンから、ファイルをダウンロードできます。
サンプル＆購入(英語ページだとOrder From ST)と書かれてますが、ボードとかMCU向けの表記をソフトウェアのページにも流用しているためで、非常に違和感があります。
初めてダウンロードするときには「購入？金かかるの？」と戸惑ったものです。
気にせずダウンロードしてください。

ダウンロードができたら、`C:\dev\ARM\sample`に展開します。
バージョンに違いがあってもフォルダ構造は変わらないと思います。

    C:\dev\ARM\Sample\stm32cubef1
    └─STM32Cube_FW_F7_V1.3.0
        ├─_htmresc
        ├─Documentation
        ├─Drivers
        ├─Middlewares
        ├─Projects
        └─Utilities


<br />

## デバッガのファームウェアを更新する

STM32F7 Discoveryには、オンボードでST-LINK/V2-1というデバッガが搭載されています。
しかし、そのデバッガのファームが古い場合は、外部フラッシュへの書き込みなどの機能が使えない場合があります。
まずは、最新のファームを導入して、環境を整えておきましょう。

ST-LINK Utilityを起動します。

`ST-LINK Utility: メニュー => ST-LINK => Firmware update`
`ST-LINK Upgrade: Device Connect`

バージョン番号を確認し、更新するファームの方が数字が新しいことを確認します。
問題がなければ更新を行います。

`ST-LINK Upgrade: Yes>>>>`

これでデバッガのファームが最新になりました。

<br />

## 本体のファームウェアを更新する

STM32CubeF7には、STM32F7 Discovery用のファームウェアのバイナリが用意されています。
もともと搭載されているファームの最新バージョンとなります。
せっかくなので、実機に書き込んでみましょう。

`C:\dev\ARM\Sample\stm32cubef7\STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\Demonstration\`

readme.txtの最後の方にファームの更新方法が記述されています。
ST-LINK UtilityのV3.7以降で、External loaderから`N25Q128A_STM32F746G-DISCO`を追加します。
あとは、`Binaries/STM32746G-DISCO_Demo_V1.1.0.hex`を開いて、書き込みを行えば、ファームウェアの更新が行えます。

実機のsystem infoを開くと、Firm. VerがV1.1.0となっているのが確認できると思います。

<br />

## プロジェクトにサンプルをポーティングする

### Eclipseのプロジェクトを作成する

まずはプロジェクトを追加します。
メニューもしくは右クリックからC/C++プロジェクトを追加します。

`Eclipse: メニュー => ファイル => 新規 => C プロジェクト`

プロジェクト名(任意)を入力し、タイプを選択します。

    Project Name: f7_sample
    Project Type: STM32F7xx C/C++ Project
    Toolchain   : Cross ARM GCC


`次へ`

C プロジェクト(Target processor settings)
コンパイラとリンカの設定に関連してきます。
コンパイラとリンカのページで設定し直せるのであまり重要ではありません。
ひとまず下記のように設定しておきます。
他のページはデフォルトでかまいません。

    Chip family           : STM32F746xx
    Flash size(KB)        : 1024
    External clock(Hz)    : 8000000
    Contents              : Empty (add your own content)
    Use system calls      : Freestanding (no POSIX system calls)
    Trace output          : None (no trace output)
    Check some warnings   : checked
    Check most warnings   : unchecked
    Enable-Werror         : unchecked
    Use -Og on debug      : checked
    Use newlib nano       : checked
    Exclude unused        : checked
    Use link optimizations: unchecked


`次へ`

プロジェクトが作成されたら、プロジェクト・エクスプローラー上から余計なファイルを全て削除します。
具体的には、インクルードファイル以外の項目全てとなります。
フォルダのアイコンがついてる項目は全てです。
src, system, include, ldscriptsのフォルダを削除してしまいます。

### プロジェクトへコピーする

Eclipseにファイルを追加する方法は幾つかあります。

まずはSW4STM32のプロジェクトを直接インポートする方法。
(TrueSTUDIOのプロジェクトもEclipseベースなので同様にインポートできます。)

`Eclipse: メニュー => ファイル => インポート`
`インポート: 一般 => 既存プロジェクトをワークスペースへ`

上記操作でもファイルは追加されますが、ごちゃごちゃして分かりにくいです。
なので、この方法は使いません。

次に、インポートでローカルファイルを直接追加する方法。

`Eclipse: メニュー => ファイル => インポート`
`インポート: 一般 => ファイル・システム`

上記の操作で、追加するファイルにチェックをつけていきますが、
これまた量が多くて、ポチポチするのがめんどくさいです。
なので、この方法も使いません。

最も手っ取り早いのはEclipseのプロジェクト・エクスプローラー上に直接フォルダとファイルをコピーしてしまう方法です。
使用するCubeF7のサンプルは下記を使いますが、他のサンプルでもほぼ同じ方法で行えます。

`C:\dev\ARM\Sample\stm32cubef7\STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\Applications\Display\LTDC_PicturesFromSDCard`

ではまず、Windowsのエクスプローラー上でInc, Srcフォルダをコピーします。
そのままEclipseのプロジェクト・エクスプローラー上のf7_sampleプロジェクト内に貼り付けを行います。
パスの設定も行う必要がありますが、後述します。

スタートアップ用のアセンブラコード(\*.s)とリンカスクリプト(\*.ld)のファイルもコピペします。
これらはf7_sample直下でかまいません。
SW4STM32\startup_stm32f746xx.s
SW4STM32\STM32F7-DISCO\STM32F746NGHx_FLASH.ld
更に\*.sは\*.asmとファイル名を変更してください。
(*.sファイルではEclipseが生成するmakefileに追加されないようです。)

    f7_sample
    ├─インクルード
    ├─Inc
    ├─Src
    ├─startup_stm32f746xx.asm
    └─STM32F746NGHx_FLASH.ld


次に、各種ライブラリをコピペします。

`C:\dev\ARM\Sample\stm32cubef7\STM32Cube_FW_F7_V1.3.0`

Drivers, Middlewares, Utilitiesをコピーして、f7_sampleプロジェクトへ貼り付けます。

    f7_sample
    ├─インクルード
    ├─Drivers
    ├─Inc
    ├─Middlewares
    ├─Src
    └─Utilities



### 不要ファイルの削除

使わないものも多く含まれていますので、必要ないものを削除する必要があります。
SW4STM32のプロジェクトをテキストエディタで開けば必要なファイルなどが書かれています。

`C:\dev\ARM\Sample\stm32cubef7\STM32Cube_FW_F7_V1.3.0\Projects\STM32746G-Discovery\Applications\Display\LTDC_PicturesFromSDCard\SW4STM32\STM32746G-DISCOVERY`

`.cproject`
インクルードするヘッダーの場所やコンパイルオプションの指定などが記載されています。

`.project`
必要なソースなどが記載されています。

相対パスで記述されているので`../`ばかりで分かりにくいですが、先ほどコピペしたディレクトリのどれかとなります。
必要なファイルのみ残してほかは削除してしまってください。
まずは、ヘッダーで必要そうな箇所を残し、次にソースの方で詳しく見ていけばよいでしょう。
この作業はめんどくさいですが、最初だけです。
たぶん一時間くらいで終わると思うので頑張ってください。
*.h, *.c以外の*.htmlや*.chmなどは必要ないので全て削除可能です。

    f7_sample
    ├─インクルード
    ├─Drivers
    ├─Inc
    ├─Middlewares
    ├─Src
    └─Utilities

* Drivers/BSPフォルダ
BSP(Board Support Package)は、ボードの機能を簡単に使用するためのライブラリです。
下記は別ボード用なので削除してしまいます。
Adafruit_Shield
STM32756G_EVAL
STM32F7xx_Nucleo_144

* Drivers/BSP/Componentsフォルダ
ボードの機能を使用するためのコード群です。
他のボード用のコードも混じっていますが、残しておいて特に問題はありません。
邪魔なものを削除したいのであれば、下記以外を消せばいいでしょう。
Common
ft5336(タッチスクリーン)
n25q128a(フラッシュメモリ)
ov9655(カメラ)
wm8994(オーディオ)

* Drivers/CMSISフォルダ
CMSIS(Cortex Microcontroller Software Interface Standard)は、Cortex-Mファミリーのコアを簡単に制御できるようにしたライブラリです。
STM32F7-DISCOにはCortex-M7コアが搭載されているのでCMSISを使用できます。

* Drivers/CMSIS/Deviceフォルダ
テンプレートは今回は使用しません。
スタートアップコード(startup_stm32f746xx.s)は既に移動して名前を変えましたし、system_stm32f7xx.cもSrcに含まれています。
ですので、下記フォルダは削除してしまってください。
ST/STM32F7xx/Source

* Drivers/CMSIS/Documentationフォルダ
ドキュメントなので不要です。
削除してください。

* Drivers/CMSIS/DSP_Libフォルダ
固定小数点用のライブラリなので、今回は使用しません。
削除してください。

* Drivers/CMSIS/Includeフォルダ
不要なファイルもありますが、ヘッダーだけなのでひとまずそのままで大丈夫です。

* Drivers/CMSIS/Libフォルダ
固定小数点用のライブラリなので、今回は使用しません。
削除してください。

* Drivers/CMSIS/RTOSフォルダ
テンプレートしか含まれていないので削除します。

* Drivers/STM32F7xx_HAL_Driverフォルダ
テンプレートファイルが含まれています。
stm32f7xx_hal_conf_template.hは既にIncにstm32f7xx_hal_conf.hを持っているので、削除してしまいます。
Inc/stm32f7xx_hal_conf_template.h

stm32f7xx_hal_msp_template.cは該当するファイルがないので残しておきます。
Src/stm32f7xx_hal_msp_template.c

* Middlewaresフォルダ
今回のプロジェクトでは、SDカードからデータを読み出すためにFatFsのみ使用します。
それ以外は、Eclipse上でビルド除外設定を行い、コンパイルされないようにします。

STフォルダを右クリックして、`リソース構成 => ビルドから除外...`を選択します。
チェックして`OK`すれば除外設定を行えます。
逆にコンパイルに含める時は同様の手順でチェックを外します。

下記フォルダは除外します。
ST
Third_Party/FreeRTOS
Third_Party/LibJPEG
Third_Party/LwIP
Third_Party/PolarSSL

* Middlewares/Third_Party/FatFsフォルダ
そのままでは使えませんので、削除及び除外設定が必要です。
下記は削除してください。
doc
src/ffconf_template.h

下記は除外してください。
src/drivers/sdram_diskio.c
src/drivers/sram_diskio.c
src/drivers/usbh_diskio.c
src/option/cc932.c
src/option/cc936.c
src/option/cc949.c
src/option/cc950.c
src/option/ccbcs.c


* Utilitiesフォルダ
下記は削除してください。
Media
PC_Software

下記は除外してください。
CPU
Fonts/font12.c
Fonts/font16.c
Fonts/font20.c
Fonts/font24.c
Fonts/font8.c
Log

### プロジェクトのパスの設定

メニューからプロパティを開きます。
プロジェクトを右クリックしたコンテキストメニューからでも開けます。

`Eclipse: メニュー => プロパティ(Alt + Enter)`
`C/C++ 一般 => パスおよびシンボル`
`インクルードタブ`

もともとあったインクルード・ディレクトリの設定が残っているので全て削除してしまいます。
各言語毎(GNU C/GNU C++/アセンブリー)に設定があるので、それぞれで削除します。

続いて今回使用するディレクトリを指定していきます。
SW4STM32用の.cprojectファイルをテキストエディタで開いて参考にします。

追加ボタンを押して、すべての構成に追加、すべての言語に追加にチェックをつけます。
ファイルシステムから選択してもいいですが、めんどくさいので.cprojectファイルからコピペを推奨します。
相対パスとなるように設定します。

    Inc
    Drivers/CMSIS/Include
    Drivers/CMSIS/Device/ST/STM32F7xx/Include
    Drivers/STM32F7xx_HAL_Driver/Inc
    Drivers/BSP/STM32746G-Discovery
    Drivers/BSP/Components
    Middlewares/Third_Party/FatFs/src
    Middlewares/Third_Party/FatFs/src/drivers
    Utilities
    Utilities/fonts


`シンボルタブ`
つづいて、シンボルの設定を行います。
これも各言語毎に設定が必要ですので注意してください。

    DEBUG
    STM32F746xx
    USE_HAL_DRIVER
    USE_STM32746G_DISCOVERY


`ライブラリ`
`ライブラリ・パス`
今回は追加する必要はありません。

`ソース・ロケーション`
ソース場所の指定は、ルート直下のフォルダを指定するだけで済みます。
サブフォルダを個別に設定してしまうとややこしくなるので要注意です。

    /f_sample
    /f_sample/Src
    /f_sample/Drivers
    /f_sample/Middlewares
    /f_sample/Utilities


### コンパイル・リンカオプションの設定

`Eclipse: メニュー => プロパティ(Alt + Enter)`
`C/C++ ビルド => 設定`
`ツール設定タブ`

Target Processors
浮動小数点のオプションを変更します。

    ARM family : Cortex-M7
    Architecture : Toolchain default
    Instruction set : Thumb(-mthumb)
    Thumb interwork(-mthumb-interwork) : unchecked
    Endianness : Toolchain default
    Float ABI : Library with FP(softfp)
    FPU Type : fpv5-sp-d16
    Unaligned access : Toolchain default


最適化
最適化レベルはとりあえず「なし」にしておいたほうがいいです。
下記項目以外はチェックを外します。

    最適化レベル: なし(-O0)
    Message length(-fmessage-length=0): checked
    'char' is signed(-fsigned-char): checked
    Function sections(-ffunction-sections): checked
    Data sections(-fdata-sections): checked
    Assume freestanding environment(-ffreestanding): checked
    Disable loop invariant move(-fno-move-loop-invariants): checked


警告
下記項目以外はチェックを外します。
それでも警告(warning)はたくさんでてしまいます。
そんなものだと思っておきましょう。

    Enable all common warnings(-Wall)
    Enable extra warnings(-Wextra)


デバッグ

    デバッグ・レベル: 最大(-g3)
    Debug format: Toolchain default


Cross ARM C++ Linker
一般
前のリンカスクリプトの指定があるので削除してしまいます。
その後、ワークスペースからldファイルを追加します。
Debugフォルダに作成されるmakefileが起点となるため、相対パスの場合は`../`が必要です。

    "${workspace_loc:/${ProjName}/STM32F746NGHx_FLASH.ld}"
    または
    ../STM32F746NGHx_FLASH.ld


さらに下部にあるこのオプション以外のチェックを外します。

    Remove unused sections(-Xlinker --gc-sections): checked


その他
オプションのチェックを全て外し、記述を追加します。
このspecsを追加しないと、標準ライブラリのシステムコール関数が不足してエラーとなります。

    Other linker flags: --specs=nosys.specs --specs=nano.specs


これで準備は完了です。
`Ctrl + B`でコンパイルしてみてください。
エラーが出たらエラーメッセージをよく読んで、設定をもう一度見なおしてください。

Debugフォルダの下に、elfファイルとhexファイルができていたら成功です。

<br />

## 動かしてみる

### 表示する画像ファイルを用意する

microSDカードにMediaフォルダを作り、そこへbmpファイルを入れます。
下記フォルダにあるファイルであればなんでもいいです。

C:\dev\ARM\Sample\stm32cubef7\STM32Cube_FW_F7_V1.3.0\Utilities\Media\Pictures\BMP_480x272

microSDにbmpを入れたら、STM32F7-DISCOにmicroSDを挿入します。


### hexファイルを書き込む

最後にST-Link Utilityを起動して書き込みを行います。

Eclipseで作成したhexファイルを選択します。

`ST-LINK Utility: File => Open file...`
`ST-LINK Utility: Target => Connect`
`ST-LINK Utility: Target => Program...`
`Download [ f7_sample.hex ]: Start`

無事に画像が表示されたら成功です。