Tôi đang sử dụng arm gcc (CooCox) để lập trình khám phá STM32F4 và tôi đã vật lộn với một vấn đề về endian
Tôi đang lấy mẫu với ADC 24 bit thông qua SPI. Vì ba byte đang đến, MSB trước tiên tôi có ý tưởng tải chúng vào một liên minh để làm cho chúng (tôi hy vọng, dù sao đi nữa!) Dễ sử dụng hơn một chút.
typedef union
{
int32_t spilong;
uint8_t spibytes [4];
uint16_t spihalfwords [2];} spidata;
spidata analogin0;
Tôi tải dữ liệu bằng cách sử dụng spi đọc vào analogin0.spibytes [0] - [2], với [0] là MSB, sau đó tôi nhổ chúng qua USART ở tốc độ megabaud, 8 bit mỗi lần. Không vấn đề gì.
Các vấn đề bắt đầu khi tôi cố gắng truyền dữ liệu vào một bộ xử lý 12 bit. SPI DAC này muốn các từ 16 bit, bao gồm tiền tố 4 bit bắt đầu từ MSB, theo sau là 12 bit dữ liệu.
Những nỗ lực ban đầu là để chuyển đổi twos bổ sung mà ADC đã cho tôi để bù nhị phân, bằng xor-ing analogin0.spihalfwords [0] với 0x8000, chuyển kết quả xuống 12 bit dưới cùng, sau đó thêm tiền tố vào một cách hợp lý.
Vô cùng bực bội, cho đến khi tôi nhận thấy rằng đối với analogin0.spibytes [0] = 0xFF và analogin0.spibytes [1] = 0xB5, analogin0.halfwords [0] bằng 0xB5FF chứ không phải 0xFFB5 !!!!!
Sau khi nhận thấy điều này, tôi đã ngừng sử dụng các phép toán số học và nửa câu, và bị mắc kẹt với logic bitwise và các byte
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)
... Và điều này đã làm việc tốt. Khi tôi nhìn trộm tạm thời sau dòng mã đầu tiên, 0xFFB5 của nó chứ không phải 0xB5FF, vì vậy tất cả đều tốt
Vì vậy, đối với câu hỏi ...
Cortex là mới đối với tôi. Tôi không thể nhớ PIC từng hoán đổi byte trong int16, mặc dù cả hai nền tảng đều là endian nhỏ. Điều này có đúng không?
Có cách nào thanh lịch hơn để xử lý việc này? Sẽ thật tuyệt nếu tôi có thể đưa ARM7 vào chế độ lớn. Tôi đang thấy nhiều tài liệu tham khảo về Cortex M4 là bi-endian, nhưng tất cả các nguồn dường như không còn thực sự cho tôi biết làm thế nào . Cụ thể hơn, làm cách nào để đặt STM32f407 vào chế độ lớn , thậm chí còn tốt hơn nếu nó có thể được thực hiện trong gcc. Đây có phải là vấn đề thiết lập bit thích hợp trong thanh ghi AIRCR không? Có bất kỳ sự phân nhánh nào, chẳng hạn như phải đặt trình biên dịch khớp, hoặc các lỗi toán học sau này với các thư viện không nhất quán ??