Forum: Mikrocontroller und Digitale Elektronik ARM STM32 Uart Aufruf (Zeitpunkt Senden)


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von PunchBoy (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo!

ich mache meine ersten Schritte mit ARM und habe eine 
Einsteiger-Verständnisfrage:

Ich mache auf einem STM32 eine UART-Ausgabe und rufe die von ST 
mitgelieferte Library-Function auf (Code folgt).

Die Frage ist: an welcher Stelle wird das Senden wirklich gestartet?

Schrittweises debugging zeigt mir, dass meine Daten genau in dem Schritt 
gesendet werden, wo ich die unten stehende Funktion verlasse und zum 
Hauptprogramm zurückkehre.
Wenn das so ist: warum?
(beim AVR setze ich ja z.B. das Datenbyte und dann gehts los, das ist 
mir verständlicher).
1
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
2
{
3
  /* Check that a Tx process is not already ongoing */
4
  if(huart->gState == HAL_UART_STATE_READY)
5
  {
6
    if((pData == NULL ) || (Size == 0U))
7
    {
8
      return HAL_ERROR;
9
    }
10
11
    /* Process Locked */
12
    __HAL_LOCK(huart);
13
14
    huart->pTxBuffPtr = pData;
15
    huart->TxXferSize = Size;
16
    huart->TxXferCount = Size;
17
18
    huart->ErrorCode = HAL_UART_ERROR_NONE;
19
    huart->gState = HAL_UART_STATE_BUSY_TX;
20
21
    /* Process Unlocked */
22
    __HAL_UNLOCK(huart);
23
24
    /* Enable the UART Transmit Data Register Empty Interrupt */
25
    SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE);
26
27
    return HAL_OK;
28
  }
29
  else
30
  {
31
    return HAL_BUSY;
32
  }
33
}

von Curby23523 N. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
PunchBoy schrieb:
> Die Frage ist: an welcher Stelle wird das Senden wirklich gestartet?
>
> Schrittweises debugging zeigt mir, dass meine Daten genau in dem Schritt
> gesendet werden, wo ich die unten stehende Funktion verlasse und zum
> Hauptprogramm zurückkehre.
> Wenn das so ist: warum?
> (beim AVR setze ich ja z.B. das Datenbyte und dann gehts los, das ist
> mir verständlicher).

Deswegen ist es durchaus hilfreich bei so einer simplen Peripherie wie 
der U(S)ART die Register direkt zu beschreiben, anstele von HAL.

Hast du dir schonmal die Register davon angesehen? Ich verwende z.B. 
eine USART für MIDI und die Initialisierung sind 7 Zeilen, wobei ich in 
jeder Zeile einzelnd(!) über eine Maske ein Bit setze.

Also genauso wenig zu konfigurieren, wie bei einem AVR. Natürlich muss 
du zusätzlich die Clock-leitung aktivieren.

Die Daten werden übrigens losgeschickt, wenn du in Datenregister 
schreibst. genau wie beim AVR. Schreiben und warten bis das TC Flag 
gesetzt ist (Transmission Complete).

von Mike R. (thesealion)


Bewertung
0 lesenswert
nicht lesenswert
Wann deine Daten genau gesendet werden ist in deinem Code nicht 
sichtbar.

An dieser Stelle schaltet du den T(ransmit) E(mpty) Interrupt ein.
1
    /* Enable the UART Transmit Data Register Empty Interrupt */
2
    SET_BIT(huart->Instance->CR1, USART_CR1_TXEIE);

Und die Interrupt Routine sorgt dann dafür ein Byte aus deinem 
Ausgangsbuffer in das DataRegister zu schreiben.

von Mike R. (thesealion)


Bewertung
0 lesenswert
nicht lesenswert
Der Vorteil hier ist halt, du musst nicht jedes Byte selber senden, 
sondern die Funktionen der HAL kümmern sich schon darum, das du einen 
kompletten String verschicken kannst.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.