Forum: Mikrocontroller und Digitale Elektronik stm32 Register auslesen


von Juerg F. (juerg_f)


Angehängte Dateien:

Lesenswert?

Ich versuche seit Stunden den Staus eines Registers auszulesen. Leider 
ohne Erfolg. Verwende VS2022 mit VisualGDB. Wie kann ich auf dieses 
Register (oder generell auf Registereintraege) zugreifen?

Bin mit der HAL Library von ST am rummachen... :-)

Ich moechte gerne wissen, ob dieses Bit gesetzt ist oder nicht. Bin 
etwas mehr als Anfaenger und komme mit dem stm32 immer mehr klar. Aber 
an diesem Detail scheitere ich grad! Bitte nicht Fragen, was ich genau 
vorhabe - geht nur um Grundlagenforschung. Ich werde immer wieder mal 
vor dieser Frage stehen, wie ich auf ein solches Register lesend 
zugreifen kann...

Geht in diese Richtung;

    HAL_UART_Transmit(&huart2,i, 1, HAL_MAX_DELAY);
    while (__HAL_UART_GET_FLAG(huart2, UART_FLAG_TC) != RESET)
    {
      __ASM("nop");

    };
Aber der Zugriff habe ich vermutlich einfach nicht gecheckt / geht 
nicht...

von dummschwaetzer (Gast)


Lesenswert?

huart2
da ist irgendwo huart.instance.dein_register

von dummschwaetzer (Gast)


Lesenswert?

>   while (__HAL_UART_GET_FLAG(huart2, UART_FLAG_TC) != RESET)
compiliert das ohne Fehlermeldung?

von Juerg F. (juerg_f)


Lesenswert?

dummschwaetzer schrieb:
>>   while (__HAL_UART_GET_FLAG(huart2, UART_FLAG_TC) != RESET)
> compiliert das ohne Fehlermeldung?

Mit while (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TC) != RESET)
geht es ohne Fehler (sorry, habe durch probieren und probieren und 
probieren einfach mal meinen Plan gepostet und den Zeiger & vergessen)

Habe in Freund Google schon immer wieder was gelesen von 
->instance->..... gelesen. Aber kann es nicht umsetzen.

Frage nochmals anders formuliert;
Wie kann ich auf ein Register lesend zugreifen, wenn ich gerne wuesste, 
ob ein Bit in Register XY gesetzt ist oder nicht?

Was ist das Geheimnis fuer so eine Bit-Anfrage in Code umegesetzt? Wie 
bekomme ich mit dieser HAL/CMSIS zu der Information, ob ein Bit in 
Register XY gesetzt ist oder nicht?

Ich weiss, irgendwas mit .....->xxx->yyy (ich nehme an, es wird als SET 
oder RESET "returned"..) / daran forsche ich noch :-)

von Stefan F. (Gast)


Lesenswert?

Juerg F. schrieb:
> Wie kann ich auf ein Register lesend zugreifen, wenn ich gerne wuesste,
> ob ein Bit in Register XY gesetzt ist oder nicht?
1
#include <stm32f1xx.h>
2
3
USART2->SR & USART_SR_TC

oder
1
READ_BIT(USART2->SR, USART_SR_TC)

Die Register und Bits findest du in der Datei stm32f1xx.h bzw. einer der 
Dateien die davon wiederum inkludiert werden.

von dummschwaetzer (Gast)


Lesenswert?

bei mir copiliert das nicht!
../Core/Src/main.c:101:14: note: in expansion of macro 
'__HAL_UART_GET_FLAG'
  101 |       while (__HAL_UART_GET_FLAG(huart2, UART_FLAG_TC) != RESET)
      |              ^~~~~~~~~~~~~~~~~~~
make: *** [Core/Src/subdir.mk:34: Core/Src/main.o] Error 1
make: *** Waiting for unfinished jobs....
"make -j4 all" terminated with exit code 2. Build might be incomplete.

  while ((huart2.Instance->SR &UART_FLAG_TC) != RESET)
würde gehen.

      while (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_TC) != RESET)
tät auch gehen: Macro __HAL_UART_GET_FLAG(&huart2, UART_FLAG_TC) wird 
erweitert zu
(((&huart2)->Instance->SR & (((uint32_t)(0x1UL << (6U))))) == 
(((uint32_t)(0x1UL << (6U)))))
alzo auch zu
(huart2.Instance->SR &UART_FLAG_TC)...

von Juerg F. (juerg_f)


Lesenswert?

Stefan ⛄ F. schrieb:
> Juerg F. schrieb:
>> Wie kann ich auf ein Register lesend zugreifen, wenn ich gerne wuesste,
>> ob ein Bit in Register XY gesetzt ist oder nicht?
>
>
1
> #include <stm32f1xx.h>
2
> 
3
> USART2->SR & USART_SR_TC
4
>
>
> oder
>
1
> READ_BIT(USART2->SR, USART_SR_TC)
2
>
>
> Die Register und Bits findest du in der Datei stm32f1xx.h bzw. einer der
> Dateien die davon wiederum inkludiert werden.
Danke Dir fuer Deine Muehe. Doch leider passiert nicht das (bzw. 
nichts). Irgendwie bekomme ich immer eine 64 zurueck. Somit waere das 
7te bit eine 1.

Im Prinzip hatte ich vor, meine while-schleife solang anzuhalten bis der 
Transfer Complete signalisiert wird und dann einen Counter weiter laufen 
laesst...

Ich dachte, ich kann einfach eine while Schleife bauen und sobald dieses 
Bit gesetzt/oder geloescht wurde, wird die while Schleife verlassen...

Na ja, danke euch. Aber habe trotzdem was gelernt. Und zwar, dass ich 
auf ein UART Modul mit USART zugreiffen kann. Habe immer gedacht, dass 
UART und USART zwei total unterschiedliche Welten sind. Aber grad 
gemerkt, dass diese Zugriffe identisch sind :-)

von Stefan F. (Gast)


Lesenswert?

Juerg F. schrieb:
> Habe immer gedacht, dass
> UART und USART zwei total unterschiedliche Welten sind.

Generell solltest du dich immer mit 3 Dokumenten vertraut machen, 
bevor du dich an die HAL wagst:

Datasheet
Reference Manual
Errata

Erst danach macht es Sinn, die Doku der HAL zu lesen, denn sie baut 
darauf auf. Im Reference Manual steht etwas relevantes:

> Bit 6 TC: Transmission complete

> This bit is set by hardware ...
> It is cleared by a software sequence (a read from the USART_SR
> register followed by a write to the USART_DR register). The TC bit
> can also be cleared by writing a '0' to it. This clearing
> sequence is recommended only for multibuffer communication.

Ich bin sehr sicher, dass ich dir korrekte Beispiele für den STM32F103 
gegeben habe. Hast du einen anderen Mikrocontroller vorliegen?

von Juerg F. (juerg_f)


Lesenswert?

ja, bin noch am Nucleo F767ZI dran. Dort habe ich schon ein OLED 
AlphaNumm Display am laufen mit Encoder und I2C Thermometer. Lauft gut 
soweit.

Ich nehme mir Dein Tipp ans Herz und muss mich mal durch die ganzen 
Dokus durchlesen. Ist nicht so, alls haette ich dies nicht schon x-mal 
gemacht. Aber ich denke, mit den Infos fuer den Zugriff auf diese 
Register kann ich schon mal weiter arbeiten. Habe ja freude dran :-)

Danke euch allen!

von dummschwaetzer (Gast)


Lesenswert?

>Wie kann ich auf ein Register lesend zugreifen, wenn ich gerne wuesste,
>ob ein Bit in Register XY gesetzt ist oder nicht?
allgemein:
du hast irgendwo ein handle auf deine Peripherie:
z.B. bei dir huart2
im allgemeinen hirgendwas.
in der STM-HAL hat dieses handle einen Abschnit .instance:
z.B. bei dir huart2.instance
wenn dein Editor da schon clever genug ist, kommt dann eine 
Eingabemaske, was da alles unter instance da ist.
Du kannst dir da aber auch die Typdef des handles anschauen.
Bei huart ist da unter anderem auch SR
damit hast du im Prinzip die Adresse des Registers bzw. dessen Inhalt
huart2.instance->SR
diesen Inhalt musst du jetzt noch mit einer Bitmaske vergleichen.
z.B. bei dir UART_FLAG_TC (ist ein MACRO)

Der Vergleich könnte so Ausehen:
huart2.Instance->SR & UART_FLAG_TC
mit dem Ergebniss
0 wenn UART_FLAG_TC nicht gesetzt, entspricht false
UART_FLAG_TC wenn UART_FLAG_TC gesetzt, entspricht true

von Stefan F. (Gast)


Lesenswert?

Juerg F. schrieb:
> ja, bin noch am Nucleo F767ZI dran

Warum zitierst du dann oben aus dem RM0008, dem Referenzhandbuch des 
STM32F10x? Zwischen den vielen STM32 Serien gibt es erhebliche 
Unterschiede. Du musst immer ins richtige Handbuch schauen!

Du kannst dir die Register übrigens auch im Debugger anschauen!

von Juerg F. (juerg_f)


Lesenswert?

Stefan ⛄ F. schrieb:
> Juerg F. schrieb:
>> ja, bin noch am Nucleo F767ZI dran
>
> Warum zitierst du dann oben aus dem RM0008, dem Referenzhandbuch des
> STM32F10x? Zwischen den vielen STM32 Serien gibt es erhebliche
> Unterschiede. Du musst immer ins richtige Handbuch schauen!
>
> Du kannst dir die Register übrigens auch im Debugger anschauen!

Weil ich am Nucleo F103RB dran bin. Habe aber zwei Steckboards am 
laufen. Ein mal am Surface mit F103 und ein mal am grossen Bruder mit 
10700K und F767. Kann das Display einfach umstecken usw. Bin flexibel 
was das anbelangt.

Der letzte Beitrag von "Dummschwaetzer" hat mir richtig weitergeholfen. 
@Dummschwaetzer: so dumm bist Du nicht! Mach dich nicht schlechter als 
noetig! Hast mir geholfen. Auch Stefan hat mir einige gute Inputs 
gegeben - jetzt bin ich wieder am Start. Muss die Infos umsetzen und 
habe ja das Weekend Zeit dafuer!

Hab euch lieb! Danke dafuer, dass Ihr euch Zeit genommen habt um mir den 
Anstoss zu liefern... E>

von dummschwaetzer (Gast)


Lesenswert?

Danke!
Mir hatte bei meinen ersten Schritten auf STM die WebSite von
Stefan ⛄ F. (stefanus)
sehr gut geholfen!
http://stefanfrings.de/stm32/index.html

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.