Forum: Mikrocontroller und Digitale Elektronik STM32F411VET6 - UART RX funktioniert nicht


von Stefan M. (stefan_m665)


Lesenswert?

Guten Tag!

Ich bin dabei mein selbst erstelltes Board mit einem STM32F411VET6 in 
Betrieb zu nehmen. Ich habe schon zuvor das ganze mit dem Discovery 
Board getestet und in Betrieb genommen dabei hat alles funktioniert.

Im Detail wird dabei zu einem SIM800C Modul daten ausgesendet und es 
sollten Daten zurückgelesen werden. Dazwischen ist auch ein Pegelwandler 
der zur Sicherheit Die Signale auf die 3,3V für den STM32 umwandelt.
Es wurde bereits alles mit dem Oszilloskop gemessen, es wird ein Signal 
über die TX Leitung zum SIM800C ausgesendet und der SIM800C antwortet 
auch und sendet diese zurück bis zum STM32F411, dieses Signal kommt auch 
an bis zum PIN. Die Signale sehen dabei auch komplett schön aus und es 
gibt kein rauschen oder sonstiges drauf.

Jetzt zum eigentlichen Problem:
Egal was ich mache der STM32F411 möchte am RX Pin nichts auslesen, ich 
hab dies schon per Polling, IT und DMA probiert. Ich lasse mir dabei das 
Buffer an einem Display anzeigen und nie steht was drinnen. Ich habe 
zurzeit die IT Methode drinnen, d.h. sobald eine Nachricht empfangen 
wurde, wird wieder auf eine neue Nachricht gewartet usw...
Der Programmcode den ich verwende ist hier zu finden: 
https://controllerstech.com/uart-receive-in-stm32/ unter Interrupt 
Method

Auch der Interrupt is aktiv geschalten usw. ich hab bereits alles 
mögliche überprüft und komme nicht drauf warum er nichts empfangen 
möchte obwohl er perfekt aussendet.
Kann es sein dass der PIN beschädigt ist oder so?

Danke im Voraus!

von m.n. (Gast)


Lesenswert?

Wichtig ist, daß die MODER + AFR des RX-Eingangs richtig gesetzt sind 
und daß bei USARTx->CR der Empfänger aktiviert wurde.
Was ist denn der Inhalt dieser Register?

von Stefan M. (stefan_m665)


Angehängte Dateien:

Lesenswert?

m.n. schrieb:
> Wichtig ist, daß die MODER + AFR des RX-Eingangs richtig gesetzt sind
> und daß bei USARTx->CR der Empfänger aktiviert wurde.
> Was ist denn der Inhalt dieser Register?

Um die UART zu initialisieren und einzustellen verwende ich die 
Funktionen des STM32-CubeIDEs, dieser generiert mir folgenden Code für 
die UART2 (Im angehängten Bild zu sehen).

von uff basse (Gast)


Lesenswert?

Stefan M. schrieb:
> Um die UART zu initialisieren und einzustellen verwende ich die
> Funktionen des STM32-CubeIDEs, dieser generiert mir folgenden Code für
> die UART2

Das reicht aber nicht. Du zitierst einen Text ohne ihn
offensichtlich verstanden zu haben.

Zeige dein komplettes Projekt (als *.zip Datei, vorher cleanen).

von Stefan M. (stefan_m665)


Angehängte Dateien:

Lesenswert?

uff basse schrieb:
> Stefan M. schrieb:
>> Um die UART zu initialisieren und einzustellen verwende ich die
>> Funktionen des STM32-CubeIDEs, dieser generiert mir folgenden Code für
>> die UART2
>
> Das reicht aber nicht. Du zitierst einen Text ohne ihn
> offensichtlich verstanden zu haben.
>
> Zeige dein komplettes Projekt (als *.zip Datei, vorher cleanen).

Nein die Frage hatte ich sowieso net wirklich verstanden da ich nicht 
wirklich direkt auf Registerebene arbeite.

Anbei ist mein komplettes Projekt mal zu sehen, dabei handelt es sich 
eben nur um ein Testprojekt mit Delays usw...

von uff basse (Gast)


Lesenswert?

Stefan M. schrieb:
> SOS_GPS_Tracker_BA2_V1.0.rar (4,6 MB)

Was ist an dem folgenden Satz nicht zu verstehen?
Zwei einfache Anweisungen und trotzdem geht's nicht?

uff basse schrieb:
> Zeige dein komplettes Projekt (als *.zip Datei, vorher cleanen).

von Stefan M. (stefan_m665)


Angehängte Dateien:

Lesenswert?

uff basse schrieb:
> Stefan M. schrieb:
>> SOS_GPS_Tracker_BA2_V1.0.rar (4,6 MB)
>
> Was ist an dem folgenden Satz nicht zu verstehen?
> Zwei einfache Anweisungen und trotzdem geht's nicht?
>
> uff basse schrieb:
>> Zeige dein komplettes Projekt (als *.zip Datei, vorher cleanen).

Wie schon erwähnt, ich arbeite nicht auf der Registerebene und 
vereinfache mir das Leben mit der CubeIDE und HAL Funktionen usw...

Deshalb wusste ich nicht genau, um was es sich dabei handelte

: Bearbeitet durch User
von uff basse (Gast)


Lesenswert?

Stefan M. schrieb:
> Deshalb wusste ich nicht genau, um was es sich dabei handelte

Deshalb wollen wir auch gerne alle Sourcen sehen damit nichts
anbrennt. Um den Kreis zu schliessen:

m.n. schrieb:
> Wichtig ist, daß die MODER + AFR des RX-Eingangs richtig gesetzt sind
> und daß bei USARTx->CR der Empfänger aktiviert wurde.

Bedeuted dass eben Pins initialisiert werden müssen, was dein Code
aber auch tut. Erst jetzt wissen wir es.

Das mit dem Clean von mir war voreilig, das ganze Projekt ist
einfach so gross und kann nicht kleiner "gecleant" werden.

Stefan M. schrieb:
> Wie schon erwähnt, ich arbeite nicht auf der Registerebene

Brauchst du auch nicht. Auf solche einfache Dinge kann man sich
in CubeMX schon verlassen.

von Stefan M. (stefan_m665)


Lesenswert?

Ich hoffe mal nun das die gesendeten Daten von mir ausreichen, da wie 
schon von dir erwähnt ich leider da nichts kleiner mehr machen könnte...
Danke!

von 123456 (Gast)


Lesenswert?

Hast du mal RX und TX miteinander verbunden und die von dir benötigten 8 
Bytes geschickt, damit der RX Interrupt ausgelöst wird?

von Stefan M. (stefan_m665)


Lesenswert?

123456 schrieb:
> Hast du mal RX und TX miteinander verbunden und die von dir benötigten 8
> Bytes geschickt, damit der RX Interrupt ausgelöst wird?

Danke für die gute Idee!
Ich habe den Code jetzt nun Analog zu UART6 angepasst und da habe ich 8 
Bytes drüber mal versendet und direkt über ein Kabel wieder zurück an 
die RX Leitung eingespeist. Hab auch wieder beides messen können mit dem 
Oszilloskop, nur leider Empfängt der Mikrocontroller wieder nichts...


Ich habe das Gefühl ich übersehe irgendwie etwas komplett 
offensichtliches...
Muss man etwas beachten bei UART wenn man nicht mehr das Discovery Board 
verwendet oder?

: Bearbeitet durch User
von 123456 (Gast)


Lesenswert?

Wie testest du, ob der Mikrocontroller etwas empfängt? Hast du einen 
Breakpoint im entsprechenden Interrupt Handler gesetzt?

von Stefan M. (stefan_m665)


Lesenswert?

123456 schrieb:
> Wie testest du, ob der Mikrocontroller etwas empfängt? Hast du einen
> Breakpoint im entsprechenden Interrupt Handler gesetzt?

Ich habe es auf 3 Arten getestet:
Ich lasse mir das Buffer in dem die Daten gelangen sollten, durchgehend 
an einem Display anzeigen.

Zweitens habe ich eine LED realisiert die getoggelt werden sollte, 
sobald der Interrupt ausgelöst wurde.

Und drittens habe ich auch über den Debugger versucht Daten 
rauszufinden, dabei konnte ich auch nicht fündig werden.

von uff basse (Gast)


Lesenswert?

Stefan M. schrieb:
> Ich habe das Gefühl ich übersehe irgendwie etwas komplett
> offensichtliches...

Ich sehe in der (deiner) while(1) Schleife keinen Aufruf Daten zu
empfangen.....

Stefan M. schrieb:
> Muss man etwas beachten bei UART wenn man nicht mehr das Discovery Board
> verwendet oder?

Wenn du alles (UART Leitungen) so verdrahtet hast wie auf dem
Discovery Board dann sollte es passen.

von Stefan M. (stefan_m665)


Lesenswert?

uff basse schrieb:
> Stefan M. schrieb:
>> Ich habe das Gefühl ich übersehe irgendwie etwas komplett
>> offensichtliches...
>
> Ich sehe in der (deiner) while(1) Schleife keinen Aufruf Daten zu
> empfangen.....
>
> Stefan M. schrieb:
>> Muss man etwas beachten bei UART wenn man nicht mehr das Discovery Board
>> verwendet oder?
>
> Wenn du alles (UART Leitungen) so verdrahtet hast wie auf dem
> Discovery Board dann sollte es passen.

Ich habe den Aufruf zum Datenempfangen vor der While Schleife gehabt. 
Hintergrundgedanke: Es sollten die Datenpakete empfangen werden und 
anschließend wird der Interrupt ausgelöstet. In diesem wird wieder ein 
Aufruf zur Datenabfrage gestartet usw.

Ich hab es nun auch sicherheitshalber versucht direkt in der While 
Schleife zu starten, funktionierte leider auch nicht...

von Harry L. (mysth)


Lesenswert?

Stefan M. schrieb:
> Es sollten die Datenpakete empfangen werden und
> anschließend wird der Interrupt ausgelöstet. In diesem wird wieder ein
> Aufruf zur Datenabfrage gestartet usw.

Nicht erst nach einem Datenpaket, sondern nach jedem Zeichen muß ein 
Interrupt ausgelöst werden!

Sowas:
1
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 
2
{
3
  HAL_UART_Receive_IT(&huart2, Rx_data, 4); 
4
}

ist totaler Murks!
Da kommt nach jedem 4. Zeichen ein Interrupt, und sobald du mal aus dem 
Tritt gerätst, geht nichts mehr.

So kann man sowas realisieren:
1
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 
2
{
3
  HAL_UART_Receive_IT(&huart2, Rx_data, 1); 
4
}

: Bearbeitet durch User
von Stefan M. (stefan_m665)


Lesenswert?

Harry L. schrieb:
> Stefan M. schrieb:
>> Es sollten die Datenpakete empfangen werden und
>> anschließend wird der Interrupt ausgelöstet. In diesem wird wieder ein
>> Aufruf zur Datenabfrage gestartet usw.
>
> Nicht erst nach einem Datenpaket, sondern nach jedem Zeichen muß ein
> Interrupt ausgelöst werden!
>
> Sowas:
>
>
1
> void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
2
> {
3
>   HAL_UART_Receive_IT(&huart2, Rx_data, 4);
4
> }
5
>
>
> ist totaler Murks!
> Da kommt nach jedem 4. Zeichen ein Interrupt, und sobald du mal aus dem
> Tritt gerätst, geht nichts mehr.
>
> So kann man sowas realisieren:
>
1
> void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
2
> {
3
>   HAL_UART_Receive_IT(&huart2, Rx_data, 1);
4
> }
5
>


Danke für die Antwort, mir geht es aber leider derzeit noch nicht was 
ich mit den Daten mache oder wie diese Ankommen. Sondern es besteht das 
Problem das NIE ein Interrupt ausgelöst wird,  da der Mikrocontroller 
nie was liest.
Ich hab es auch auf ein 1 Byte umgeändert, ebenso tut sich leider 
nichts.

Ich hab jetzt Testhalber einfach eine UART Verbindung mit dem Arduino 
aufgebaut und ich kann damit ohne Probleme die Daten lesen die ich 
versende. Nur liest wiedermal der Rechner nichts, was ich an ihm 
versende.... langsam weiß ich echt nicht mehr weiter...

von Harry L. (mysth)


Lesenswert?

Stefan M. schrieb:
> es besteht das
> Problem das NIE ein Interrupt ausgelöst wird
Hast du den Interrupt auch im CubeMX aktiviert?

von Stefan M. (stefan_m665)


Lesenswert?

Harry L. schrieb:
> Stefan M. schrieb:
>> es besteht das
>> Problem das NIE ein Interrupt ausgelöst wird
> Hast du den Interrupt auch im CubeMX aktiviert?

Ja beide Interrupts also GLOBAL Interrupt USART2 & USART6 sind beide 
aktiv

Danke!

: Bearbeitet durch User
von Harry L. (mysth)


Lesenswert?

Stefan M. schrieb:
> Ja beide Interrupts also GLOBAL Interrupt USART2 & USART6 sind beide
> aktiv

Dann solltest du das Problem zunächst in der Hardware suchen.

Stefan M. schrieb:
> Ich hab es auch auf ein 1 Byte umgeändert, ebenso tut sich leider
> nichts.

Hast du das auch beim 1. Aufruf (Initialisierung) geändert?

von Stefan M. (stefan_m665)


Lesenswert?

Harry L. schrieb:
> Stefan M. schrieb:
>> Ja beide Interrupts also GLOBAL Interrupt USART2 & USART6 sind beide
>> aktiv
>
> Dann solltest du das Problem zunächst in der Hardware suchen.
>

Ja ich werd mal eine weitere Leiterplatte auflöten und testen!
Danke allen hier für die Hilfe!

> Stefan M. schrieb:
>> Ich hab es auch auf ein 1 Byte umgeändert, ebenso tut sich leider
>> nichts.
>
> Hast du das auch beim 1. Aufruf (Initialisierung) geändert?

Ja habe ich gemacht

von m.n. (Gast)


Lesenswert?

Stefan M. schrieb:
> Ja ich werd mal eine weitere Leiterplatte auflöten und testen!
> Danke allen hier für die Hilfe!

Zuvor würde ich den betreffenden Pin als Ausgang schalten und "wackeln" 
lassen. Da sieht man, ob er richtig kontaktiert ist.
Man kann ihn auch als Eingang schalten ext. dran wackeln und den Zustand 
ausgeben lassen.

Oder man ließt die betreffenden Register und gibt deren hex-Wert aus.
Aber gut, neu löten ist wohl einfacher ;-)

von W.S. (Gast)


Lesenswert?

Stefan M. schrieb:
> Wie schon erwähnt, ich arbeite nicht auf der Registerebene und
> vereinfache mir das Leben mit der CubeIDE und HAL Funktionen usw...

Genau DAS kann man hier an diesem Thread sehen. Insbesondere, wie du 
dir das Leben vereinfachst.

Ja, du hast die ganze Zeit über etwas übersehen, nämlich daß du noch 
immer nicht begriffen hast, wie sowas funktioniert. Folglich kämpfst du 
die ganze Zeit gegen irgendwelche Funktionen von ST. Und daß du eine LED 
toggeln willst, um zu merken, daß da ein Interrupt passiert ist, wobei 
du gar nicht gemerkt hast, daß das, was du für eine ISR hältst, nur eine 
Callback-Funktion ist und das ganze eigentliche Interruptgeschehen 
woanders stattfindet.

Natürlich kann es sein, daß der Chip, den du auf deine eigene LP gelötet 
hast, gerade an diesem Pin kaputt ist. Es kann aber noch viel eher sein, 
daß du mit deinem Firmware-Entwurf irgend etwas falsch gemacht hast. 
Vielleicht würde es sich auf lange Sicht doch für dich lohnen, etwas 
mehr von dem Chip zu wissen als du momentan weißt. Und das nicht durch 
die Brille der HAL und Cube, sondern direkt.

Mal ne Frage: wo und wann hast du den Takt für diesen UART und für die 
GPIO's freigegeben? Oder für andere Peripherie-Cores, die du oder ST 
beim Initialisieren benutzt?

W.S.

von Stefan M. (stefan_m665)


Angehängte Dateien:

Lesenswert?

W.S. schrieb:
> Stefan M. schrieb:
>> Wie schon erwähnt, ich arbeite nicht auf der Registerebene und
>> vereinfache mir das Leben mit der CubeIDE und HAL Funktionen usw...
>
> Genau DAS kann man hier an diesem Thread sehen. Insbesondere, wie du
> dir das Leben vereinfachst.
>
> Ja, du hast die ganze Zeit über etwas übersehen, nämlich daß du noch
> immer nicht begriffen hast, wie sowas funktioniert. Folglich kämpfst du
> die ganze Zeit gegen irgendwelche Funktionen von ST. Und daß du eine LED
> toggeln willst, um zu merken, daß da ein Interrupt passiert ist, wobei
> du gar nicht gemerkt hast, daß das, was du für eine ISR hältst, nur eine
> Callback-Funktion ist und das ganze eigentliche Interruptgeschehen
> woanders stattfindet.
>

Mir ist schon bewusst, dass es sich dabei um eine Callback Funktion 
handelt, die ausgeführt wird, sobald das Datenpaket erhalten wird. Dies 
ist mir alles klar, nur vereinfach kann ich es auch einfach als 
Interrupt nennen für mich selbst !:)

> Natürlich kann es sein, daß der Chip, den du auf deine eigene LP gelötet
> hast, gerade an diesem Pin kaputt ist. Es kann aber noch viel eher sein,
> daß du mit deinem Firmware-Entwurf irgend etwas falsch gemacht hast.
> Vielleicht würde es sich auf lange Sicht doch für dich lohnen, etwas
> mehr von dem Chip zu wissen als du momentan weißt. Und das nicht durch
> die Brille der HAL und Cube, sondern direkt.
>

Wie erwähnt, ich hab die gleichen Einstellungen usw. alles gleich 
gemacht wie schon zuvor auf einem Discovery Board, es gibt garkein 
Unterschied. Mir fällt leider nichts weiteres mehr ein, woran es liegen 
könnte.

> Mal ne Frage: wo und wann hast du den Takt für diesen UART und für die
> GPIO's freigegeben? Oder für andere Peripherie-Cores, die du oder ST
> beim Initialisieren benutzt?
>
> W.S.

Die ganzen Takte wurden ebenso mit der CubeIDE intialisiert, siehe Bild.

Und ich habe nun eine weitere Platte verlötet usw, Verbindung mit dem 
Rechner klappt auch wieder, wie schon zuvor. Und das gleiche Problem wie 
zuvor ist wieder zu erkennen...

Hätte vielleicht noch wer Ideen?

von Marcel B. (mabu1)


Lesenswert?

Bist du dir sicher, dass die Pins alle richtig sind und deine Bibliothek 
für das Custom-Design stimmt?

Prüf' doch bitte nochmal Pin-Nummer gegen Datenblatt oder stell' zur 
Hardware etwas zur Verfügung. Der bereits vorgeschlagene Test über GPIO 
Input oder Output die Basisfunktionalität des Pins zu prüfen ist auch 
sinnvoll.

von W.S. (Gast)


Lesenswert?

Stefan M. schrieb:
> Dies
> ist mir alles klar, nur vereinfach kann ich es auch einfach als
> Interrupt nennen für mich selbst

Bleibe lieber bei der Wahrheit. Das vereinfacht sowohl das eigene Denken 
als auch die Diskussion mit anderen Leuten.

Also, du sagst, daß alles funktioniert, wenn du deine Firmware auf einen 
baugleichen Chip auf einem Nucleo-Board brennst. Bloß bei deinen eigenen 
Leiterplatten funktioniert es nicht. Da schätze ich mal, daß dir da 
keiner wirklich helfen kann, weil so ein Fehler nur erklärt werden kann, 
wenn eines hiervon zutrifft:
- beim Nucleo-Board wird der µC anders verschaltet als auf deinem Board. 
Kann sein, daß deine Schaltung fehlerhaft ist oder SO nicht zutrifft. 
z.B. ein anderer Pegel an einem Boot- bzw. Debug-Bein.
- der µC auf dem Nucleo-Board ist echt, die von dir gekauften µC sind 
Fakes oder sind anderweitig kaputt.
- in deiner Firmware steckt ein fieser Fehler, an den weder du gedacht 
hast noch irgendein Leser deines Beitrages kommen würde, weil der sich 
nur nach den von dir geschilderten Dingen richten kann.

W.S.

von Stefan M. (stefan_m665)


Angehängte Dateien:

Lesenswert?

Marcel B. schrieb:
> Bist du dir sicher, dass die Pins alle richtig sind und deine Bibliothek
> für das Custom-Design stimmt?
>

Ja ich bin mir sehr sicher, ich habe gerade nochmal alles überprüft und 
bin mir zu 100% sicher das es vom Pinning her passt. Ich werd mal paar 
Bilder von der Schaltung herzeigen...

> Prüf' doch bitte nochmal Pin-Nummer gegen Datenblatt oder stell' zur
> Hardware etwas zur Verfügung. Der bereits vorgeschlagene Test über GPIO
> Input oder Output die Basisfunktionalität des Pins zu prüfen ist auch
> sinnvoll.

Ich hab den Test gerade eben mal gemacht, ich hab beide UART Pins als 
OUTPOUT definiert und habe die jeweils alle 500ms Toggeln lassen 
einfach.
Beides konnte ich mit dem Oszi nachmessen und funktioniert auch alles 
gescheit.

Anbei wie erwähnt mal der Pfad vom UART zum SIM Modul...

von Stefan M. (stefan_m665)


Lesenswert?

W.S. schrieb:
> Stefan M. schrieb:
>> Dies
>> ist mir alles klar, nur vereinfach kann ich es auch einfach als
>> Interrupt nennen für mich selbst
>
> Bleibe lieber bei der Wahrheit. Das vereinfacht sowohl das eigene Denken
> als auch die Diskussion mit anderen Leuten.
>
> Also, du sagst, daß alles funktioniert, wenn du deine Firmware auf einen
> baugleichen Chip auf einem Nucleo-Board brennst. Bloß bei deinen eigenen
> Leiterplatten funktioniert es nicht. Da schätze ich mal, daß dir da
> keiner wirklich helfen kann, weil so ein Fehler nur erklärt werden kann,
> wenn eines hiervon zutrifft:
> - beim Nucleo-Board wird der µC anders verschaltet als auf deinem Board.
> Kann sein, daß deine Schaltung fehlerhaft ist oder SO nicht zutrifft.
> z.B. ein anderer Pegel an einem Boot- bzw. Debug-Bein.
> - der µC auf dem Nucleo-Board ist echt, die von dir gekauften µC sind
> Fakes oder sind anderweitig kaputt.
> - in deiner Firmware steckt ein fieser Fehler, an den weder du gedacht
> hast noch irgendein Leser deines Beitrages kommen würde, weil der sich
> nur nach den von dir geschilderten Dingen richten kann.
>
> W.S.

Die Schaltung ist natürlich unterschiedlich als 1:1 von einem Discovery 
Boards, da viele Funktionen einfach nicht genutzt werden die für meine 
Anwendung notwendig sind.

Ebenso kann es sich nicht um einen "Fake uC" handeln, da dieser auf 
Mouser bestellt wurde und der Hersteller offensichtlich STM ist.

Ich habe bereits mein ganzes STM32-Projekt verteilt und ebenso verteile 
ich auch gern meine Schaltung, wie auch in der Antwort davor getan. Auch 
auf den STM32-Discovery Boards gibt es keine extra Beschaltung für die 
UART-Schnittstelle.

Ebenso erklärt es für mich eben nicht, das jede andere Funktionalität 
gegeben ist vom Rechner her, also Schaltung, Inputs einlesen usw usw., 
ausser eben das Einlesen einer UART-Schnittstelle per RX Pin.
Für mich erklärt sich das alles genauso wenig, wie auch wahrscheinlich 
für dich, wenn alles schon zuvor auf einem Discovery Board gelaufen ist. 
Deshalb stelle ich auch die Frage hier...

von Stefan M. (stefan_m665)


Lesenswert?

Ich kann hiermit melden ich hab endlich das Problem nach 2 Tagen 
gefunden:)!

Zur Info beim Problem handelte es sich nicht um Unwahrheiten oder "Fake 
Chips" oder sonstiges :)

Sondern das Problem war das durch den erstellten Code vom CubeIDE, die 
UARTs zuerst initialisiert wurden bevor es die GPIOs wurden. Dies hatte 
irgendwie den Effekt das eben die UART Kommunikation nicht gescheit lief 
und dies hat sich nun endlich behoben!

Nun funktioniert auch mein kompletter Code wie schon zuvor bei einem 
Discovery Board :)!
Ich danke allen für die Hilfreichen antworten :)!

von ki? (Gast)


Lesenswert?

Das glaube ich fast nicht. Zumindest in dem von dir geteilten Projekt 
wird das richtig herum gemacht.
1
  MX_GPIO_Init();
2
  MX_I2C1_Init();
3
  MX_USART2_UART_Init();
4
  MX_USART6_UART_Init();

von Stefan M. (stefan_m665)


Lesenswert?

ki? schrieb:
> Das glaube ich fast nicht. Zumindest in dem von dir geteilten Projekt
> wird das richtig herum gemacht.
>
>
1
>   MX_GPIO_Init();
2
>   MX_I2C1_Init();
3
>   MX_USART2_UART_Init();
4
>   MX_USART6_UART_Init();
5
>

Ja das stimmt, ich merke gerade auch das ich es auch wieder so rum habe 
nach dem ich wieder was am Programm geändert habe. Nur UART6 wird vor 
UART2 initialisiert, ich versteh echt nicht warum es davor nicht 
funktioniert hat. Ich weiß nur jetzt gerade funktioniert es obwohl ich 
sonst nichts verändert habe...

von m.n. (Gast)


Lesenswert?

Stefan M. schrieb:
> Sondern das Problem war das durch den erstellten Code vom CubeIDE, die
> UARTs zuerst initialisiert wurden bevor es die GPIOs wurden.

Fang erst garnicht an, daß auch noch zu glauben oder sogar als Wissen zu 
verinnerlichen.
Ich sehe mir den HAL-Krempel nicht an, aber zu jeder Initialisierung 
einer USART gehört auch die Initialisierung der Portpins. Andernfalls 
hätte das Senden ja auch nicht funktionieren dürfen.

Stefan M. schrieb:
> Ich weiß nur jetzt gerade funktioniert es obwohl ich
> sonst nichts verändert habe...

Du hättest zwischen den beiden Tagen Fehlersuche einen Tag Pause 
einlegen sollen.

von W.S. (Gast)


Lesenswert?

Stefan M. schrieb:
> Dies hatte
> irgendwie den Effekt das eben die UART Kommunikation nicht gescheit lief
> und dies hat sich nun endlich behoben!

Tja, immer wieder das "irgendwie".
Bloß nicht wissen wollen, was tatsächlich abgeht.

Also, zum Einstellen von Pin-Funktionalitäten muß zuvor der 
entsprechende Core über einen Takt verfügen, sonst kann man in die 
zugehörigen Register schreiben "im Himmel ist Jahrmarkt" und den Chip 
interessiert es nicht.

Das ist vom Prinzip her bei allen Peripherie-Cores das gleiche, die 
Auswirkungen sind bloß von Fall zu Fall unterschiedlich, weil es ab 
Reset jeweilige Default-Belegungen gibt und die Projekte eben 
unterschiedlich sind. Das Manual zu lesen, ist da weitaus hilfreicher, 
als sich nur auf irgendwelche maschinell erzeugten Firmware-Rümpfe zu 
verlassen und zu sagen "da ich nicht wirklich direkt auf Registerebene 
arbeite".

W.S.

von W.S. (Gast)


Lesenswert?

Stefan M. schrieb:
> Ebenso kann es sich nicht um einen "Fake uC" handeln, da dieser auf
> Mouser bestellt wurde und der Hersteller offensichtlich STM ist.

Ist dir eigentlich klar, daß man woanders auf jedes Chip-Gehäuse 
drauflasern kann, was man will? Was ist dabei offensichtlich?

Mir kommt da der Witz vom Kellner im Restaurant in den Sinn: "Welchen 
Wein wünschen die Herrschaften? Wir haben alle Etiketten da."

Ich habe auch einige OpV's von Analog Devices da, die eben keine OpV's 
sind und schon gar nicht von AD hergestellt worden sind.

W.S.

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.