LPC11U35にSWDでアクセス(1)

いきさつ

コンパイル環境が整ってLPC11U35のソフトを書けるようになったので、次はデバッグ環境を用意したいと思った。そこで一緒に買ったFT2232DモジュールとOpenOCDを使ってSWD接続しようとしたんだけど、これがうまくいかない。どうやらマイコンのDPIDRを読むところ(つまり一番最初)で失敗しているようだ。デバッグ機能関係はほとんど知識がなくて原因もまるで見当がつかないまま、マニュアルに書いてあるそれっぽいことを手当たり次第に試していたら、いつの間にかISPモードに入れなくなってソフトの書き込みができなくなっていた。

原因は、マイコンに備わっているコードリードプロテクション(CRP)機能を「NO_ISP」に設定したため。SWDでアクセスできないのはCRPのせいではないかと思って、「NO_ISP」を「NO_CRP」と勘違いして実行してしまったのだ。Flashの0x2FC番地に0x4E697370を書き込むと、ブートローダーがそれを見てISPモードを回避する仕組みになっている。

復旧

このまま使えなくなってしまうのは悲しいので復旧させたい。なんとかして0x2FC番地を0x4E697370以外に戻せば、再びISPが有効になるはず。マニュアルを見るとNO_ISP設定でもSWDによるデバッグやプログラミングはできるらしい。これなら0x2FC番地を書き換えることもできそうだ。

しかし先に説明したようにFT2232Dを使ったSWDアクセスは失敗している…。ほかにデバッガもない中どうするかと考えた結果、一緒に買ったSTM32F042を使ってSWD信号を直接やり取りする実験をしてみたところ、これがうまくいった。最終的に0x2FC番地を含むセクターを消去してユーザープログラムを無効化し、無事ISPモードに入ることに成功した。めでたしめでたし。

以下は詳細のメモ(めちゃ長い)。

方針

  1. LPC11U35のSWD端子にSTM32F042を接続
  2. SWDインターフェイスからDPレジスタにアクセスする
  3. さらにAPレジスタにアクセスする
  4. MEM-APを利用してシステムのメモリアドレス空間にアクセスする
  5. FlashのIAP機能を利用してFlashを書き換え、CRPを解除

次回から具体的な作業を示す。