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!
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?
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).
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).
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...
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).
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
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.
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?
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.
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.
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...
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:
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:
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:>>
>> 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:>
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...
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!
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?
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
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 ;-)
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.
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?
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.
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.
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...
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...
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 :)!
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...
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.
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.
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.