Forum: Mikrocontroller und Digitale Elektronik HAL_UART_TxCpltCallback


von joule (Gast)


Lesenswert?

Guten Tag,
ich versuche gerade in einem STM32F1 eine Software Änderung zu machen.
Ich habe bis jetzt ATmels programmiert.
Da Projekt wurde mit CubeMx und Atolic begonnen.
Ich versuche gerade den  HAL_UART_TxCplt Interrupt einzubauen.
Wenn ich was über die Uart Sende bekomme ich auch die 
HAL_UART_TxCpltCallback angesprungen.
Aber irgendwie sind die Daten noch nicht alle gesendet.
verstehe ich den Interrupt  HAL_UART_TxCpltCallback falsch?
Wird dieser nicht ausgelöst wenn alle Zeichen gesendet sind?
Ich muss damit den RS485 Treiber auf Empfang umschalten.
Das senden wurde mit HAL_UART_Transmit_IT()realisiert.


Danke für die Hilfe

von Harry L. (mysth)


Lesenswert?

Der Callback wird aufgerufen, sobald das letzte Zeichen an den UART 
übergeben wurde.
Das eigentliche Senden dieses Zeichen dauert dann (je nach Baudrate) 
natürlich noch ein gewisse Zeit.

von joule (Gast)


Lesenswert?

Harry L. schrieb:
> Der Callback wird aufgerufen, sobald das letzte Zeichen an den
> UART
> übergeben wurde.
> Das eigentliche Senden dieses Zeichen dauert dann (je nach Baudrate)
> natürlich noch ein gewisse Zeit.

Das ist aber bei Atmel anders da wird der Interrupt ausgelöst wenn es 
komplett gesendet wurde.
Wie steuert man dann beim STM32 Den Treiber für die 4845?

von Gerd E. (robberknight)


Lesenswert?

joule schrieb:
> ich versuche gerade in einem STM32F1
[...]
> Ich muss damit den RS485 Treiber auf Empfang umschalten.

Nimm das nächste mal einen neueren STM32, die haben ein Driver Enable 
für genau diesen Zweck in Hardware. Z.B. STM32F072.

Die STM32F1 waren die ersten STM32er überhaupt, Release war 2007. Das 
Design hat also jetzt schon über 12 Jahre auf dem Buckel.

von joule (Gast)


Lesenswert?

Gerd E. schrieb:
> Nimm das nächste mal einen neueren STM32, die haben ein Driver Enable
> für genau diesen Zweck in Hardware. Z.B. STM32F072.
>
> Die STM32F1 waren die ersten STM32er überhaupt, Release war 2007. Das
> Design hat also jetzt schon über 12 Jahre auf dem Buckel.

Ich habe das Projekt so übernommen die Hardware ist bestand.

von STK500-BEsitzer (Gast)


Lesenswert?

Einfach mal hier nachlesen:

https://www.st.com/content/ccc/resource/technical/document/user_manual/72/52/cc/53/05/e3/4c/98/DM00154093.pdf/files/DM00154093.pdf/jcr:content/translations/en.DM00154093.pdf

joule schrieb:
> Das ist aber bei Atmel anders da wird der Interrupt ausgelöst wenn es
> komplett gesendet wurde.

HAL bedeutet Hardware Abstraction Layer.
Es ist eine Library, die einem das Konfigurieren und Register-Gehampel 
der Schnittstellen abnimmt.

Das USART der STM32 bietet eigentlich die gleichen Interrupts wie der 
AVR.
Die Callbacks wären die ISR dazu.

von joule (Gast)


Lesenswert?

STK500-BEsitzer schrieb:
> HAL bedeutet Hardware Abstraction Layer.
> Es ist eine Library, die einem das Konfigurieren und Register-Gehampel
> der Schnittstellen abnimmt.
>
> Das USART der STM32 bietet eigentlich die gleichen Interrupts wie der
> AVR.
> Die Callbacks wären die ISR dazu.

Danke für das Dokoment. Ich habe aus diesen Dokument die
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) entnommen.
1
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
2
{
3
  if (huart == &huart2)
4
  {
5
    printf("HAL_UART_TxCpltCallback\n");  // Ausgabe über die SWO
6
    
7
  }
8
}

von Stefan (Gast)


Lesenswert?

Ist jetzt Dein Problem damit eigentlich gelöst?
Denn die Funktion 'HAL_UART_TxCpltCallback' kanntest Du doch schon zu 
Beginnn des Threads.

Das Problem war ja, dass diese Funktion aus Deiner Sicht nicht das 
macht, was Du erwartest hast (nämlich erst aufgerufen zu werden, wenn 
das letzte Zeichen tatsächlich gesendet wurde, und nicht bereits, wenn 
es an den UART übergeben wurde).

von hfhd (Gast)


Lesenswert?

wann kommt die meldung TxClpt

wieviele bytes sendest du mit HAL_UART_Transmit_IT() ?


es fehlt an code und informationen

von W.S. (Gast)


Lesenswert?

joule schrieb:
> Da Projekt wurde mit CubeMx und Atolic begonnen.
> Ich versuche gerade den  HAL_UART_TxCplt Interrupt einzubauen.

Warum nur läßt du dich auf diesen Krampf ein? Dein Problem ist 
offensichtlich NICHT der konkrete Chip und sein Verhalten, sondern das 
Verhalten dieses Bibliotheks-Zeugs von ST, wo man sich erstmal durch 
dessen Quellcode durchwühlen muß, um herauszukriegen, was da eigentlich 
so abgeht.

Lies lieber dort mal:
Beitrag "STM32 USART mit falscher Baudrate"
Dort hatte ich damals das gepostet:
https://www.mikrocontroller.net/attachment/316790/STM32F103C8T6.ZIP
Das sollte eigentlich ausreichen, um dir zu zeigen, wie man mit den 
UART's bei den STM32F1xx umgeht - OHNE Cube und Konsorten. Und das 
angenehme ist, daß es tatsächlich funktioniert. Ohne Callback-Funktionen 
und anderes Zeugs, was das Leben bloß kompliziert macht. Und mit nur 
wenigen Änderungen funktioniert das dann auch bei den STM32F3xx und 
höher.

Mein dringender Rat: Löse dich von Cube und Konsorten und bahne dir 
deinen eigenen Weg. Das mag am Anfang etwas mühsamer sein, weil man 
tatsächlich die diversen Manuals lesen und verstehen muß, aber dafür hat 
man eben Lowlevel-Treiber, die schlicht und einfach funktionieren und 
ein verständliches Interface bieten.

Je mehr man selber an solchen Treibern im eigenen Portfolio hat, desto 
einfacher wird es mit der Zeit, ein neues Projekt selber aufzustellen 
und durchzuziehen.

W.S.

von pegel (Gast)


Lesenswert?

W.S. schrieb:
> Mein dringender Rat:

Es geht nicht ohne, oder?

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.