Bit-bandについてのメモ
出典: Wikimura
Bit-bandについて
Bit-bandとは、ワードを構成する32ビットに対し、ワード単位でアクセスすることができる機能です。 下図のように、Bit-band領域のワードの各ビットは、Bit-bandエイリアス領域内のワードに対応付けられています。
[3]によればCortex-M3では、内部RAMの最初の1MByteと、ペリフェラルの最初の1MByteがBit-band領域となっているそうです。 図は内部RAMのアドレスマップを表しています。
そして図に示すように、Bit-band領域のワードのビットは、LSBから順番にBit-bandエイリアス領域のワードへマップされています。
Bit-band領域の最初のワード(0x2000 0000)のLSB(0番ビット)は、Bit-bandエイリアス領域の最初のワード(0x2200 0000)へ対応付けられます。このビットがセットされていれば1として読みだされます。このビットをセットするときは1を書き込みます。 この辺は[1]に詳しく書いてあります。
Bit-band領域エイリアス領域基底をbaseAddr、ワードのBit-band領域基底からのオフセットをwordOffset、ビット番号(0-31)をbitNumberとすると、このビットのエイリアス領域のアドレスbitAddrは次式で表わされます。
Bit-bandエイリアス領域へはワードだけでなく、ハーフワードやバイトアクセスも可能です。 ただし、アドレスはワードアクセスの時と同じにしなくてはならないそうです。
DMAからの読み書きについて
ビットバンドでシングルビットずつDMAできれば便利だと思ったのですが、どうもできないようです。 DMA転送を行おうとしたところ、転送が始まりませんでした。 転送エラーが発生してしまうようです。
エイリアスから通常の領域、その逆、エイリアス間全てで転送エラーが起きました。 Bit-band機能はCortexコアの機能で、DMAはSTM32の機能だからでしょうか。 バスマスタが必ずしもBit-bandに対応しているとは限らないのかもしれません。
とはいえ、この機能をDMAと併せて使いたい人は結構いるようなので、今後のリビジョンでは搭載されるかもしれません。


