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


von PunchBoy (Gast)


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)


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)


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)


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.

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.