Frecuencia UART en microcontroladores [cerrado]

Leí en el libro "Serial Port complete, 2nd edition" que el reloj de la UART debería ser 16 veces la tasa de baudios , pero nunca he visto ningún microcontrolador en el que establezcamos la frecuencia de la UART antes de configurarlo para un baudio específico tasa. Entonces:

1) ¿Por qué la frecuencia debe ser 16 veces la tasa de baudios?

2) ¿Me puede dar un ejemplo de cualquier microcontrolador donde establecemos la frecuencia UART?

3) ¿Cuál es el propósito de configurar la frecuencia de reloj de la UART si tenemos temporizadores? Por ejemplo, generamos la tasa de baudios en un simple 89c52 a través del temporizador 1 y no configuramos ninguna frecuencia.

4) ¿Cuál es la idea de establecer la tasa de baudios con un temporizador como lo hacemos en 89c5x. ¿Cómo se vincula a la frecuencia UART?

5) RS-232 es el "estándar recomendado 232" y un UART es físico. El hardware realiza conversiones paralelo-serie y serie-paralelo. ¿Tengo razón?

6) ¿El UART contiene un contador, de modo que después del bit de inicio espera 8 ciclos y luego, después de cada 16 ciclos, se toman las muestras de la línea RX para detectar el bit?

Los UART usan sobremuestreo, normalmente de 8 a 16 veces para capturar datos de una tasa conocida de forma imprecisa a partir de un punto arbitrario en el tiempo; esto contrasta con las interfaces sincrónicas en las que el remitente proporciona un bloqueo. Casi cualquier UART configurable requiere que configure su "frecuencia" configurando un divisor de reloj para producir un reloj a la velocidad de sobremuestreo. Ese divisor de reloj es en cierto modo similar a un bloque de temporizador, pero tiene una capacidad mucho, mucho más limitada, ya que solo tiene este propósito.
Bueno, sé que UART toma una muestra en el medio del bit, usé UART muchas veces pero nunca configuré su frecuencia a través de ningún PLL, etc. También cambié la velocidad en baudios, nunca cambié la frecuencia UART a 8/16 veces.
Establecer su tasa de baudios es precisamente cambiar la frecuencia del reloj de sobremuestreo. Esto generalmente se hace dividiendo un reloj aún más rápido (reloj central de MCU o reloj de bus periférico) en lugar de un PLL único, por lo que se limita a factores de esa frecuencia de reloj. Por supuesto, hoy en día, el reloj central de MCU generalmente proviene de un PLL. La selección entre el modo de sobremuestreo de 8x y 16x, si se permite una opción, normalmente se realiza en un bit de registro de configuración.
Agregando a la buena explicación de @ChrisStratton (CS pls en una respuesta), muchos UART forman un nivel de bit recibido de 3 muestras alrededor de la mitad del bit. El 8051 usó las muestras 7/8/9 y obtuvo el promedio, por lo que su 89C52 seguramente hace lo mismo (búsquelo). Mis UART VHDL hacen esto de manera confiable. El sobremuestreo (16x) (a) alinea el receptor dentro de un +/-3 % del borde inicial del bit de inicio y (b) facilita el sobremuestreo/filtrado de bits proporcional a la tasa de bits. La mayoría de los BRG de más de 10 años se basan en 16x, mire fclk-> baud calcs. Muchos BRG más nuevos usan 'fraccionales'. Puede encontrar y leer sobre esto con Internet fácilmente.
Los AVR pueden documentarse un poco más explícitamente a este respecto. Consulte, por ejemplo, la sección 20.3 "Generación de reloj" en la hoja de datos de ATMega328 .
Puede encontrar más información sobre el protocolo UART, el bit de inicio, el bit de parada y el reloj de muestreo 16x en electronics.stackexchange.com/a/42240/4512 y electronics.stackexchange.com/a/91453/4512 .
Para transmitir, puede sincronizar fácilmente su lógica 1: 1 con velocidad de transmisión, es la recepción asíncrona la que exige un reloj más alto. En esencia, le proporciona diversidad de fase, para la sincronización de bits de inicio.
RS-232 es un estándar eléctrico y de pines, no un estándar de protocolo, por lo que RS-232 es muy específico para el conector y los voltajes. puede tener uart/serial sin rs-232 y con un microcontrolador que es lo que tiene, no tienen transceptores rs232 incorporados normalmente (si es que alguna vez lo hacen).

Respuestas (3)

1) ¿Por qué la frecuencia debe ser 16 veces la tasa de baudios?

Como Chris ya ha señalado en los comentarios, no hay señal de reloj, los UART RS-232 son sistemas asíncronos. Esto significa que no tenemos idea de cuándo comenzarán los datos entrantes y es una apuesta bastante segura que el reloj del transmisor funcionará a una velocidad ligeramente diferente a la de los receptores. Para hacer frente a esto, el UART sobremuestrea los datos entrantes para que pueda obtener una medida razonable de dónde están las transiciones en los datos. Para sobremuestrear, necesita un reloj que funcione significativamente más rápido que la velocidad de datos.

2) ¿Me puede dar un ejemplo de cualquier Microcontrolador donde configuramos la frecuencia UART?

Prácticamente todos ellos contendrán varios registros para establecer esto. por ejemplo, en el LPC1768 hay un registro divisor fraccional para configurar el escalador previo del reloj a la lógica UART. En general, establecer la frecuencia del reloj para la lógica UART también establece la velocidad en baudios para la salida, por lo que puede no ser obvio que está configurando un reloj a 16 veces la velocidad en baudios.

3) ¿Cuál es el propósito de configurar la frecuencia del reloj en UART si tenemos temporizadores? Por ejemplo, generamos una tasa de baudios en 89c52 simple a través del temporizador 1 y no configuramos ninguna frecuencia.

¿Para que pueda ejecutar cada UART a una velocidad de transmisión diferente sin usar todos sus temporizadores?

4) ¿Cuál es la idea de establecer la velocidad en baudios con un temporizador como lo hacemos en 89c5x? ¿Cómo se vincula a la frecuencia UART?

Ni idea, no usé la parte pero eso parece un poco extraño.

5) Se recomienda RS-232 estándar 232 y UART es físico. El hardware realiza conversiones paralelo-serie y serie-paralelo. ¿Tengo razón?

Sí, el UART tiene un búfer de transmisión y recepción de 8 bits, el procesador solo maneja bytes de datos, el hardware UART maneja la conversión a serie y viceversa.

6) ¿UART contiene un contador, de modo que después del bit de inicio espera 8 ciclos y luego, después de cada 16 ciclos, se toman muestras de la línea RX para detectar el bit?

Contiene una máquina de estado que rastrea el punto actual en el ciclo de transmisión/recepción. Esta máquina de estado contendrá contadores y lógica para detectar transiciones, iniciar y detener bits y generar/comprobar bits de paridad. A menos que desee diseñar su propio UART, no necesita preocuparse por lo que sucede exactamente dentro de esa máquina de estado. Si desea diseñar su propio UART, entonces ese es un tema completamente nuevo.

La pregunta y algunas de las respuestas confunden "reloj", "frecuencia" y "tasa de baudios".

Como se explicó, hay un reloj dentro de la UART que suele ser 16 veces la tasa de baudios deseada. Cuando tenía cabello, este reloj se proporcionaba a la UART mediante un divisor de hardware, generalmente configurado por interruptores DIP, desde un oscilador de cristal.

Pero un UART como un 16550 o el UART en un microcontrolador contiene el circuito divisor. Cuando "establece la velocidad en baudios" escribiendo en un registro UART, está configurando el divisor. La entrada es un reloj de alta frecuencia, a menudo el reloj del procesador.

Entonces, un 16550 a menudo tendrá una entrada de un oscilador de cristal de 1.8432 MHz. Divida eso por 16 y obtendrá 115200 baudios, la velocidad más rápida disponible con ese UART usando esa entrada. Para obtener esa tasa de baudios, establecería el divisor de tasa de baudios del UART en 1. Establezca el divisor en 2 y obtendrá 57600 baudios. Ajústelo a tres y obtendrá 38400 baudios, etc.

Los UART más sofisticados tienen una lógica de "divisor fraccional", que le permite obtener velocidades de transmisión estándar (o cercanas a ellas) de un oscilador de entrada que no es un múltiplo entero de la velocidad de transmisión.

Me gustó mucho lo que mencionaste en tu respuesta. es decir, "la velocidad más rápida disponible con ese UART usando esa entrada". Realmente tiene sentido... Gracias.

Algunos de los principios de diseño de los UART se remontan a los días en que el costo combinado de un cristal, un circuito dividido por tres y un divisor de frecuencia de potencia de dos sería menor que el costo de un divisor de frecuencia totalmente programable.

La forma más versátil de diseñar un UART sería usar divisores de frecuencia programables separados para transmitir y recibir, cada uno configurado para 1x la tasa de baudios, y "atasco" cada uno en un conteo programable cuando el lado correspondiente del UART está inactivo. Sin embargo, hacer las cosas de esa manera requeriría el uso de dos divisores de frecuencia totalmente programables separados. Es más económico tener un divisor programable compartido entre transmisión y recepción, pero que funcione lo suficientemente rápido como para que tanto el transmisor como el receptor puedan dividirlo aún más de forma independiente.