STM32-Register Ansprechen

Gast #4315470
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..
#4315538
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)
(Firma: TU Darmstadt) #4315540
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                                */
Gast #4316423
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.
Gast #4316428
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren