Verzeihen Sie mir, wenn diese Frage bereits beantwortet wurde, ich jedoch weder auf dieser Seite noch im Internet eine Antwort finden konnte.
Ich bin ein erfahrener Entwickler mit anständigen Kenntnissen in Bezug auf Low-Level-Programmierung, aber relativ neu in der Embedded-Entwicklung. Ich habe mir selbst die Entwicklung eingebetteter Systeme mit einer ST-NUCLEO144-Karte beigebracht, die über eine STM32F746ZG-MCU verfügt. Eine Frage, die mir nicht offensichtlich erscheint, ist, warum sich logisch verwandte Bitfelder in einem Register an verschiedenen Stellen befinden können.
Ein Beispiel ist das USART_CR1Register am STM32746ZG. Die Felder M0und M1bit steuern zusammen die Wortlänge in USART TX / RX, ein kombinierter 2-Bit-Wert von 0b00spezifiziert 8-Bit, 0b01spezifiziert 9-Bit usw. Dies ist alles ziemlich einfach, außer dass M0es sich um Bit 12 und M1Bit handelt 28 ... warum ist das so?
Ist dies aus Gründen des Legacy-Designs der Fall, z. B. wurde eine neue Funktion in einen zuvor reservierten Bereich eingefügt? Ist es aus Gründen im Zusammenhang mit dem Chipdesign, die ich nicht in Betracht ziehe, oder gibt es einen größeren Zweck, den ich nicht sehe?
Natürlich ist dies mit Bitmaskierung ziemlich trivial zu überwinden, aber ich bin nur neugierig.

