CQ-LM3S3748 (11) NVIC_VTABLE2012年11月08日 21時40分22秒

NVIC_VTABLE
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