STM32 HAL UART-Übertragung

Ich versuche, Daten von STM32f103 mit UART an ein Arduino-Board zu senden. Daten werden nicht richtig empfangen. Der Code wird mit STM32CUBEMX generiert und hier ist der Teil, den ich hinzugefügt habe:

STM32-Code (Senden):

uint8_t Test[] = "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 \n"; //Data to send 

HAL_UART_Transmit(&huart1,Test,sizeof(Test),10);// Sending in normal mode
HAL_Delay(1000);
HAL_UART_Transmit_DMA(&huart1,Test,sizeof(Test));// Sending in DMA mode
HAL_Delay(1000);

    /* USART1 init function */
static void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }

}

Die empfangenen Daten sind:

  {1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 1}
enter code here

Sowohl im DMA- als auch im normalen Modus sind die empfangenen Daten ziemlich ähnlich. Die UART-Baudrate beträgt 115200.

Warum werden meine Daten abgeschnitten? Ist es ein Array-Bounds-Problem? Oder stoße ich an die Grenze meines Puffers?

Bearbeiten:

Arduino-Code (Empfangen):

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 9); // RX, TX ports

void setup() {
  // set the data baud rate 
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. 
  }
  mySerial.begin(115200);
}

void loop() { 
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
}

Die Datenübertragung zwischen zwei Arduino-Boards funktioniert gut.

Welche Baudrate verwendest du?
Was sagt der Debugger? Sind Sie sicher, dass es sich um ein STM32-Seitenproblem handelt, was ist mit dem Arduino? Was ist mit der UART-Initialisierung?
@BenceKaulics Debugger funktioniert nicht (Kieler Version 5)!! Mein Code funktioniert gut zwischen zwei Arduino-Boards. UART-Initialisierung hinzugefügt.
Könnten Sie den Code für die Pin-Konfiguration/Initialisierung teilen? Ich kann es nicht herausfinden
@VanGo Leider habe ich den Code nicht. Ich habe gerade das Board ausgewählt und den USART1 in STM32CubeMX aktiviert und der Code wurde von STM32CubeMX generiert. Ich habe mit diesem Video auf YouTube begonnen, youtube.com/watch?v=ZYxNote8JQ0&t=9s

Antworten (3)

Je höher die Baudrate ist, desto schneller werden Daten gesendet/empfangen, aber es gibt Grenzen, wie schnell Daten übertragen werden können. Sie werden normalerweise keine Geschwindigkeiten über 115200 sehen - das ist für die meisten Mikrocontroller schnell. Wenn Sie zu hoch werden, werden Sie beginnen, Fehler auf der Empfängerseite zu sehen, da Takte und Abtastperioden einfach nicht mithalten können.

Niedrigere Baudrate testen.

Sie erhalten ~67 Zeichen, was bei 10 Bit/Zeichen 670 Bit entspricht. Da Ihr Timeout (Parameter 4) auf 10 ms oder 0,01 s eingestellt ist, scheint die durchschnittliche Bitrate bei etwa 67000 Bit/s zu liegen. Ich vermute, dass Sie mit 115200 Baud mit einer gewissen Verzögerung zwischen den Zeichen übertragen, was eine effektive Bitrate von 67000 Bit / s ergibt.

Daher laufen nach 67 Zeichen 10 ms ab und die Senderoutine kehrt zurück.

Um das Problem zu beheben, erhöhen Sie den Wert von Parameter 4 – den Timeout-Wert – auf mindestens 20.

Überprüfen Sie auch, ob Ihre CPU-Taktfrequenz in Ihrem Projekt-Setup-Code korrekt definiert ist, und messen Sie sie, um sicherzustellen, dass sie innerhalb von 2,5 % des beabsichtigten Werts liegt.

Ich bin mir ziemlich sicher, dass das Timeout gut ist, wenn der Code von CubeMX generiert wird - es generiert eine Zeile wie diese, die SysTick auf 1 ms konfiguriert: HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);und SysTick wird für diese Verzögerungen in der HAL von ST verwendet.
Die CPU-Frequenz ist definiert, wie @JanDorniak sagte. Ich habe den 4. Parameter geändert und immer noch das gleiche Problem. Baudrate ist 115200.
@JanDorniak Erstens ist das, was STM32CubeMX generiert, nicht immer gut. Außerdem generiert Cube solche Aufrufe nicht, HAL_UART_Transmit(&huart1,Test,sizeof(Test),10);daher war der letzte Parameter benutzerdefiniert. Ein etwas größerer Timeout ist nie schlecht.
@BenceKaulics Ich hatte Probleme mit anderen Codeteilen, die von CubeMX oder mit HAL selbst generiert wurden, aber nie mit der Uhrenkonfiguration. Was das Timeout betrifft - ja, es ist zu kurz.
@Mehran können Sie auf einem Oszilloskop bestätigen, dass nur 67 Zeichen gesendet werden? Es könnte hilfreich sein, etwas wie uint8_t Test[] = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF..." zu senden. So ist jedes 10. Zeichen gut sichtbar.
Daten werden im Logikanalysator angezeigt! Ich habe die Baudrate (115200 auf 57600) geändert und es funktioniert jetzt gut! Ich denke, die Baudraten von STM32- und Arduino-Boards stimmen nicht überein!
@Mehran Gute Nachrichten! Aber sowohl STM32F103 als auch Arduino sollten problemlos mit 115200 Baud umgehen können. Senden Sie so etwas wie "UUUUUU" und messen Sie die Baudrate. Die Faustregel lautet, innerhalb von 2,5 % der beabsichtigten Baudrate zu liegen. (ein Viertel Bit Schlupf über 10 Bit)
@Mehran Sie können auch versuchen, huart1.Init.BaudRate auf 113200, 114200, 115200, 116200, 117200 einzustellen, bis Sie einen funktionierenden Wert finden. Aber Sie müssen das Grundproblem angehen, wenn Sie ein professionelles Produkt entwickeln!

Die SoftwareSerial-Bibliothek von Arduino kann nicht mit hohen UART-Raten arbeiten. Verwenden Sie es beispielsweise niemals mit Geschwindigkeiten über 38400 auf Uno/Nano-Boards. Wenn Sie immer noch 115200 wollen, versuchen Sie es stattdessen mit HardwareSerial.

Ich wünschte, ich könnte dies als die beste Antwort markieren. Ich habe den SOFTWARE- Serienhinweis verpasst. Danke @almaz.