3

micromouseonline で提供されているガイドに従っています。com/2010/07/14/bit-banding-in-the-stm32 . と を使用IAR EWARMしてCortex M3います。すべて正常に動作しますが、特定のアドレスにビットを設定できません。私はコンパイラを使用しSTM32L151xDています。IAR EWARM

これは、彼らが関数を定義する方法です

#define RAM_BASE 0x20000000
#define RAM_BB_BASE 0x22000000
#define Var_ResetBit_BB(VarAddr, BitNumber) (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)) = 0)
#define Var_SetBit_BB(VarAddr, BitNumber) (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)) = 1)
#define Var_GetBit_BB(VarAddr, BitNumber) (*(vu32 *) (RAM_BB_BASE | ((VarAddr - RAM_BASE) << 5) | ((BitNumber) << 2)))


#define varSetBit(var,bit) (Var_SetBit_BB((u32)&var,bit))
#define varGetBit(var,bit) (Var_GetBit_BB((u32)&var,bit))

呼び出しは次のとおりです。

uint32_t flags;
varSetBit(flags,1);

ただし、デバッガーを使用している場合、フラグのビット 1 は常に 0 です。flags は、最初は 0 であると見なされます。したがって、フラグのすべてのビットは 0 になります。ただし、varSetBit(flags,1) を使用すると、ビット 1 の答えは再び 0 になります。私は何か間違ったことをしているとは思わない。コンパイラの問題ですか?いくつかの設定がありませんか?どんな助けでも大歓迎です。

4

1 に答える 1

2

ビットバンディング機能の目的を誤解していると思われます。
ビットバンディングを使用すると、アプリケーションはマイクロコントローラのレジスタにビット単位でアクセス (読み取り/書き込み) できます。これにより、読み取り/変更/書き込みシーケンスではなく、単一のストア命令でビットを変更できます。これが機能するために、stm32デバイス (またはより一般的にはCortex M3デバイス) には、各レジスタの各ビットが特定のアドレスにマップされる特定のアドレス空間があります。

レジスタのビット 3 を設定する必要がある場合の例を見てみましょうFOO

  • ビット バンディングがなければ、次のコードを記述する必要があります。

    FOO = FOO | 0b100;

FOOこれは、レジスタのロード、ビット単位のOR操作、およびレジスタのストアにおけるアセンブラ命令の結果FOOです。

  • ビットバンディングを使用すると、次のように記述できます。

    varSetBit(FOO, 3);

varSetBitこれにより、マクロからプリプロセッサによって計算されたアドレスに単純なストアが作成されます。

つまり、ビットバンディングはマイクロコントローラのレジスタにのみ適用されます。変数で行うように、それらを使用して独自の変数のビットを操作することはできませんflags

詳細については、ARM アプリケーション ノートを参照してください。

于 2013-05-07T15:19:38.350 に答える