Forum: Mikrocontroller und Digitale Elektronik STM32-Register Ansprechen


von ABKH (Gast)


Lesenswert?

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..
von Little B. (lil-b)


Lesenswert?

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)
von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

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                                */
von HKBA (Gast)


Lesenswert?

ABKH schrieb:
> konkret gehts darum:
> while( !(USART3->SR & 0x00000040) );

als AVR Krampf:
1
> while( !(USART3->SR & (0x00000001 << 6) );
von ABKH (Gast)


Lesenswert?

leider keiner hat erklärt wieso 0x00000040.
wieso ist das sog. Transmission Complete bei 0x00000040?
von Heiko Jakob (Gast)


Lesenswert?

Weil es das 7te Bit ist. 0x40 = 0100 0000
von Herbert (Gast)


Lesenswert?

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.
von (prx) A. K. (prx)


Lesenswert?

Bitbanding ist das hier: ARM Bitbanding
von ABKH (Gast)


Lesenswert?

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.
von Heiko Jakob (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.