Transmisión STM32 HAL UART

Estoy tratando de enviar datos por STM32f103 a una placa Arduino usando UART. Los datos no se reciben correctamente. El código se genera usando STM32CUBEMX y aquí está la parte que agregué:

Código STM32 (transmitir):

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();
  }

}

los datos recibidos son:

  {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

en los modos DMA y normal, los datos recibidos son bastante similares. La tasa de baudios de UART es 115200.

¿Por qué se truncan mis datos? ¿Es un problema de límites de matriz? ¿O estoy llegando al límite de mi búfer?

Editar:

Código Arduino (Recibir):

#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());
  }
}

La transmisión de datos funciona bien entre dos placas Arduino.

¿Qué velocidad de transmisión estás usando?
¿Qué dice el depurador? ¿Estás seguro de que es un problema secundario de STM32? ¿Qué pasa con Arduino? ¿Qué pasa con la inicialización de UART?
@BenceKaulics Debugger no funciona (Kiel versión 5)!! Mi código funciona bien entre dos placas Arduino. Se agregó la inicialización de UART.
¿Podría compartir el código para la configuración/inicialización del pin? Parece que no puedo entenderlo
@VanGo Desafortunadamente no tengo el código. Simplemente seleccioné la placa y habilité el USART1 en STM32CubeMX y el código fue generado por STM32CubeMX. Empecé con este video en youtube, youtube.com/watch?v=ZYxNote8JQ0&t=9s

Respuestas (3)

Cuanto mayor sea la velocidad en baudios, más rápido se envían/reciben los datos, pero existen límites en cuanto a la rapidez con la que se pueden transferir los datos. Por lo general, no verá velocidades superiores a 115200; eso es rápido para la mayoría de los microcontroladores. Suba demasiado y comenzará a ver errores en el extremo receptor, ya que los relojes y los períodos de muestreo simplemente no pueden seguir el ritmo.

Pruebe la tasa de baudios más baja.

Recibe ~67 caracteres, que a 10 bits/carácter son 670 bits. Dado que su tiempo de espera (parámetro 4) está configurado en 10 ms o 0,01 s, la tasa de bits promedio parece ser de alrededor de 67000 bit/s. Supongo que está transmitiendo a 115200 baudios con algún retraso entre caracteres, lo que da una tasa de bits efectiva de 67000 bit/s.

Por lo tanto, después de 67 caracteres, 10 ms expiran y vuelve la rutina de transmisión.

Para solucionarlo, aumente el valor del parámetro 4, el valor de tiempo de espera, al menos a 20.

También verifique que la frecuencia de reloj de su CPU esté correctamente definida en el código de configuración de su proyecto y mídala para asegurarse de que esté dentro del 2,5 % del valor previsto.

Estoy bastante seguro de que el tiempo de espera es bueno si CubeMX genera el código: genera una línea como esta configurando SysTick en 1 ms: HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);y SysTick es lo que se usa para esos retrasos en HAL de ST.
La frecuencia de la CPU se define como dijo @JanDorniak. Cambié el cuarto parámetro y sigue el mismo problema. La tasa de baudios es 115200.
@JanDorniak Primero, lo que genera STM32CubeMX no siempre es bueno. Además, Cube no genera llamadas como esta, HAL_UART_Transmit(&huart1,Test,sizeof(Test),10);por lo que el último parámetro fue definido por el usuario. Un tiempo de espera ligeramente mayor nunca está mal.
@BenceKaulics Tuve problemas con otras partes del código generado por CubeMX o con el propio HAL pero nunca con la configuración del reloj. En cuanto al tiempo de espera, sí, es demasiado corto.
@Mehran, ¿puede confirmar en un osciloscopio que solo se envían 67 caracteres? Podría ser útil enviar algo como uint8_t Test[] = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF...". De esa manera, cada décimo carácter es fácilmente visible.
¡Los datos se ven en el analizador lógico! ¡Cambié la velocidad en baudios (115200 a 57600) y ahora funciona bien! ¡Creo que las velocidades de transmisión de las placas STM32 y Arduino no coinciden!
@Mehran ¡Buenas noticias! Pero, tanto STM32F103 como Arduino deberían manejar fácilmente 115200 baudios. Transmita algo como "UUUUUU" y mida la velocidad en baudios. La regla general es estar dentro del 2,5% de la tasa de baudios prevista. (deslizamiento de un cuarto de bit sobre 10 bits)
@Mehran, también puede intentar establecer huart1.Init.BaudRate en 113200, 114200, 115200, 116200, 117200 hasta que encuentre un valor que funcione. ¡Pero debe abordar el problema de raíz si está desarrollando un producto profesional!

La biblioteca SoftwareSerial de Arduino no puede operar con altas tasas de UART. Nunca lo uses con velocidades superiores a 38400 en placas Uno/Nano por ejemplo. Si aún desea 115200, pruebe HardwareSerial en su lugar.

Ojalá pudiera marcar esto como la mejor respuesta. Me perdí la pista de serie SOFTWARE . Gracias @Almaz.