を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 Clock | delay | cycle |
10MHz | 1 | 3 |
1MHz | 8 | 24 |
100kHz | 80 | 240 |
10kHz | 800 | 2400 |
5kHz | 1600 | 4800 |
また、バッファリングしていない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 件のコメント:
コメントを投稿