LPC」タグアーカイブ

LPC1114でSWDが使えなくなったら

NYA-05は制御にLPC1114を(贅沢に)使っています。目下ファームウェアを開発中なのですが、うっかりしたことでSWDが使えなくなる事象に遭遇しましたのでメモしておきます。

環境

LPCXpresso5、OSX10.7.5、LPCXpressoを半分に切ったLPCLinkを使用してSWDにて書き込み&デバグ。CMSIS使用。

現象

SWDのクロック線に使っているポート(SWCLK/PIO0_10/ SCK0/ CT16B0_MAT2)をプログラム先頭にて下記コードでGPIOとして動作するようにしたところ、LPCLinkからターゲットが見えなくなりました。

LPC_IOCON->SWCLK_PIO0_10 = 0b11010001; // PIO0_10

さらに、なんとかしようとISPモードにしてみましたがやはりターゲットは見つからないまま。うっかりどこかのピンを短絡して焼いてしまったのかと思ったのですが、実はそうではありませんでした。

原因

「LPCLinkがSWDコネクションを確立する前にユーザコードでSWDを無効にしてしまうと、SWDコネクションが確立できなくなってしまう」ということが原因でした。当然コネクションが確立できないとターゲットが見えなくなってしまいます。こちらのドキュメント(UM10398)のP410、Fig.90にブートシーケンスがありますが、確かにブートシーケンス中にSWDの記載はありません。

また、ISPモード動作中はSWDは動作しないため、ISPモードで起動してもSWDコネクションは確立出来ません。

こちらでは確認していませんが、問題解決のためにググった限りではJTAGのピンもSWD同様ユーザコードで使えなくすると認識されなくなってしまうようです。

対策

一度SWDを殺すユーザコードを書いてしまうと、UARTやUSB、CAN経由のISPを使わないとSWDを復活させることが出来ません。今回のケースではUART経由のISPを起動して、FlashMagicを使って修正後のファームウェアを書き込み事なきを得ました。ISPはユーザコードでどのように設定していてもCRP(Code Red Protection)で殺していないかぎりは使うことが出来ますので、SWDがいくら便利でもISP書き込みができる環境は別に用意しておくと良いでしょう。

根本的には、SWDでデバグしたいターゲットであればSWDのポートはSWD以外に使わないのが一番いいように思います。SWDを書き込みにしか使わないのであれば、起動時に数秒のウェイトを入れるとそのウェイトの間にLPCLinkがターゲットを掴むので書き込みだけ可能、という形にもできるようですが今の所未検証です。ただ、LPC8xxのようなピン数の少ないデバイスを使うときにはウェイトを入れるようなテクニックは大切になってくるかもしれません。

教訓としては、ひとまず基板を起こすときはUARTのピンは出しておく、PIO0_0(RESET)、PIO0_1(ISP)は必ずあけておいてタクトスイッチをつけられるようにしておく、SWCLKとSWDIOは使わないでおく、という感じでしょうか。

色々検証いただいた@tedd_okano氏、@ytsuboi氏に感謝、です!