bit-bandの使い方

03 Jun 2014

いつもお世話になっています。

また教えを請いに伺いました。

LPC1768を使ったbit-bandのテストプログラムですが、希望の動作にならず悩んでおりました(プログラムをExportしMDK-ARMにて試しています)。

http://mbed.org/users/moo/code/bit-band/

1:ポインタを使いSRAM先頭アドレス0x1000-0000に0x1を書き、続いて0x0を書く・・・OKです(IDE内のmemory windowで確認しています)。

2:同じようにポインタを使い0x2200-0000に0x1を書く・・・memory windowに変化無し。

3:次の行のnopを実行した時点でハードフォルトが発生する。

今までbit-bandと言うものに縁が無かったので、試しに手出ししてみたのですが歯が立たずでした。

よろしくお教え下さい。

03 Jun 2014

Bit bandは0x10000000のアドレスレンジには使うことはできません。使えるのはこれだけです:

Memory rangeBit-band alias
0x20000000 .. 0x200FFFFF0x22000000 .. 0x23FFFFFF
0x40000000 .. 0x400FFFFF0x42000000 .. 0x43FFFFFF

LPC1768にて、アドレス0x20000000にメモリは存在していないので、0x22000000にもアクセスするとハードフォルトが発生します。存在しているのメモリのアリアスがしたらOKだと思います。

たとえば、GPIOのP1_28(LED1)を使いましょう。FIO1PINのアドレスは0x2009C034、ビットは28。Bit-bandのアリアスは:

0x22000000 + ((0x2009C034 - 0x20000000)*32 + 28*4) = 0x233806F0

そのアドレスに1を書いたら、LED1が点灯するはずです。(確認していないんですが)

後は、ここのページから便利なマクロスを使えます。

// Base address of alias band
#define BITBAND_SRAM_BASE 0x20000000
// Alias region base
#define ALIAS_SRAM_BASE   0x22000000
// calculate alias for the 'bit' in the address 'byte'
#define BITBAND_SRAM(byte,bit) ((ALIAS_SRAM_BASE + (byte-BITBAND_SRAM_BASE)*32 \ + (bit*4)))

[...]

#define FIO1PIN 0x2009C034
volatile int * led1 = (int*)BITBAND_SRAM(FIO1PIN, 28);

*led1 = 1; // 点灯
*led1 = 0; // 消灯
04 Jun 2014

お~分かりました。 やっと理解出来ました。

つまり「0x2200-0000へのアクセスは0x2000-0000へのアクセスに変換される」のであって「0x2200-0000へのアクセスが0x1000-0000へのアクセスに変換されるわけではない」ってことなんですね。

了解しました。

またこちらも動作確認いたしました(ビット番号を18に変更しました)。

volatile int * led1 = (int*)BITBAND_SRAM(FIO1PIN, 18);

ここ一週間ほどうだうだしてたのがやっとスッキリしました。 まとめてホームページにでもアップさせて頂きます。

どうも丁寧に有り難うございました。