我正在使用 arm gcc (CooCox) 对 STM32F4discovery 进行编程,并且一直在努力解决字节序问题
我正在通过 SPI 使用 24 位 ADC 进行采样。由于要输入三个字节,MSB 首先我想到了将它们加载到一个联合中以使它们(无论如何我希望!)更易于使用。
typedef union
{
int32_t spilong;
uint8_t spibytes [4];
uint16_t spihalfwords [2];} spidata;
spidata analogin0;
我使用 spi 读取将数据加载到类比 0.spibytes[0]-[2] 中,以 [0] 作为 MSB,然后我通过 USART 以兆波特率将它们吐出,一次 8 位。没问题。
当我尝试将数据传递到 12 位 DAC 时,问题就开始了。该 SPI DAC 需要 16 位字,其中包括从 MSB 开始的 4 位前缀,后跟 12 位数据。
最初的尝试是将 ADC 给我的二进制补码转换为偏移二进制,通过 xor-ing analogin0.spihalfwords[0] 与 0x8000,将结果移动到底部 12 位,然后在算术上添加前缀。
令人难以置信的令人沮丧,直到我注意到对于analogin0.spibytes[0]=0xFF 和analogin0.spibytes[1]=0xB5,analogin0.halfwords[0] 等于0xB5FF 而不是0xFFB5 !!!!!!
注意到这一点后,我停止使用算术运算和半字,并坚持按位逻辑和字节
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)
...这很好。当我在第一行代码之后查看 temp 时,它是 0xFFB5,而不是 0xB5FF,所以一切都很好
所以,对于问题...
Cortex对我来说是新的。我不记得 PIC 曾经在 int16 中进行字节交换,即使两个平台都是小端。它是否正确?
有没有更优雅的方法来处理这个?如果我可以将 ARM7 置于大端模式,那就太好了。我看到很多提到 Cortex M4 是双端的,但所有消息来源似乎都没有真正告诉我如何. 更具体地说,我如何将 STM32f407 置于大端模式,如果可以在 gcc 中完成就更好了。这只是在 AIRCR 寄存器中设置适当位的问题吗?是否有任何后果,例如必须将编译器设置为匹配,或者稍后使用不一致的库搞砸数学?