我正在使用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读取将数据加载到Analogin0.spibytes [0]-[2]中,其中[0]作为MSB,然后通过USART以8比特的高波特率将它们吐出。没问题。
当我尝试将数据传递到12位DAC时,问题就开始了。此SPI DAC需要16位字,其中包括从MSB开始的4位前缀,然后是12位数据。
最初的尝试是将ADC给我的二进制补码转换为二进制偏移量,方法是对0x8000的Analogin0.spihalfwords [0]进行异或运算,将结果移至最低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,所以一切都很好
所以,对于问题...
皮质对我来说是新的。我不记得PIC在int16中曾经进行过字节交换,即使这两个平台都是低位字节序。这个对吗?
有没有更优雅的方式来解决这个问题?如果我能将ARM7置于大端模式,那将是很好的。我看到许多关于Cortex M4的参考资料都是二端序的,但是所有来源似乎都没有真正告诉我方法。更具体地说,我如何将STM32f407置于大端模式,如果可以在gcc中完成的话,甚至更好。这仅仅是在AIRCR寄存器中设置适当的位的问题吗?是否有任何影响,例如必须将编译器设置为匹配的,或者以后使用不一致的库对数学进行修正?