Forum: Mikrocontroller und Digitale Elektronik STM32: Compiler optimiert UART HAL-Funktionsaufruf weg


von Alexander K. (alexander_43)


Lesenswert?

Hallo Zusammen,
ich verwende für die Programmierung eines STM32l053 die Keil IDE mit 
einem Projekt aus CubeMX und dessen HAL-Funktionen.

Zum Senden mit der UART habe ich zunächst die Funktion 
HAL_UART_Transmit_IT(...) direkt aus der Main-Funktion aufgerufen und da 
hat auch alles wunderbar geklappt. Jetzt habe ich aber den Code 1:1 in 
eine eigene Funktion gepackt und nun geht nichts mehr.
Zum Test habe ich deshalb einen Portpin in dieser "eigenen" Funktion 
getoggelt und dann wurde auch die HAL-Funktion für die UART aufgerufen. 
Sobald ich das Toggeln auskommentiere, sendet auch die UART nichts mehr.
Dann habe ich die Compileroptimierung ausgeschaltet und siehe da, die 
UART-Funktion wird auch ohne das Toggeln des Portpins ausgeführt. Es 
sieht also so aus, als ob der Compiler den Funktionsaufruf wegoptimiert.

Hier mal mein code:
Ausschnitt aus der Main:
1
 
2
send_to_reader(slave_addr_cycle,  statusbits_to_reader, command_to_reader);//Sende Daten

Funktion:
1
void send_to_reader(uint8_t reader_number, uint8_t statusbits[], uint8_t command[])
2
{
3
  uint16_t bus_tx_buffer_1[15];//9n1 UART
4
//!!!!!Wenn hier ein Portpin getoggelt wird, geht auch das Senden über die UART!!!!!!
5
  
6
  //Datenpaket vorbereiten
7
      bus_tx_buffer_1[0] = MASTER_ADRESSE;
8
      bus_tx_buffer_1[1] = reader_number;
9
      bus_tx_buffer_1[2] = statusbits[(reader_number-1)];
10
      bus_tx_buffer_1[3] = command[(reader_number-1)];
11
      bus_tx_buffer_1[4] = (bus_tx_buffer_1[0] + bus_tx_buffer_1[1] + bus_tx_buffer_1[2] + bus_tx_buffer_1[3]);
12
      //Setze Neunbit:
13
      bus_tx_buffer_1[4] = bus_tx_buffer_1[4] + (1U << 8);//Neuntes Datenbit
14
      HAL_UART_Transmit_IT(&huart1, (uint8_t*)bus_tx_buffer_1, 5);
15
      
16
      command[(reader_number-1)] = 0; //Nach dem Senden wieder Kommando löschen, damit es nur einmal gesendet wird
17
}

Füge ich den code aus der Funktion 1:1 an die Stelle aus der main ein, 
wo der Aufruf stattfindet, funktioniert die Sache
Kann mir jemand weiterhelfen?

von Jim M. (turboj)


Lesenswert?

Wartet HAL_UART_Transmit_IT() bis die Daten aus dem UART raus sind?

Wenn nicht, muss der Puffer static oder global definiert sein - 
ansonsten werden die Daten auf dem Stack einfach irgendwann 
überschrieben.

von Alexander K. (alexander_43)


Lesenswert?

Danke für die Antwort!
Ich habe den Puffer static deklariert und jetzt funktioniert es!

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.