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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren