Forum: Mikrocontroller und Digitale Elektronik SMT32 - Uart Receive will nicht


von STM (Gast)


Lesenswert?

Hallo,

ich habe ein kleines Problem mit dem Empfang von Daten auf der UART 
zwischen einem STM32F4 Controller und einem Sensor-Modul.

Das Modul sendet ohne Hardware-Flow-Control.

Mit dem STM32F4 kann ich nach Initialisierung mittels HAL-Routinen nur 
senden, aber auf der RX-Leitung kann ich keinerlei Daten entgegen 
nehmen.

Die Initialisierung ist mittels Cube-MX durchgeführt. Keien einzige von 
den verschiedenen UART-Receive-Funktionen scheint zu funktionieren...
Senden kann ich Mittels Uart_Transmit_IT, aber im Empfang bleibt einfach 
alles tot...

Hat jemand damit Erfahrungen?

von Programmier Spezialist (Gast)


Lesenswert?

STM schrieb:
> Hat jemand damit Erfahrungen?

Ja.

von STM (Gast)


Lesenswert?

...und gibt es vielleicht einen Tip, wie man die UART dazu bekommt, auch 
auf empfangene Zeichen zu reagieren?

von Programmier Spezialist (Gast)


Lesenswert?

STM schrieb:
> ...und gibt es vielleicht einen Tip, wie man die UART dazu bekommt, auch
> auf empfangene Zeichen zu reagieren?

Ja.

von Christopher J. (christopher_j23)


Lesenswert?

STM schrieb:
> Mit dem STM32F4 kann ich nach Initialisierung mittels HAL-Routinen nur
> senden, aber auf der RX-Leitung kann ich keinerlei Daten entgegen
> nehmen.

Gibt es dazu auch Code?

STM schrieb:
> Die Initialisierung ist mittels Cube-MX durchgeführt. Keien einzige von
> den verschiedenen UART-Receive-Funktionen scheint zu funktionieren...
> Senden kann ich Mittels Uart_Transmit_IT, aber im Empfang bleibt einfach
> alles tot...

Meine Glaskugel sagt mir, dass du die Interrupt-API benutzt und sofort 
nach der Funktion HAL_UART_Transmit_IT den Receive-Buffer ausliest. Das 
funktioniert so nicht, weil Interrupt- und DMA-API asynchron arbeiten. 
Außerdem sagt mir meine Glaskugel, dass du das HAL-User-Manual für 
deinen Controller nicht gelesen hast.

Als Lösungsvorschlag empfehle ich UM1725, insbesondere 67.2.1 "UART 
Firmware driver API description - How to use this driver"

von STM (Gast)


Lesenswert?

Ist es denn überhaupt möglich, den IT-Betrieb zu nutzen, wenn man 
asynchron Senden und Empfangen will, oder muss man so etwas zwingend 
über DMA angehen?

Ich frage das, weil das USART_DR Register ja anscheinend sowohl für 
Senden und Empfangen genutzt wird.

von DanVet (Gast)


Lesenswert?

STM schrieb:
> Ist es denn überhaupt möglich, den IT-Betrieb zu nutzen, wenn man
> asynchron Senden und Empfangen will, oder muss man so etwas zwingend
> über DMA angehen?
>
> Ich frage das, weil das USART_DR Register ja anscheinend sowohl für
> Senden und Empfangen genutzt wird.

Vielleicht werden beim Lesen und Schreiben des Registers 
unterschiedliche Adressen angesprochen?
Read the manual!

von Christopher J. (christopher_j23)


Lesenswert?

STM schrieb:
> Ist es denn überhaupt möglich, den IT-Betrieb zu nutzen, wenn man
> asynchron Senden und Empfangen will

Natürlich ist es das und es ist auch nur asynchron möglich bzw. so 
gedacht. Sonst kann man auch gleich die blocking-API nehmen.

STM schrieb:
> Ich frage das, weil das USART_DR Register ja anscheinend sowohl für
> Senden und Empfangen genutzt wird.

So wie du diese Frage stellst, scheinst du dich noch nie mit der 
Hardware von irgendeinem uC auf Registerebene auseinandergesetzt zu 
haben. Das würde ich unbedingt mal empfehlen bevor du dir mit CubeMX 
irgendwas zusammenklickst. Wenn dir das zu kompliziert ist, nimm lieber 
Arduino oder mbed.

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.