Kinetis Lシリーズはぢめました

20161123追:
FreeScaleはNxPに喰われた後さらにQualCommに喰われました



"OpenOCD + CMSIS-DAP"の検索で飛んできた方はこちらをご覧ください。


バレンタインチ○コのかわりに先行で公開しておりましたが、VersaloonとOpenOCDを
使用したいつもの書き込み・デバッグ環境がFreescaleのCortexM0+コアが載ったKL25
シリーズでもできるようになりましたのでお伝えします。

●もうこういう無駄な買い物は止めようはと思います…が


このFRDM-KL25ZというボードにはMKL25Z128VLK4というKinetis Lシリーズの石が乗っか
っています。当時はいち早くCortexM0+コアを搭載を謳っていた物で、またOpenSDAとい
うオープンソース(らしい)デバッガハードウエアも搭載されて1000円台で販売されてます。
それにしてもこのボードも安いですね。どのメーカもデバッガハードウエアがついて
1000円台が当たり前の時代になりました。

時系列的には同じくCortexM0+コアを持つLPC800と同時期に入手していましたがFreeScale
の石はあまり食指が伸びずほおっていました。そのまま腐らせるのももったいないので
ちょっといじってみようと思いたったわけです。


私が目を付けたのはKL25Zの石よりもOpenSDAの方でした。とにかくデバッガ側のUSB
コネクタをPCと繋げるとマスストレージとVCPとが認識されます。このマスストレージ
はmbedでおなじみのD&Dで書き込みができるってタイプの奴です。ソースコードデバッ
グを行うためにはOpenSDAのファームウエアを書き込む必要があります。同じくこれに
対応したGDBサーバをP&Eマイクロから取得する必要があります。


が、
フリー版のそれは使用に耐えないくらい動きがカクカクでプログラムのダウンロードも制限
されています。我慢してこれ使うくらいなら最初のマスストレージ使う書き込みでカット
アンドトライした方が10000倍マシです。というわけでボード単体でデバッグ環境建てる
やり方に見切りをつけて冒頭で述べたSWD接続方式のVersaloon+OpenOCDという王道で
環境を作ることにしました。

↑カカロット!お前がカクカクナンバーワンだ!

↑ちなみにOpenSDAのファームをCMSIS-DAPに入れ替えるとCoFlashが使えます。

●Versaloon+OpenOCDで使えるようにしてみる

FreeScaleの石といえどもコアがCortexM0+なのでSWDで引っ掛けるのはたやすいです。
先ずはマスストレージで書き込んだプログラムをOpenOCDとinsightでデバッグは問題
なく確認できました。ちなみにOpenSDAのSWDは切り離さずともVersaloonとつながる
ので基板パタンのカットなどの作業は必要なくSWDの線を引っ張り出すだけです。


次に書き込みですが…OpenOCDのkinetisドライバは現在KL25Lシリーズには対応して
いないのでLPC800の時と同じように自分で実装する必要がありました。
kinetisドライバはフラッシュ書き込みを行うのにRAMにプログラムを乗っけて一気に
書き込む方式と4バイトずつ書き込んでいく方式があります。これはkinetisの各モデル
で使用できる書き込み方式が決まっていてKL25では後者の"Program Longword"という
コマンドでしか書き込むことはできません。

幸いにもKL25シリーズはチップ固有IDがかなり細かいところまでわかるのでこれを
利用して既存のモデルの書き込みになるべく影響しないようにKL25の書き込みルーチ
ンを作りこんでいきました。

↓そして完成したドライバの書き込み結果がこちら
> "C:¥Devz¥Coreutils¥bin¥make.exe" program
openocd -s C:/Devz/ARM/OCD/tcl -f interface/vsllink_swd.cfg -f target/kl25z_swd_flash.cfg -c "mt_flash main.elf"
Open On-Chip Debugger 0.7.0-dev-00159-g87668ae-dirty (2013-02-15-17:44)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : OpenOCD runs in SWD mode
none separate
Info : add flash_bank kinetis pflash
adapter speed: 1000 kHz
cortex_m3 reset_config sysresetreq
Info : Versaloon(0x15)by Simon(compiled on Feb 20 2013)
Info : USB_TO_XXX abilities: 0x0000076E:0x010001EF:0xC0000007
Info : clock speed 1000 kHz
Info : kl25z.cpu: hardware has 2 breakpoints, 2 watchpoints
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x21000000 pc: 0x000000cc msp: 0x20003000
Rize up to Internal PLLed Clock!
Info : Probing flash info for bank 0
Info : KL24/25Series Erase All Blocks
Info : Write to MCU security status unsecure
erased sectors 0 through 127 on flash bank 0 in 0.046875s
Warn : KL24/25 supports Program Longword execution only.
wrote 6676 bytes from file main.elf in 5.453125s (1.196 KiB/s)
verified 6676 bytes in 0.156250s (41.725 KiB/s)
shutdown command invoked

> Process Exit Code: 0
> Time Taken: 00:07

先にも述べましたが低速な"Program Longword"による書き込みは現状のkinetisドライバ
ではDAPを毎回叩いてチマチマホストPCから命令をおくっているため通信のオーバーヘッド
が非常に大きくなりMAX2kByte/Secくらいしか速度が出ませんorz
STM32みたくRAM上に小さいブートローダー流し込んでそこをデータの受け渡し場にして
アトミックに書き込みを行うようにしないとこれ以上速度は出ませんが私にそこまで技術力
ないのでこの辺で勘弁してあげましょう(泣

↑結局自分で実装しました!超快適です♥


↓ちなみにSTLink/V2でも当たり前のように書き込み・デバッグが可能です。
20130419追:重要!!!
STlink/V2 firmware version MUST upgrade to V2.J17.S0!


> "C:¥Devz¥Coreutils¥bin¥make.exe" program
openocd -s C:/Devz/ARM/OCD/tcl -f interface/stlink-v2.cfg -f target/kl25z_hla_flash.cfg -c "mt_flash main.elf"
Open On-Chip Debugger 0.7.0-dev-00159-g87668ae-dirty (2013-02-15-17:44)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.sourceforge.net/doc/doxygen/bugs.html
none separate
Info : add flash_bank kinetis pflash
Info : This adapter doesn't support configurable speed
Info : STLINK v2 JTAG v16 API v2 SWIM v0 VID 0x0483 PID 0x3748
Info : Target voltage: 2.894991
Info : kl25z.cpu: hardware has 2 breakpoints, 2 watchpoints
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0x21000000 pc: 0x000000cc msp: 0x20003000
Rize up to Internal PLLed Clock!
Info : Probing flash info for bank 0
Info : KL24/25Series Erase All Blocks
Info : Write to MCU security status unsecure
erased sectors 0 through 127 on flash bank 0 in 0.046875s
Warn : KL24/25 supports Program Longword execution only.
wrote 6676 bytes from file main.elf in 5.078125s (1.284 KiB/s)
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000002e msp: 0x20003000
target state: halted
target halted due to breakpoint, current mode: Thread
xPSR: 0x61000000 pc: 0x2000002e msp: 0x20003000
verified 6676 bytes in 0.062500s (104.312 KiB/s)
shutdown command invoked

> Process Exit Code: 0
> Time Taken: 00:05


まぁOpenSDAのマスストレージからの書き込みが使い勝手が非常に良いので書き込み
はMSCから、デバッグはVersaloon+OpenOCDと使い分けるのがよいでしょう。そのうち
kinetisドライバに手を入れてくれる人が出ると思いますから…ふふ


●FreeScale Kinetisシリーズを使う上で必ず守るべき事項
 今回の記事はこの項を特に頭に叩き込んでおいてください。
 知らずにやってしまうとゴミにしてしまいます!!!!!


KinetisシリーズのARMマイコンはNxP系のARMマイコンと同じくフラッシュメモリの
特定の領域にMCUのコンフィグレーションが設定されています。
具体的に言うと0x00000400番地以降の16バイトが相当します。メーカお仕着せのツー
ルではこの番地にユーザープログラムを置かないように配慮されておりますがGCCで
一からプロジェクトを作り上げる人はこの番地はコンフィグレーション専用の番地と
してしっかり設定して置きましょう。具体的にどうやるかは私のサンプルを参考にし
てください。ついでですがメーカ提供のUARTドライバというかいろんなものがちょっと
出来が悪すぎるのでSTM32でも使ってるUARTドライバを移植してます。


話がそれましたが、一番気を付けるべきはフラッシュメモリの0x0000040Cから読みだし
設定されるFSECというレジスタです。ここの値の下2bit分が(00,01,11)の場合Secure
状態と判断されSWD経由のアクセスがある特定の操作を除いて一切不可能になります
(マニュアル73-74p参照)。…もうお気づきだとは思いますが、つまりは内蔵フラッシュ
メモリの2番目のセクタの消去orメモリ全消去の操作をしてアンプログラムド(すべて
のビットが1)にしてしまうとコードセキュリティが働いて以後のSWDのアクセスが特定の
操作以外は実質不可能になってしまいます!!!

おまけにSTM32やLPCマイコンでは可能だったシステムブートローダからの起動による
セキュリティ状態をキャンセルするという軟弱な救済措置は、KL25シリーズではシス
テムブートローダ自体が存在しないため不可能という非常に男気あふれる仕様となって
おります!!(注:工場出荷時は0x0000040Cに0xFEを書き込んで出荷されているため、
いきなり動作不能とかはないです)

唯一の解除方法はデバッグポートの下位のレベルの"MDM-AP Control register"に全消去
ビットを送り込んで(この操作を行うと全消去された後0x0000040Cに0xFEが書き込まれる)
で工場出荷時のフラッシュメモリの状態に戻すことです。ねむいさんが試したところで
はOpenSDAのマスストレージモードやCMSIS-DAPはこの操作を先に行っているようで、
わざと0x0000040Cが0xFFなプログラムとか書き込んだ後でもふつーに操作可能です。

幸いにもOpenOCD中のarm_adi_v5.cにはkinetisマイコンに対してローレベルでSW-DP
を叩くことができるコードが追加されています。ねむいさんはこちらにも手を加えて、
KL24/25シリーズでもこの復活措置を可能にしました。しかしながらこの操作はSRSTの
物理操作が必ず要求されるため、VersaloonにSRSTの線を追加するかもしくは手動
リセットでタイミングよく解放してやる等の小手先の技が要求されます。

秒単位の話なのでタイミングに慣れるとそれほどの事じゃないですが…

それと当たり前ですがarm_adi_v5.cを経由しないSTLink/V2やTI-ICDIのようなAPI召還型の
タイプのアダプタは直接SW-DPを叩けないためこの回復技は一切不可能なのでご注意を。


ちなみに0x0000040Cにはmass_erase許可ビットも4-5bit目に存在しており、"0xEF"と
書き込んじゃうとSW-DPを直接たたく全消去操作もできなくなってしまい完全にゴミと
化しますので試合会場や展示場でライバルを制したいときに非常に有効な技です!


ねむいさんが公開しているFRDM-KL25Z向けのサンプルプログラムとKL24・25シリーズ
に対応したOpenOCDはプログラム上でも書き込み時も0x0000040Cに0xFFにしてしまわ
ないように配慮を行っているので安心してお使いください。
あとは書き込み速度さえ何とかできればOpenSDAやCMSIS-DAPに頼らずともVersaloon+
OpenOCDの組み合わせだけでも幸せになれると思います。
ぱっちもここに置いてるのでだれか腕のある人続けてくだち…。

↑結局自分で実装しました!超快適です♥

Go to top of page