24 votos

La señal UART está "redondeada"

Estoy tratando de depurar un controlador UART para el STM32F405. No funciona por encima de una determinada tasa de baudios (unos 50 kBd). Lo he conectado a un analizador lógico con capacidad analógica, y he visto que la señal es redonda; tarda en subir. Parece que a mayores velocidades de baudios la señal no sube lo suficiente como para que se pueda leer.

¿Cómo puedo permitir que la UART funcione a mayor velocidad? No estoy seguro de si esto es un problema de hardware, o si se puede corregir en el software.

Captura de pantalla del analizador lógico, MCU transmitiendo a 38400 baudios. A screenshot of the Saleae Logic program showing that the serial signal rises slowly, and does not quite reach to same level as longer signals

Captura de pantalla del analizador lógico, MCU transmitiendo a 115200 baudios. A screenshot of the Saleae Logic program showing that the serial signal rises slowly, with peaks not reaching nearly as high as full signal level.

Más detalles:

  • Estoy leyendo la conexión serie con un chip FTDI conectado a mi escritorio.
  • He olfateado esta conexión con un Saleae Logic 8 conectado a las mismas líneas que el FTDI.
  • En las capturas de pantalla mostradas, la placa está enviando "pruebas" a través de la serie.
  • La MCU forma parte de un controlador de vuelo OpenPilot Revolution.

8 votos

¿Es una salida de drenaje abierto? Parece una, con la resistencia pullup demasiado alta (o sin ella)

1 votos

@BrianDrummond ¿Estás insinuando que el OP ha configurado mal su IO?

0 votos

@DKNguyen Sí, ya que está hablando de un "controlador" no especificado (¿controlador de línea?) y no del propio STM. Por supuesto, podría estar hablando de un controlador de dispositivo (software), en cuyo caso tienes razón. Incluso en ese caso, es posible que el pin pase a ser de drenaje abierto, por ejemplo, a través de ESD si no se configura mal.

56voto

Justme Puntos 201

Compruebe que el pin GPIO para UART TX está configurado para el modo push pull de salida alternativa. Parece que está configurado para salida alternativa de drenaje abierto.

25 votos

El GPIO fue configurado como un drenaje abierto. Una vez que lo cambié, pude transmitir 3 MBd con precisión.

0 votos

Tengo curiosidad por saber si se trata de un chip FTDI legítimo o de una falsificación.

4 votos

Esto no tiene nada que ver con el chip FTDI, esa señal sale del microcontrolador.

7voto

Lumberjack88 Puntos 18

¿Tiene un esquema de su circuito?

Además del pin GPIO mal configurado, otra posibilidad es que tengas un condensador en tu línea UART, actuando como un filtro de paso bajo, e impidiendo que la señal suba rápidamente.

0 votos

1 votos

El puerto en cuestión es el puerto "principal" de la izquierda, sección C1. El otro lado está conectado directamente al FTDI y al analizador lógico.

0 votos

Normalmente, un filtro de paso bajo limitaría la tasa de caída, así como la tasa de subida. ¿Por qué podría no ser el caso aquí?

3voto

Nathan Puntos 31

Como se mencionó anteriormente, ponerlo en modo push-pull de salida resolverá el problema, sin embargo, también puede querer comprobar que la "Velocidad máxima de salida" está ajustada a 'muy alta', y si su sistema lo tolera, añadir las resistencias pull-up internas; sé que hay varias escuelas de pensamiento sobre si USART debe tener pullups o no, así que pruébelo y vea si hace lo que quiere/necesita/permite el proyecto.

Si estás usando STM32CubeMX para tu inicialización/configuración, entonces todos estos ajustes se encuentran en el pinout & configuration > USARTx (o UARTx, el canal que estés usando para tu proyecto) > GPIO Settings.

Si sólo estás modificando el archivo de la plantilla a mano (y suponiendo que estás usando las librerías HAL) entonces la configuración de los pines debería estar en la carpeta src de tu proyecto, en el archivo llamado stm32F4xx_HAL_MSP.c (o el chip que estés usando)

Estás buscando estas líneas;

GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

Asegúrate de que el GPIO.InitStruct.Speet está ajustado a un valor muy alto (como en el caso anterior) y ajusta InitStruct.Pull a: GPIO_InitStruct.Pull = GPIO_PULLUP;

He conseguido abusar completamente de la UART en un STM32F4 y conseguir que funcione a 15MB/s sin perder bits, que era la velocidad más rápida a la que podía funcionar mi convertidor FTDI a USB. Sin embargo, veo que en la configuración del CubeMX dice que hay que mantenerla por debajo de 1MB/s.

0 votos

Sí, el gpio está ajustado a la máxima velocidad.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X