FreescaleのCortex-Mシリーズマイコンの開発環境をLinux上にセットアップする


FreescaleのCortex-M0のMCUの評価ボードであるFRDM-KL02Z を動かしてみました。
Linux(Ubuntu 14.04 x86_64)の上に開発環境を構築しました。

準備

SDKのインストール

以下のサイトからFreescale kinetisのSDKをダウンロードして展開します。
http://www.freescale.com/tools/software-and-tools/run-time-software/kinetis-software-and-tools/development-platforms-with-mbed/software-development-kit-for-kinetis-mcus:KINETIS-SDK

$ WORK=$PWD
$ tar xf Kinetis\ SDK\ 1.3.0\ Mainline\ -\ Linux.tar.gz 

以降SDKの中のドキュメント"Getting Started with Kinetis SDK (KSDK) v.1.3.pdf"に沿って進めて行くのですが、このドキュメントはWindows向けに書かれているので、けっこう苦労しました。
作業用のトップディレクトリは $WORK と表記します。

GNUツールチェインのインストール

以下のサイトからダウンロードして/usr/localの下に展開します。
https://launchpad.net/gcc-arm-embedded

$ sudo tar xf gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2 -C /usr/local
$ sudo apt-get install cmake
$ sudo apt-get install lib32ncurses5

ダウンロードしたツールチェインは32bit用にビルドされているので、32bitの標準ライブラリが必要です。lib32ncurses5をインストールするとlib32用のlibcなど必要なものが揃います。

環境変数のセット
$ cd $WORK/KSDK_1.3.0/
$ cat env.sh 
export ARMGCC_DIR=/usr/local/gcc-arm-none-eabi-4_9-2015q3/
export PATH=$ARMGCC_DIR/bin:$PATH

SDKの中のビルドスクリプト環境変数ARMGCC_DIRでツールチェインのありかを参照しているので、これをセットします。

$ source env.sh

ビルド

ライブラリのビルド
$ cd $WORK/KSDK_1.3.0/lib/ksdk_platform_lib/armgcc/KL02Z4/
$ ./build_all.sh
hello_worldのデモアプリのビルド
$ cd $WORK/KSDK_1.3.0/examples/frdmkl02z/demo_apps/hello_world/armgcc/
$ ./build_all.sh

以下のようにファイルができれいればビルド成功。

$ ls -l debug release
debug:
total 452
-rwxrwxr-x 1 koba koba  18976 Oct 30 12:13 hello_world.bin
-rwxrwxr-x 1 koba koba 190613 Oct 30 12:13 hello_world.elf
-rw-rw-r-- 1 koba koba  51103 Oct 30 12:13 hello_world.hex
-rw-rw-r-- 1 koba koba 229412 Oct 30 12:13 hello_world.map

release:
total 172
-rwxrwxr-x 1 koba koba   6676 Oct 30 12:13 hello_world.bin
-rwxrwxr-x 1 koba koba  76881 Oct 30 12:13 hello_world.elf
-rw-rw-r-- 1 koba koba  16506 Oct 30 12:13 hello_world.hex
-rw-rw-r-- 1 koba koba 115515 Oct 30 12:13 hello_world.map

実機で実行

デバッガの準備

JLinkGDBServer は以下のサイトから入手できます。
https://www.segger.com/jlink-software.html

$ cd $WORK
$ tar xf JLink_Linux_V502f_x86_64.tgz 

FRDM-KL02ZをUSBケーブルで挿したときにできるデバイスファイルを一般ユーザでもアクセスできるようにudevのルールを追加しておきます。

$ cat /etc/udev/rules.d/99-jlink.rules 
ENV{ID_BUS}=="usb", ENV{ID_MODEL}=="J-Link", MODE="666"
ファームウェアのアップデート

FRDM-KL02ZはデフォルトではP&E Micro OpenSDAのファームウェアが書かれています。KL02のデバッグインタフェース仕様は OpenSDA v1.0 なので、これに対応したJLink用のファームウェアにアップデートします。
https://www.segger.com/opensda.html からJLink_OpenSDA_2015-10-13.zipをダウンロードします。zipの中身はJLink_OpenSDA_2015-10-13.sdaというひとつのファイル。

FRDM-KL02Z をリセットボタンを押しながらUSBに接続するとファームウェアアップデートのモードになり、PC側からUSBストレージとして見えるボリュームの名称がBOOTLOADERになります。
そこに、JLink_OpenSDA_2015-10-13.sda をドラッグ&ドロップします。書き込みに成功するとLASTSTAT.TXTの内容がCompletedになります。
ドキュメントにはWindowsLinuxのどちらでもこのファームウェアアップデートはできると書いてあったのですが、実際にはLinuxではうまくいかなくて、Windwos7でやったら成功しました。
ファームウェアアップデートが完了したら、USBケーブルを一度抜いて挿し直します。これで通常モードになります。

(2015.11.13 追記)
LinuxからでもGUIでなくてコマンドラインで以下のようにコピーしたらアップデートできました。

$ cp JLink_OpenSDA_2015-10-13.sda /media/koba/BOOTLOADER/

(追記 ここまで)

シリアルコンソールを開く

別のターミナルで評価ボードのシリアルコンソールを開いておく。

$ screen /dev/ttyACM0 115200

このコマンドの終了は ^Ak。

JLinkGDBserverの起動

別のターミナルで

$ cd $WORK/JLink_Linux_V502f_x86_64
$ ./JLinkGDBServer -select USB -device MKL02Z32xxx4 -if SWD -speed 1000
SEGGER J-Link GDB Server V5.02f Command Line Version

JLinkARM.dll V5.02f (DLL compiled Oct  2 2015 20:53:57)

-----GDB Server start settings-----
GDBInit file:                  none
GDB Server Listening port:     2331
SWO raw output listening port: 2332
Terminal I/O port:             2333
Accept remote connection:      yes
Generate logfile:              off
Verify download:               off
Init regs on start:            off
Silent mode:                   off
Single run mode:               off
Target connection timeout:     0 ms
------J-Link related settings------
J-Link Host interface:         USB
J-Link script:                 none
J-Link settings file:          none
------Target related settings------
Target device:                 MKL02Z32xxx4
Target interface:              SWD
Target interface speed:        1000kHz
Target endian:                 little

Connecting to J-Link...
J-Link is connected.
Firmware: J-Link OpenSDA compiled Oct 13 2015 12:09:57
Hardware: V1.00
S/N: 621000000
Checking target voltage...
Target voltage: 3.30 V
Listening on TCP/IP port 2331
Connecting to target...Connected to target
Waiting for GDB connection...

ファームウェアをアップデートしていないと、J-Link is connected.のあたりで失敗します。

gdbの起動

debug用にビルドしたオブジェクトのあるディレクトリに移動して

$ cd $WORK/KSDK_1.3.0/examples/frdmkl02z/demo_apps/hello_world/armgcc/debug
$ arm-none-eabi-gdb hello_world.elf

gdbのプロンプトで

target remote localhost:2331
monitor reset
monitor halt
load
monitor reset
monitor halt
b main
c

これでフラッシュメモリにロードしてmain関数のところまで実行して止まります。
この内容を.gdbinit に書いておけば、次回から自動で実行されます。

c

これでmain関数の中が実行されます。シリアルコンソールに"Hello, world" が表示され、LEDが点滅すれば成功です。