STM32F7 Discoveryでmbed_blinkyとかが動いた

DISCO_F746NGはmbedプラットフォームに登録されていますが、Pre-order のリンクがあるだけで、オンラインコンパイラに追加できません。しかしmbed-srcにはすでにDISCO_F746NGのソースがありますので、GCCでビルドして使えるかためしてみようと思います。

GCCはLaunchpadがすでにcortex-m7対応してるようなのですが、STM32cubeF7のデモアプリもビルドしたくて、SW4STM32をインストールしたので、こっちのGCCを使うことにしました。

mbed-srcをチェックアウトして、ビルドスクリプトでビルドします。private_settings.pyは無くてもよいですが、warningがでるので作っておきます。

$ git clone https://github.com/mbedmicro/mbed.git
$ cd mbed
$ touch workspace_tools/private_settings.py
$ python workspace_tools/build.py -mDISCO_F746NG -tGCC_ARM
DISCO_F746NG target is not yet supported by toolchain GCC_ARM
DISCO_F746NG target supports ARM, uARM, IAR toolchains

Completed in: (0.00)s

Build skipped:
  * GCC_ARM::DISCO_F746NG

むむ、GCC_ARMでコンパイルできなくされているのでDISCO_F746NGの設定にGCC_ARMを追加してみます。それから、GCCのmcutypeにcortex-m7fというのが無いみたいなので、cortex-m7に変更してビルドします。

$ diff -U3 workspace_tools/targets.py.orig workspace_tools/targets.py
--- workspace_tools/targets.py.orig     2015-07-24 17:29:50.254856800 +0900
+++ workspace_tools/targets.py  2015-07-24 17:42:23.361956100 +0900
@@ -769,9 +769,9 @@
 class DISCO_F746NG(Target):
     def __init__(self):
         Target.__init__(self)
-        self.core = "Cortex-M7F"
+        self.core = "Cortex-M7"
         self.extra_labels = ['STM', 'STM32F7', 'STM32F746', 'STM32F746NG']
-        self.supported_toolchains = ["ARM", "uARM", "IAR"]
+        self.supported_toolchains = ["GCC_ARM", "ARM", "uARM", "IAR"]
         self.default_toolchain = "uARM"
         self.detect_code = ["0815"]

$ python workspace_tools/build.py -mDISCO_F746NG -tGCC_ARM --silent
Building library CMSIS (DISCO_F746NG, GCC_ARM)
[Warning] stm32f7xx_hal_pcd.c@1152: In function 'PCD_WriteEmptyTxFifo': comparison between signed and unsigned integer expressions [-Wsign-compare]
[Warning] stm32f7xx_hal_pcd.c@1167: In function 'PCD_WriteEmptyTxFifo': comparison between signed and unsigned integer expressions [-Wsign-compare]
Building library MBED (DISCO_F746NG, GCC_ARM)
[Warning] i2c_api.c@417: In function 'i2c_slave_read': array subscript has type 'char' [-Wchar-subscripts]
Library: libmbed.a

Completed in: (58.12)s

Build successes:
  * GCC_ARM::DISCO_F746NG

とビルドはとおりました。次にこのmbedライブラリのテストプログラムをビルドしてみます。テストプログラムのビルドはmake.pyで行います。-p0 はテストプログラム番号です。-dオプションで直接書き込みます。

$ python workspace_tools/make.py -mDISCO_F746NG -tGCC_ARM -p0 -d /mnt/mbed
Building project BASIC (DISCO_F746NG, GCC_ARM)
Compile: main.cpp
Compile: test_env.cpp
Link: basic
Elf2Bin: basic
Image: ~/work/mbed/build/test/DISCO_F746NG/GCC_ARM/MBED_A1/basic.bin

動かないサンプルもありますが、ひどいことにはならなそうなので、次はmbed_blinkyをビルドしてみます。

$ mkdir mbed_blinky
$ sh <<SOURCE
#include "mbed.h"

DigitalOut myled(LED1);

int main() {
    while(1) {
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
    }
}
SOURCE
$ python workspace_tools/make.py -m DISCO_F746NG -t GCC_ARM --source ~/work/mbed/mbed_blinky --buid ~/work/mbed/mbed_blinky -d /mnt/mbed
Building project MBED_BLINKY (DISCO_F746NG, GCC_ARM)
Compile: main.cpp
Compile: test_env.cpp
Link: mbed_blinky
Elf2Bin: mbed_blinky
Image: ~/work/mbed/mbed_blinky/mbed_blinky.bin

これでmbed_blinkyが動きました。次は他のI/Fも触っていきたいと思います。