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/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になります。
ドキュメントにはWindowsとLinuxのどちらでもこのファームウェアアップデートはできると書いてあったのですが、実際には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が点滅すれば成功です。