arm gcc(CooCox)を使用してSTM32F4discoveryをプログラムしていますが、エンディアンの問題と格闘しています。
SPIを介して24ビットADCでサンプリングしています。3バイトが入ってくるので、MSBを最初に、それらを共用体にロードして、少しでも使いやすくすることを考えました(とにかく希望!)。
typedef union
{
int32_t spilong;
uint8_t spibytes [4];
uint16_t spihalfwords [2];} spidata;
spidata analogin0;
spi読み取りを使用してデータをanalogin0.spibytes [0]-[2]にロードし、[0]をMSBにしてから、USARTを介して8ビットずつメガボーで吐き出します。問題はありません。
問題は、データを12ビットDACに渡そうとしたときに始まりました。このSPI DACは、MSBで始まる4ビットのプレフィックスとそれに続く12ビットのデータで構成される16ビットワードを必要とします。
最初の試みは、ADCから与えられた2の補数を変換して、analogin0.spihalfwords [0]を0x8000とxor-ingし、結果を下位12ビットにシフトし、算術的にプレフィックスを追加することでした。
analogin0.spibytes [0] = 0xFFおよびanalogin0.spibytes [1] = 0xB5の場合、analogin0.halfwords [0]は0xFFB5ではなく0xB5FFに等しかったことに気付くまで、非常にイライラします。
これに気づいた後、算術演算とハーフワードの使用を停止し、ビット単位のロジックとバイトに固執しました
uint16_t temp=0;
.
.
.
// work on top 16 bits
temp= (uint16_t)(analogin0.spibytes[0])<<8|(uint16_t)(analogin0.spibytes[1]);
temp=temp^0x8000; // convert twos complement to offset binary
temp=(temp>>4) | 0x3000; // shift and prepend with bits to send top 12 bits to DAC A
SPI_I2S_SendData(SPI3,temp); //send to DACa (16 bit SPI words)
...そしてこれはうまくいきました。コードの最初の行、0xB5FFではなく、0xFFB5の後にtempで覗くと、すべてがうまくいきます
だから、質問のために...
皮質は私にとって新しいです。両方のプラットフォームがリトルエンディアンであっても、int16でのPICのバイトスワッピングは思い出せません。これは正しいです?
これを処理するよりエレガントな方法はありますか?ARM7をビッグエンディアンモードにすればいいと思います。Cortex M4がバイエンディアンであるという多くの言及がありますが、すべての情報源は実際にどのように私に言うのかを止めているようです。より具体的には、STM32f407をビッグエンディアンモードにするにはどうすればよいですか(gccで実行できる場合)。これは、AIRCRレジスタの適切なビットを設定するだけの問題ですか?コンパイラを一致するように設定する必要がある、または後で矛盾したライブラリと数学のねじ込みをするなどの影響はありますか?