- Conceptos básicos de la comunicación UART
- Requisitos y configuración de hardware
- Diagrama de circuito para comunicación UART Nuvoton N76E003
- Pines UART en el microcontrolador Nuvoton N76E003
- Registros UART en el microcontrolador Nuvoton N76E003
- Modos de funcionamiento UART en N76E003
- Programación de Nuvoton N76E003 para comunicación UART
UART significa Receptor / Transmisor Asíncrono Universal y es una característica de hardware útil en cualquier unidad de microcontrolador. Un microcontrolador necesita recibir datos, procesarlos y enviarlos a los otros dispositivos. Hay diferentes tipos de protocolos de comunicación disponibles en el microcontrolador, sin embargo, UART es el más utilizado entre los otros protocolos de comunicación como SPI e I2C. Si alguien necesita recibir o transmitir datos en serie, UART es siempre la opción más simple y común. La ventaja de UART es que solo requiere dos cables para transmitir datos entre dispositivos. Continuando con nuestro Tutorial del microcontrolador Nuvoton, en este artículo, aprenderemos cómo realizar la comunicación en serie utilizando el microcontrolador N76E003.
Conceptos básicos de la comunicación UART
Ahora bien, como sabemos qué es la UART, es importante conocer los parámetros asociados a la UART.
Dos dispositivos UART reciben y transmiten datos a la misma frecuencia. Cuando el dispositivo UART receptor detecta un bit de inicio, comienza a leer los bits entrantes a una frecuencia específica conocida como velocidad en baudios. La velocidad en baudios es importante para la comunicación UART y se utiliza para medir la velocidad de transferencia de datos en bits por segundo (bps). Esta velocidad de velocidad en baudios, para la transmisión y recepción, debe ser la misma velocidad en baudios. La diferencia de velocidad en baudios entre los UART transmisores y receptores solo puede ser de aproximadamente un 10% antes de que la sincronización de los bits se aleje demasiado. Las velocidades de velocidad en baudios más populares son 4800, 9600, 115200 bps, etc. Anteriormente, hemos utilizado la comunicación UART en muchos otros microcontroladores que se enumeran a continuación.
- Comunicación UART entre ATmega8 y Arduino Uno
- Comunicación UART entre dos microcontroladores ATmega8
- Comunicación UART mediante microcontroladores PIC
- Comunicación UART en el microcontrolador STM8S
El N76E003 tiene dos UART: UART0 y UART1. En este tutorial, usaremos el periférico UART en la unidad de microcontrolador N76E003. Sin perder mucho tiempo, evaluemos qué tipo de configuración de hardware necesitamos para esta aplicación.
Requisitos y configuración de hardware
El componente principal que se requiere para este proyecto es el módulo convertidor USB a UART o TTL que hará la interfaz requerida entre la PC o Laptop con el módulo microcontrolador. Para este proyecto, utilizaremos el módulo USB a UART basado en CP2102 que se muestra a continuación.
Sin mencionar que, además del componente anterior, necesitamos la placa de desarrollo basada en microcontroladores N76E003, así como el programador Nu-Link. Es posible que se requiera una fuente de alimentación adicional de 5 V si el programador no se utiliza como fuente de alimentación.
Diagrama de circuito para comunicación UART Nuvoton N76E003
Como podemos ver en el siguiente esquema de la placa de desarrollo, el segundo y tercer pin de la unidad del microcontrolador se utilizan como UART0 Tx y Rx respectivamente. En el extremo izquierdo, se muestra la conexión de la interfaz de programación.
Pines UART en el microcontrolador Nuvoton N76E003
El N76E003 tiene 20 pines de los cuales 4 pines se pueden usar para la comunicación UART. La siguiente imagen muestra los pines de UART resaltados en un cuadro cuadrado rojo (Rx) y un cuadro cuadrado azul (Tx).
Para UART0, los pines 2 y 3 se utilizan para la comunicación UART, y para UART1, los pines 8 y 18 se utilizan para la comunicación.
Registros UART en el microcontrolador Nuvoton N76E003
N76E003 tiene dos UART full-duplex mejorados con reconocimiento automático de direcciones y detección de errores de trama: UART0 y UART1. Estos dos UART se controlan mediante registros categorizados en dos UART diferentes. Hay dos pares de pines RX y TX disponibles en N76E003 para operaciones UART. Por lo tanto, el primer paso es seleccionar el puerto UART deseado para las operaciones.
En este tutorial, usaremos UART0, por lo que la configuración se mostrará solo para UART0. UART1 tendrá la misma configuración pero los registros serán diferentes.
Después de seleccionar un UART (UART0 en este caso), los pines de E / S necesarios para la comunicación RX y TX deben configurarse como entrada y salida. El pin RX de UART0 es el pin 3 del microcontrolador que es el puerto 0.7. Como se trata de un pin de recepción de puerto serie, es necesario configurar el puerto 0.7 como entrada. Por otro lado, el puerto 0.6, que es el segundo pin del microcontrolador, es un pin de transmisión o de salida. Debe configurarse como un modo cuasi bidireccional. Estos se pueden seleccionar utilizando el registro PxM1 y PxM2. Estos dos registros establecen los modos de E / S donde la x representa el número de puerto (por ejemplo, el puerto P1.0 el registro será P1M1 y P1M2, para P3.0 será P3M1 y P3M2, etc.) La configuración puede ser visto en la imagen de abajo-
Modos de funcionamiento UART en N76E003
Luego, el siguiente paso es determinar el modo de operaciones de UART. Los dos UART podrían funcionar en 4 modos. Los modos son-
Como podemos ver, el SM0 y SM1 (séptimo y sexto bit del registro SCON) seleccionan el modo de operaciones UART. El modo 0 es la operación sincrónica y los otros tres modos son operaciones asincrónicas. Sin embargo, el generador de velocidad en baudios y los bits de trama son diferentes para cada modo de puerto serie. Cualquiera de los modos se puede seleccionar según los requisitos de la aplicación y esto también es lo mismo para el UART1. Para este tutorial, se utiliza la operación de 10 bits con la tasa de desbordamiento del temporizador 3 dividida por 32 o 16.
Ahora es el momento de obtener información y configurar el registro SCON (SCON_1 para UART1) para UART0.
El sexto y séptimo bit establecerán el modo UART como se discutió anteriormente. El bit 5 se utiliza para configurar el modo de comunicación del multiprocesador para habilitar las opciones. Sin embargo, el proceso depende del modo UART seleccionado. Aparte de estos, el bit REN se establecerá en 1 para habilitar la recepción y el indicador TI se establecerá en 1 para que se utilice la función printf en lugar de la función de transmisión UART0 personalizada.
El siguiente registro importante es el registro de control de potencia (PCON) (temporizador 3 bit 7 y 6 para UART1). Si es nuevo en los temporizadores, consulte el tutorial del temporizador Nuvoton N76E003 para comprender cómo usar los temporizadores en el microcontrolador N76E003.
El bit SMOD es importante para seleccionar la velocidad en baudios doble en el modo UART0 1. Ahora, como estamos usando el temporizador 3, es necesario configurar el registro de control del temporizador 3 T3CON. Sin embargo, los bits 7 y 6 están reservados para el ajuste de velocidad de datos doble para UART1.
Y el valor del pre-escalador del Timer 3-
El BRCK de quinto bit establecerá el temporizador 3 como la fuente de reloj de velocidad en baudios para UART1. Ahora, a la hoja de datos de N76E003 se le da la fórmula para calcular la velocidad en baudios deseada, así como el valor de muestra para los registros Alto y Bajo del Temporizador 3 (16 bits).
Valor de muestra para fuente de reloj de 16 Mhz
Por lo tanto, la velocidad en baudios debe configurarse en el registro del temporizador 3 utilizando la fórmula anterior. Para nuestro caso, será la Fórmula 4. Después de eso, al iniciar el Temporizador 3 configurando el registro TR3 en 1, finalizará el Temporizador de inicialización UART0 3. Para recibir y enviar los datos UART0 para usar el siguiente registro-
El registro SBUF se configura automáticamente para recibir y transmitir. Para recibir datos de UART, espere a que la bandera RI se establezca en 1 y lea el registro SBUF y envíe los datos a UART0, envíe los datos a SBUF y espere a que la bandera TI obtenga 1 para confirmar la transmisión de datos exitosa.
Programación de Nuvoton N76E003 para comunicación UART
La parte de codificación es simple y el código completo utilizado en este tutorial se puede encontrar en la parte inferior de esta página. La explicación del código es la siguiente: El UART0 se inicializa a 9600 velocidades en baudios utilizando la declaración en la función principal:
InitialUART0_Timer3 (9600);
La función anterior está definida en el archivo common.c y está configurando el UART0 con el temporizador 3 como fuente de velocidad en baudios, en el modo 1, y con una velocidad en baudios de 9600. La definición de la función es la siguiente:
void InitialUART0_Timer3 (UINT32 u32Baudrate) // use timer3 como generador de Baudrate { P06_Quasi_Mode; // Establecer el pin UART como modo cuasi para transmitir P07_Input_Mode; // Establecer el pin UART como modo de entrada para recibir SCON = 0x50; // UART0 Mode1, REN = 1, TI = 1 set_SMOD; // UART0 Double Rate Enable T3CON & = 0xF8; // T3PS2 = 0, T3PS1 = 0, T3PS0 = 0 (Prescale = 1) set_BRCK; // Fuente de reloj de velocidad en baudios UART0 = Timer3 #ifdef FOSC_160000 RH3 = HIBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 MHz * / RL3 = LOBYTE (65536 - (1000000 / u32Baudrate) -1); / * 16 MHz * / #endif #ifdef FOSC_166000 RH3 = HIBYTE (65536 - (1037500 / u32Baudrate)); /*16.6 MHz * / RL3 = LOBYTE (65536 - (1037500 / u32Baudrate)); /*16,6 MHz * / #endif set_TR3; // Activar Timer3 set_TI; // Para la función printf se debe configurar TI = 1 }
La declaración se realiza paso a paso como se discutió anteriormente y los registros se configuran en consecuencia. Sin embargo, en la biblioteca BSP del N76E003, hay un error que es en lugar de P07_Input_Mode; hay P07_Quasi_Mode . Debido a esto, la función de recepción UART no funcionará.
La velocidad en baudios también se configura según la entrada de la velocidad en baudios y utilizando la fórmula proporcionada por la hoja de datos. Ahora, en la función principal o en el ciclo while , se usa la función printf. Para usar la función printf , el TI debe configurarse como 1. Aparte de esto, en el ciclo while , se usa una caja de interruptor y, según los datos UART recibidos, se imprime el valor.
while (1) { printf ("\ r \ nPresione 1 o Presione 2 o Presione 3 o Presione 4"); oper = Receive_Data_From_UART0 (); switch (oper) { case '1': printf ("\ r \ n1 está presionado"); romper; case '2': printf ("\ r \ n2 está presionado"); romper; case '3': printf ("\ r \ n3 está presionado"); romper; case '4': printf ("\ r \ n4 está presionado"); romper; predeterminado: printf ("\ r \ nTecla incorrecta presionada"); } Timer0_Delay1ms (300); } }
Bueno, para el UART0 recibe el Receive_Data_From_UART0 (); se utiliza la función. También se define en la biblioteca common.c .
UINT8 Receive_Data_From_UART0 (void) { UINT8 c; mientras (! RI); c = SBUF; RI = 0; retorno (c); }
Esperará a que el indicador RI obtenga 1 y devuelva los datos de recepción utilizando la variable c.
Destellando el código y la salida
El código devolvió 0 advertencia y 0 errores y parpadeó utilizando el método de parpadeo predeterminado del Keil. Si no está seguro de cómo compilar y cargar código, consulte el artículo de introducción a nuvoton. Las siguientes líneas confirman que nuestro código se ha cargado correctamente.
Reconstrucción iniciada: Proyecto: printf_UART0 Reconstruir destino 'GPIO' compilando PUTCHAR.C… compilando Print_UART0.C… compilando Delay.c… compilando Common.c… ensamblando STARTUP.A51… vinculando… Tamaño del programa: data = 54.2 xdata = 0 code = 2341 creando un archivo hexadecimal desde ". \ Output \ Printf_UART1"… ". \ Output \ Printf_UART1" - 0 Error (s), 0 Advertencia (s). Tiempo de compilación transcurrido: 00:00:02 Cargar "G: \\ n76E003 \\ software \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Sample_Code \\ UART0_Printf \\ Output \\ Printf_UART1" Flash Erase Done. Flash Write Done: 2341 bytes programados. Flash Verify Done: 2341 bytes verificados. Carga Flash finalizada a las 15:48:08
La placa de desarrollo se conecta a la fuente de alimentación a través del programador y la computadora portátil mediante el módulo USB a UART. Para mostrar o enviar los datos UART, se requiere un software de monitor en serie. Estoy usando tera término para este proceso.
Como puede ver en la imagen de abajo, pude mostrar las cadenas enviadas desde nuestro controlador nuvoton y mostrarlas en el software del monitor en serie. También fue capaz de leer valores del monitor serial.
Puede ver el video vinculado a continuación para ver la demostración completa de este tutorial. Espero que hayas disfrutado del artículo y hayas aprendido algo útil. Si tiene alguna pregunta, puede dejarla en la sección de comentarios a continuación o utilizar nuestros foros para publicar otras preguntas técnicas.