禺画像]
STM32 では USB DFU bootloader を使う時 NVIC_SetVectorTable() で Offset を指定する必要があった。今回の LM3S3748 ではそのような設定をしていないが動いている。そこで先日作成したプログラム(仮想 COM Port に Dump 出力)でレジスタを見てみることにする。
NVIC_VTABLE が 0x00001800 に設定されている。アプリケーションでは記述して無いので USB DFU bootloader が書き換えたのだろう。この方が使いやすいね。
ところで、ここで使った Memory Dump は最初 strtol() で引数を変換していたがどうしてもうまくいかなかった。調べてみると返す値が long 型だったのだ。アドレスは unsigned long 型なので仕方なく atox() を作った。手抜きをしているのでどんな文字でも強制的に変換する。また使うときがあるかもしれないのでメモしておこう。
unsigned long atox(char *str)
{
unsigned long ret = 0;
while(*str){
ret = ret << 4;
ret |= 0xf & ((*str >= 'A') ? (*str++ - '7') : *str++);
}
return ret;
}
ついでに dump もメモしておこう。これは rprintf とセットにしてよく使う関数だ。
void dump(unsigned long adr,unsigned int size)
{
unsigned char *ad, data[16];
int i, j, k;
k = size / 16 + ((size % 16) ? 1 : 0);
USBrprintf("\r\n");
for(j = 0, ad = (unsigned char*)adr; j < k; j++){
USBrprintf("%08X", (unsigned long)ad);
for(i = 0; i < 16; i++, ad++)
USBrprintf(" %02X", data[i] = *ad);
USBputch(' ');
for(i = 0; i < 16; i++)
(data[i] >= 0x20 && data[i] < 0x80) ? USBputch(data[i]) : USBputch('.');
USBrprintf("\r\n");
}
}
ここで USBrprintf は rprintf の名前を変えただけ USBputch は以下のとおり。
int USBputch(int c)
{
while(USBBufferSpaceAvailable(&g_psTxBuffer[1]) < 2);
USBBufferWrite(&g_psTxBuffer[1], (const unsigned char *)&c, 1);
return c;
}
環境:CQ-LM3S3748
+ Keil MDK-ARM V4.53
+ GCC Sourcery CodeBench Lite 2012.03-56
+ KPIT Cummins GNU-Archive Editor v1.1
+ KPIT Cummins GNU-Map Viewer v1.0
セコメントをする