mbedをデバッグアダプタにしてみた(mbed-Link)

CMSIS-DAP対応ファームウェア

mbedのファームウェアもCMSIS-DAPに正式対応し、デバッグ環境がますます使いやすくなって来ました。 無償で使用できる Keil MDK-ARM Lite版を使用している方も増えてきているのではないでしょうか。

さて、CMSIS-DAPなファームウェアのリファレンスコードが、以下で公開されています。

[LPCware]
AN11321: Porting the CMSIS-DAP debugger to the Cortex-M0 platform
http://www.lpcware.com/content/nxpfile/an11321-porting-cmsis-dap-debugger-cortex-m0-platform

[ARM - Software documentation] (要登録)
CMSIS-DAP Deliverables - CMSIS-DAP Beta 0.01
https://silver.arm.com/browse/CMSISDAP

LPCwareの方はNXP LPC11U37用のポーティング、ARMの方はLPC-Link II (NXP LPC4320)とFRDM-KL25Z (Freescale KL-25Z)用になっています。

ソースを眺めて見たところ、それほど複雑でもなく、チップ依存のレイヤーも割と境界がハッキリしているので、mbed LPC1768にポーティングしてみました。 一通りの動作確認が出来ましたので、ここで公開します。名前は(勝手に)、mbed-Linkとしました。

/media/uploads/MACRUM/mbed_link.jpg

mbed-Link の特徴

  • ターゲットボードと mbed があれば、追加ハードウェア不要
  • Keil MDA-ARMを使用した Flash メモリの書き込みとデバッグ機能
  • 各種ターゲットボードに対応(後述)
  • Keil MDK-ARM付属のターゲットボード向けスタートアップコードが使用可能
  • Cortex-M0+のMTB (Micro Trace Buffer) 等の最新技術にも対応

コードの配布に関して

ARMのリファレンスコードのEULA (End User License Agreement)によると、ソースの改変は認められているものの、再配布はバイナリのみしか認められていません。 仮に公開できたとしても、CMSIS-DAPファームウェアはKeil MDK-ARMのUSBライブラリを使用しているので、ビルドする場合は MDK-ARM Pro版が必要となります(Lite版でのビルドは不可)。

インストール方法

mbed LPC1768用のバイナリファイル

mbed-Link v0.1 (LPC1768 binary)

このファイルを、通常の書き込み手順と同様に mbed のマスストレージにコピーして下さい。コピー後に mbed のリセットボタンを押せば、Flashメモリに書き込まれ、mbedはCMSIS-DAP仕様のデバッグアダプタになります。通常のバイナリなので、別のバイナリで上書きすれば元の mbed に戻すことが出来ます。安心して使用して下さい。

また、CMSIS-DAP対応ファームウェアのmbedと同様に、デバッガから認識させるためにドライバのインストールが必要です。

ドライバや MDK-ARM 評価版のインストール手順は、こちらを参照してください。

http://mbed.org/users/MACRUM/notebook/uvision4_debug/

ターゲットとの接続回路図

ターゲットボードとmbedの接続回路例を以下に示します。JTAG または SWD でターゲットと接続することが出来ます(あたりまえですが同時には接続できません)。

/media/uploads/MACRUM/mbed-link_2.jpg

使用方法

LPC810(Cortex-M0+マイコン)と接続してみる

NXP製LPC810との接続例を以下に示します。nxpfanさんがfacebookで公開した、こちらの回路例をほとんどそのまま参照しています。
「LPC810 (= DIP8_ARMマイコン) + LPCXpresso」で,Lチカ (LED点滅)プログラムを動かしてみる

/media/uploads/MACRUM/mbed-link_lpc810_2.jpg

ブレッドボードに部品実装した例を以下に示します。

/media/uploads/MACRUM/img_2318.jpg

mbedとホストPCをUSBケーブルで接続します(mbedボード上のUSBコネクタではなく、LPC1768のD+/D-端子が接続されている側のコネクタです)。

MDK-ARM uVison4 の設定

1. メニュー [Project] [New uVision project...] を選択し、NXP LPC810M021用のプロジェクトファイルを作成します。

/media/uploads/MACRUM/target_lpc810.jpg

2. デフォルトではスタートアップコードのみが生成されるので、main() を含んだソースファイルを追加します。以下にソースコードの例を示します。

LPC810 example code

#include "LPC8xx.h"

void SystemInit()
{
}

void delay(int x)
{
	volatile int wait;
	wait = x;
	while(wait)
		wait--;
}

int main()
{
	int wait = 0;
	LPC_GPIO_PORT->DIR0 |= (1UL<<0);

		while(1)
		{
			delay(80000);
			LPC_GPIO_PORT->SET0 = (1UL<<0);
			delay(50000);
			LPC_GPIO_PORT->CLR0 = (1UL<<0);
			wait += 10;
			if(wait >= 50000)
				wait = 0;
		}
		
	return 0;
}

3. ビルドを行い、エラーが出ないことを確認します(上記コードは警告が出ますが、とりあえず無視で)。
4. メニュー [Project] - [Options for Target ...] - [Debug] タブで、Use: CMSIS-DAP Debugger を選択し、ラジオボタンで有効にします。

/media/uploads/MACRUM/cmsis-dap_dialog.jpg

5. 続けて、[Settings] ボタンを押し、"mbed-Link CMSIS-DAP" を選択します。

/media/uploads/MACRUM/mbed-link_dialog.jpg

ここで、"mbed-Link CMSIS-DAP" が表示されなかったり、SW Device の部分で "SWD/JTAG Communication Failure" 等のエラーが表示される場合には、ターゲットと通信が正しく行われていないので、接続を確認して下さい。

6. [Utilities] タブで、"Use Target Device for Flash Programming" を有効し、先ほどと同じ接続 "mbed-Link CMSIS-DAP" を選択します。"Update Target before Debugging" をチェックすると、デバッグセッション開始時にプログラムがLPC810の内蔵Flashメモリに書き込まれます。

/media/uploads/MACRUM/utilities.jpg

7. [OK] を押して設定ウィンドウを閉じます。
8. メニュー [Debug] - [Start/Stop Debug Session] を押すとデバッグセッションが開始され、エントリポイントからのデバッグが出来ます。

/media/uploads/MACRUM/lpc810_debug.jpg

動作確認済みターゲット

CMSIS-DAP自体が、CoreSightとの接続を前提にしているので、Cortex-Mクラスのプロセッサコアを採用しているマイコンにのみ繋がります。 以下のターゲットボードと接続し、Flashメモリの書き込みと、デバッグ操作が正しく動作する事を確認しています。

  • Keil MCBTMPM360 (Cortex-M3) Toshiba TMPM360
  • Keil MCBSTM32C (Cortex-M3) STmicro electronics STM32F107VC
  • CQ出版 FRK-FM3 (Cortex-M3) Fujitsu MB9BF618T
  • NXP LPCXpresso LPC812 (Cortex-M0+)
  • NXP LPCXpresso LPC1114 (Cortex-M0)
  • NXP LPCXpresso LPC1769 (Cortex-M3)
  • STM32F4-Discovery (Cortex-M4) STM32F407
  • NXP LPC810 (Cortex-M0+)
  • NXP LPC1114FN28 (Cortex-M0)

その他の情報

コードの変更点

LPC4320から、LPC1768へのポーティングで変更した部分は、主にGPIO周りです。 もちろん使用するポート番号は違うのですが、GPIO周りの仕様も若干異なるので、変更を行いました(マスクビットが反映されるレジスタ等)。また、リファレンスコードは外付けバッファで入出力ポートを制御している仕様だったので、直接GPIOの DIR ビットで入出力制御を行う方式に変更しました。

コードサイズ

青 mbed LPC1768 バイナリのコードサイズは以下です。

Program Size: Code=14448 RO-data=720 RW-data=120 ZI-data=11000  

制限事項

  • nTRST端子の制御は行っていません
  • 一応JTAG接続のモードは有効にしていますが、SWD接続のみしか動作確認していません

今後の予定

黄色mbed(LPC11U24)対応

本当はこちらを先に対応させたかったのですが(LPCwareのポーティングと同じ LPC11Uxxなので)、USBとクロック周りの問題で動いていません。時間があれば対応したいと思います。

mbedライブラリ対応?

現在ベースにしているリファレンス実装では、Keil MDK-ARM付属のUSBライブラリを使用しており、ビルドするのに有償のPro版が必要です。 mbed ライブラリを使うようにコードを全部改変すれば、オープンソースに出来て、幸せになれるかも知れません。誰かやらないかなぁ。

その他のデバッグアダプタ

坪井さん(@ytsuboi)が、ステキなCMSIS-DAP対応デバッグアダプタを開発されています。

http://wiki.tinker-pot.com/doku.php?id=ja:cmsis-dap_adapter

mbed-Link 変更履歴

v0.1 initial release version


Please log in to post comments.