Hallo, Ich habe leider Schwierigkeiten mit dem Thema Register Ansprechen. Ich habe mich mit dem Thema "Bitbanding" beschäftigt und ganz ehrlich es hat mir sehr viel beigebracht, aber mir fehlt praktische Beispiele und Erfahrung. konkret gehts darum: while( !(USART3->SR & 0x00000040) ); wie kann ich selber auf 0x00000040 kommen? wie rechne ich den Wert "0x0000004" selber aus? Im RM0090 steht, dass USART3 beginnt von 0x40004800 bis 0x40004BFF. Der SR wird nur an deine erste 10 bits angesprochen (0 bis 9) den rest bleibt reserviert unberührt. Ich habe versucht der 0x0000004 auf die erste 10 bits im SR zu projitzieren, leider habe ich nicht verstanden. gibt toturial, welches das Thema Register-Ansprechen mit Beispiele auseinader setzt? womit soll ich anfangen, damit ich am ende die calculation von Register selber tun. Danke für eure Hilfe..
ABKH schrieb: > konkret gehts darum: > while( !(USART3->SR & 0x00000040) ); Hier wird ein Bit maskiert. Im speziellen das "Transmission Complete"-bit. Das hat jetzt noch nicht viel mit Bitbanding zu tun. Man kann daraus eine Bitband-Adresse berechnen, mit der Formel, die im cortex m4 reference manual steht: bit_word_offset = (byte_offset x 32) + (bit_number x 4) bit_word_addr = bit_band_base + bit_word_offset mit bit_band_base = 0x42000000 bei peripherals (0x40000000 = peripheral base address)
Mit Bitbanding hat Dein Beispiel ersteinmal nicht zu tun. In der Device Header zu Deinem Baustein,z.B. stm32f404xe.h findest Du, was 0x00000040 im U(s)art Status Register bedeutet: define USART_SR_TC ((uint32_t)0x0040) /*!<Transmission Complete */ Besser schreibst Du also while( !(USART3->SR & USART_SR_TC) ); wenn Du busy warten willst, bis die Uebertragung komplett ist. Und wenn das Ereignis nie kommt, dann haengst Du in der Schleife fest. Wo die USART3 Struktur liegt, sagt RM0090 und auch der device header: #define USART3_BASE (APB1PERIPH_BASE + 0x4800) #define USART3 ((USART_TypeDef *) USART3_BASE) #define APB1PERIPH_BASE PERIPH_BASE #define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
ABKH schrieb: > konkret gehts darum: > while( !(USART3->SR & 0x00000040) ); als AVR Krampf:
1 | > while( !(USART3->SR & (0x00000001 << 6) ); |
leider keiner hat erklärt wieso 0x00000040. wieso ist das sog. Transmission Complete bei 0x00000040?
ABKH schrieb: > leider keiner hat erklärt wieso 0x00000040. > wieso ist das sog. Transmission Complete bei 0x00000040? Das kennst du oder?: https://de.wikipedia.org/wiki/Bitfeld#Bitmaske Wenn du das hast, dann: https://www.mikrocontroller.net/articles/Bitmanipulation Umrechnen von 0x00000040 nach Binär dürfte ja kein Problem sein ... Gibt ja genügend tools.
Danke Jakob, also um das 7te bit im SR anzusprechen wurde zuerst das betroffene Bit in hex umgewandelt und dann die maske vorgehensweise verwendet um das Bit off zu setzen. jetzt kann ich es nachvollziehen Danke.
ABKH schrieb: > Danke Jakob, > also um das 7te bit im SR anzusprechen wurde zuerst das betroffene Bit > in hex umgewandelt und dann die maske vorgehensweise verwendet um das > Bit off zu setzen. jetzt kann ich es nachvollziehen > Danke. Ned ganz. Alle anderen Bits sind dadurch "off". Es bleibt durch das "&" nur das 7te Bit übrig.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.