CQ-LM3S3748 (11) NVIC_VTABLE ― 2012年11月08日 21時40分22秒
STM32 では USB DFU bootloader を使う時 NVIC_SetVectorTable() で Offset を指定する必要があった。今回の LM3S3748 ではそのような設定をしていないが動いている。そこで先日作成したプログラム(仮想 COM Port に Dump 出力)でレジスタを見てみることにする。
NVIC_VTABLE が 0x00001800 に設定されている。アプリケーションでは記述して無いので USB DFU bootloader が書き換えたのだろう。この方が使いやすいね。
ところで、ここで使った Memory Dump は最初 strtol() で引数を変換していたがどうしてもうまくいかなかった。調べてみると返す値が long 型だったのだ。アドレスは unsigned long 型なので仕方なく atox() を作った。手抜きをしているのでどんな文字でも強制的に変換する。また使うときがあるかもしれないのでメモしておこう。
ついでに dump もメモしておこう。これは rprintf とセットにしてよく使う関数だ。
ここで USBrprintf は rprintf の名前を変えただけ USBputch は以下のとおり。
環境: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
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
最近のコメント