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...
> while (__HAL_UART_GET_FLAG(huart2, UART_FLAG_TC) != RESET)
compiliert das ohne Fehlermeldung?
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 :-)
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.
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)...
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 :-)
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?
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!
>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
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!
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>
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.