ARM STM32 Uart Aufruf (Zeitpunkt Senden)

Gast #5322877
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
}
Gast #5322886
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).
#5323008
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.