OpenOCD0.6.0を使ってLPC1114に書き込み&デバッグする為のめそっど

20160311追:
もう4年前の非常に古い記事ですがアクセスがいまだに多いので補足します。
LPC1100(u系も含む)をOpenOCDで書き込み・デバッグしたい場合は、
ねむいさん謹製のcfgファイルlpc11xxx_swd_flash.cfgをお使いください。
現在はLPC1100系は上記のファイルですべてカバーできるようになっております。
上記cfgファイルを含むねむいさんがビルドしたOpenOCDのバイナリはこちら。





SWD接続が可能なデバッガハードウェアVersaloonは、STM32使いの人たちの間では
オープンソースでSWD接続が手軽に利用できる数少ない手法の一つとして重宝されて
いますが私のぶろぐにもコメントをよくいただいている竹本氏のVersaloonに関する
記事が2012年2月号のトラ技に紹介され、さらに多くの注目が集まるようになりました。
ちなみに記事最後の参考文献の所でトラ技名物の誤植どころか段落が下の段落に
めり込んでめちゃくちゃになって肝心なURLがわからなくなってしまっているのですが
記事を書いた竹本氏は何一つ悪くないです。悪いのはチェックが毎回適当で誤植や検証
もせずにいい加減な記事のせてるCQ出版のほうなんですから!!11!(憤怒
野獣と化したカンガルー先輩に喝入れ直してもらった方がいいと思います。
いちおう丁寧に文章がぐちゃぐちゃになってる箇所をご指摘して差し上げたのですが、
もちろんお詫びと訂正には反映されませんでしためでたしめでt…たくねぇ!


はぁはぁ…すみません話逸れ過ぎました…。
NxP社のLPC1114に代表されるCortex-M0系デバイスはデバッグ用ポートにJTAGは
なくSWDしか存在しません。おまけにOpenOCDのCortex-M0系コアのデバッガの
実装はSWDしか接続方法がないゆえに手が入っておらず、またまたおまけに
Cortex-M0系コアの実装がまだ不完全ゆえにフラッシュ書き込みルーチンも
不完全と3重苦となっています。
しかしながらCortex-M0系のコアはCortex-M3系コアのサブセットなのでほんの
少しの箇所の変更で何とかできるようになります。
また、当たり前のことですが多くのCortex-M0デバイスはSWDしか存在ないので
SWD接続が可能なVersaloonもしくはSTLink/v2必須です



20120712追:
公式でCorte-M0がサポートされるようになりました♥しかしワークメモリが少ない
LPC11U14はopenOCDのビルド時にフラッシュ書き込みのソースにパッチを当てる
必要があります。こちらの手順をご覧ください。



以下の話はVersaloon対応のOpenOCD(0.6.0)がビルドできる環境&ビルド時の多少の
トラブルを回避できる能力を持ってる人対象です!ここでようやく本題!

●LPC1114(Cortex-M0系)専用のOpenOCDを作る
1.先ずはノーマルで動作を確認
 gitからとってきた新鮮なOpenOCDのコードにVersaloonのパッチを当ててビルド
 LPC1769やLPC1343にSWD接続で繋がりフラッシュの書き込み/デバッグが正常に
 できてるかチェック。問題があれば不具合のないコミットまで巻き戻そう!(逃
 2012/01/26現在は私はこれで動作確認しました。あと最近のコミットはSTM32F2/4
 系で大バグが作りこまれていますが後述

2.ソースコード修正
 openocd/src/target/cortex_m.c内の2025行目あたりにある下記の内容
 
  /* Cortex-M3 has 4096 bytes autoincrement range */
  armv7m->dap.tar_autoincr_block = (1 << 12);
 を
  /* Cortex-M0 has 1024 bytes autoincrement range */
  armv7m->dap.tar_autoincr_block = (1 << 10);
 に書き換えて再ビルド。

 これでLPC1114(Cortex-M0)専用OpenOCDができました。めでたしめでたし。
 この中にも上記修正他をまとめたcortex_m0.patchがあります。



3.といいたいところですが
 OpenOCD+VersaloonでLPC1114を動かすための特別なスクリプトファイルを
 意する必要がありますね。
 既に私がフラッシュ書き込みルーチン付きのものを用意しているので、
 こちらを使ってくださいね。

 ただ注意すべき点は、私も過去に何度も述べてきたNxP系のARMマイコンに存在する
 CheckSumValidationです。LPC1114もご多忙にもれず"calc_checksum"を付与
 して自動計算した値をフラッシュの所定の番地に書き込んでおかないとユーザ
 プログラムが実行されずISPの番地に勝手にすっ飛んでしまいます。
 calc_checksum付けなくても前もって計算結果を埋めこんどいてもよいです。
 これはmbed等のクラウド環境から離れ初めて地に降りた時"動くはずのプログラム
 が動かない"とよく引っ掛かるポイントです。ねむいさんクラウドよりもセフィロス派
 なのでmbedはとんと興味ないのですが大事なことなので何度でも言います。


4.LPC1114以外のCortex-M0のマイコンでは可能か?

LPC1227:
->できるじゃない!

 同じCortex-M0系のLPC1227も書き込み&デバッグが可能です。しかしLPC1227は
 リセット直後はウオッチドッグがONになっているせいかデバッグが途中からに
 なってしまいます。うまく動く組み合わせを検証中です。

20120210追:
 OpenOCDでattachした直後に一旦ISPのアドレス(0x1FFF0000)に飛んでから
 実行するとmain関数の先頭で停まるようになりました!
 このスクリプトファイルは公開しております。


LPC11U14:
->できるじゃない!

 LPC11U14はフラッシュ書き込みに必要なワークメモリの最小値がどうしても確保
 できず、書き込みはできませんでした。フラッシュメモリの消去のみと別な方法
 でフラッシュに書き込んだ後デバッグ動作はできます。

20120530追:
 LPC2000.c内のマイコン内ワークメモリアロケ―ターの下限値を下げることに
 より書き込みが可能なことが分かり、パッチに反映しています!


STM32F0:
->余裕でできるじゃない!


 NuvotonのNUC120はvsprogのほうは対応されたのでOpenOCDももうすぐですね♥






尺が余ってしまいましたので小ネタをいくつか
●最近のOpenOCD(0.6.0dev)でSTM32F2/F4系のマイコンにつないだ瞬間に
 OpenOCDがセグメンテーションフォールトする


とあるコミットからFlashSizeRegisterなるメモリアドレスにSTM32F2/4系の固有値と
して書き込まれているらしい内蔵フラッシュメモリの実サイズ値を読みだして設定
するという実装に代わっていますが…こいつがでたらめな値を引っ張ってきて設定
しやがるため即ひでぶしやがります…。
"私の環境では問題ないです"とおっしゃられてる方もそういわずに100kByte以上の
バイナリ作って書き込んでみてください。おそらく最初に作りこんだときにLED点滅
するだけのような10kByte以下のバイナリのサイズでしかチェックしてなかったので
ひでぶを免れていただけだったのでしょう。


なんでこんな変なことしてるんだろうと思ってSTM32F4のリファレンスマニュアル
(Doc ID 018909 Rev 1)を参照すると…


先ず0x1FFF7A10に各チップごとに固有のuniqueIDがあって

次に0x1FFF7A10に16bitサイズのFlashSizeがストアされたれじすt…
…アドレスが被ってる!?

なんかドキュメントが変ですよこれ!?
てわけでねむいさんの虎の子のOpenOCD+InsightでSTM32F407ZGT6(RevY)に接続し
該当するメモリの付近を捜索してみましたが…
…アドレス0x1FFF7A22に0x0400(1024kByte)が見える…
これが本物のFlashSizeRegisterかしら…

念のため手持ちのSTM32F2/4系のマイコン片っ端から引っ張り出してアドレス
0x1FFF7A22の値調べてみました。私の手持ちはすべて1024kByteの品種なので、
このアドレスが真のFlashSizeRegisterならば全部0x0400(1024kByte)にならな
ければなりませんがはてさて…


STM32F207VGT6(ES) :0xFFFF
(現在のOpenOCDの実装は0xFFFFだと1024kByteを想定して書くのでセーフ)

STM32F207ZGT6(RevY) :0x0400

STM32F407VGT6(RevA) :0x0400

STM32F407ZGT6(RevA) :0x0400
…ビンゴかよ…ES品の207VGT6は仕方ないですが。
とりあえずOpenOCDとSTMicroの中の人にメッセージ投げときましたけど気づいて
くれるでしょか???だめだったらフォーラムにも。
20120214追:
STから問い合わせ結果返ってきました。やはり0x1FFF7A22が正しいです。
リファレンスマニュアルも後日差し替えしますとのことです。
また、OpenOCDのほうも対応してくれました。



●aitendoさんのTFT-LCDモジュールを使う
そうだよまただよ

こっち
こっち至ってごく普通のモジュールなんですが、TFT2P0327-Eのほうは
Vledが3.2VtypではなくLED2個直列つなぎの6.2Vなんです…データシートが3.0~3.4
って書いてあっておもいくそ間違ってます。まぁチャイナクオリティ(ry

といいたいところですけどねむいさんが買った3つがたまたまTFT2P0327-Eにくり
そつの別のLCDモジュールだったかもしれませんし大陸系の店は何があるかわから
ないんですけど買ったの今のところ私だけみたいですからまぁいっか…

半透過式の液晶なので視野角が広く太陽光下でもそれなりに見える代物らしいです

Go to top of page