2013年4月17日水曜日

CMSIS-DAP debuggerの修正メモ。

AN11321: Porting the CMSIS-DAP debugger to the Cortex-M0 platform
をKL25Zで動くように修正した時のメモ。

SWDプロトコルをソフトウェアで実装している。
クロックの周期を作るのにCPUサイクル数を数えています。

SW_DP.cpp

void SWJ_Sequence (uint32_t count, uint8_t *data)
uint8_t SWD_Transfer(uint32_t request, uint32_t *data)

ループに必要なCPUサイクル数は数えていないようです。
Max Clock の設定より実際には低めのクロックで動いていると思う。

DAP_config.h

CPU_CLOCK 48000000
CPUのクロック 48MHz

IO_PORT_WRITE_CYCLES 1
I/Oポートに書きこむ時に必要なCPUサイクル数 は 2、Cortex-M0+は 1

DigitalOut を使った時のサイクル数がわからなかったし、他のmbedでも動くように
ワーストケースとして 1 にしている。

DAP.h

DELAY_SLOW_CYCLES 3
PIN_DELAY_SLOW(uint32_t delay) 関数でdelayあたりのCPUサイクル数

DELAY_FAST_CYCLES 0
PIN_DELAY_FAST(void)関数のCPUサイクル数、最適化されるので 0

DAP.cpp

static uint32_t DAP_SWJ_Clock(uint8_t *request, uint8_t *response)
SWDの Max Clock 最大クロックの設定

#define MAX_SWJ_CLOCK(delay_cycles) (CPU_CLOCK/2 / (IO_PORT_WRITE_CYCLES + delay_cycles))
MAX_SWJ_CLOCK(DELAY_FAST_CYCLES) は (48M/2/(1+0)) 24MHz になります。

最大クロックが MAX_SWJ_CLOCK(DELAY_FAST_CYCLES) 24MHz 以上の時は、
クロック作成で PIN_DELAY_FAST()関数を使います。ウェイトを作成しない。

SWD Max Clock で設定した時の delay, cycle の変化。
Max Clockdelaycycle
10MHz13
1MHz824
100kHz80240
10kHz8002400
5kHz16004800
Max Clock 5kHz に設定するとFlash書き込みはかなり遅くなります。
また、バッファリングしていないUSBHIDの場合はユーザインターフェースの反応が鈍くなります。
可能な限り Max Clock は多く設定するのがお勧めです。

(2013/4/17)

CPU_CLOCK CPUのクロックは uint32_t SystemCoreClock にした方がいいのかもしれない。
system_LPC17xx.c system_LPC11Uxx.c system_MKL25Z4.c で設定されている。

(2013/4/18追加)
---

0 件のコメント: