Я використовую arm gcc (CooCox) для програмування відкриття STM32F4, і я вела боротьбу з ендіанською проблемою
Я здійснюю вибірку з 24-бітовим АЦП через SPI. Оскільки три байти входять, у MSB спершу у мене виникла ідея завантажити їх у союз, щоб зробити їх (все одно сподівався!) Трохи легшими у використанні.
typedef union
{
int32_t spilong;
uint8_t spibytes [4];
uint16_t spihalfwords [2];} spidata;
spidata analogin0;
Я завантажую дані, використовуючи spi reads, в analogin0.spibytes [0] - [2], з [0] як MSB, потім випилюю їх через USART з мегабаудом, 8 біт одночасно. Немає проблем.
Проблеми почалися, коли я намагався передати дані в 12-бітний ЦАП. Цей ЦАП SPI хоче 16-бітових слів, які складаються з 4-бітного префікса, що починається з MSB, а потім 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)
... і це спрацювало чудово. Коли я заглядаю на темп після першого рядка коду, його 0xFFB5, а не 0xB5FF, тому все добре
Отже, для питань ...
Кортекс для мене новий. Я не можу згадати PIC, коли б байт мінявся в int16, хоча обидві платформи мало ендіатичні. Це правильно?
Чи є більш елегантний спосіб впоратися з цим? Було б чудово, якби я міг просто перевести ARM7 в режим big-endian. Я бачу, що багато посилань на Cortex M4 є двоіндійськими, але, здається, всі джерела не відповідають дійсності розповісти мені, як . Більш конкретно, як перевести STM32f407 в режим big-endian , ще краще, якщо це можна зробити в gcc. ЧИ ПОТРІБНО це встановити відповідний біт у реєстрі AIRCR? Чи є які-небудь наслідки, такі як встановлення компілятора на збіг, чи математичне виправлення пізніше з непослідовними бібліотеками ??