Czy istnieje powód, dla którego stm32F103C8xx jest big endianem i czy można zmienić na little endian?
Mam 16-bitowy zorientowany schemat adresowania, który muszę wysłać przez przewód, a druga strona oczekuje najpierw MSB. Jakieś inne sugestie?
Aby odpowiedzieć, jak to robię, oto metoda (która oczywiście nie daje odpowiedzi na pytanie).
typedef union ___address{ uint16_t address; uint8_t addr_byte[2] ; } my_addr;
Po prostu użyj go jako dwa razy 8 bitów w odwrotnej kolejności, my_addr.addr_byte [1], a następnie my_addr.addr_byte [0].
Komentarze
Odpowiedź
STM32F103 używa w pamięci formatu little-endian, jak wyjaśniono w podręcznik programowania na stronie 30 . To także moje doświadczenie, ponieważ nie musiałem przełączać się między bajtami podczas wymiany liczb z komputerem (który jest oczywiście maszyną typu little endian).
Również, jak wyjaśniono na stronie wiedzy o ARM , Cortex M 3 nie obsługuje dynamicznego przełączania endianness, więc utkniesz z tym, co producent uznał za słuszne.
Możesz sprawdzić bit AIRCR.ENDIANNESS, aby mieć 100% pewności. Jeśli odczytuje 0, jest to pamięć little-endian, jeśli jest 1, używa big-endian.
Jeśli masz problemy z wydajnością z powodu zamiany bajtów, możesz być w stanie ominąć te przy pomocy instrukcji asemblera REV, REV16 i REVSH (nie wiem, czy Twój kompilator już to robi).
Komentarze
- + 1 do bezpośredniego linku do cytowanej strony. Nie ' nie wiedziałem, że możesz to zrobić.
Odpowiedź
Wszystkie mikrokontrolery STM32 (i faktycznie większość mikrokontrolerów ARM Cortex-M w ogóle) to little-endian.
SETEND LE
wydaje się działać.