- Noções básicas de comunicação UART
- Requisitos e configuração de hardware
- Diagrama de circuito para comunicação UART Nuvoton N76E003
- Pinos UART no microcontrolador Nuvoton N76E003
- Registros UART no microcontrolador Nuvoton N76E003
- Modos de operação UART em N76E003
- Programando Nuvoton N76E003 para comunicação UART
UART significa Receptor / Transmissor Assíncrono Universal e é um recurso de hardware útil em qualquer unidade de microcontrolador. Um microcontrolador precisa receber dados, processá-los e enviá-los para outros dispositivos. Existem diferentes tipos de protocolos de comunicação disponíveis no microcontrolador, porém, o UART é o mais utilizado entre os demais protocolos de comunicação como SPI e I2C. Se alguém precisa receber ou transmitir dados em série, o UART é sempre a opção mais simples e comum. A vantagem do UART é que requer apenas dois fios para transmitir dados entre os dispositivos. Continuando com nosso Tutorial do microcontrolador Nuvoton, neste artigo, aprenderemos como realizar a comunicação serial usando o microcontrolador N76E003.
Noções básicas de comunicação UART
Agora, como sabemos o que é UART, é importante conhecer os parâmetros associados ao UART.
Dois dispositivos UART recebem e transmitem dados na mesma frequência. Quando o dispositivo UART receptor detecta um bit de início, ele começa a ler os bits de entrada em uma frequência específica conhecida como taxa de transmissão. A taxa de transmissão é importante para a comunicação UART e é usada para medir a velocidade de transferência de dados em bits por segundo (bps). Esta velocidade de taxa de baud, para transmissão e recepção, deve estar na mesma taxa de baud. A diferença de velocidade da taxa de transmissão entre os UARTs de transmissão e recepção pode ser apenas cerca de 10% antes que o tempo dos bits fique muito distante. As velocidades de taxa de transmissão mais populares são 4800, 9600, 115200 bps, etc. Anteriormente, usamos a comunicação UART em muitos outros microcontroladores listados abaixo.
- Comunicação UART entre ATmega8 e Arduino Uno
- Comunicação UART entre dois microcontroladores ATmega8
- Comunicação UART usando microcontroladores PIC
- Comunicação UART no microcontrolador STM8S
O N76E003 tem dois UARTs - UART0 e UART1. Neste tutorial, usaremos o periférico UART na unidade de microcontrolador N76E003. Sem perder muito tempo, vamos avaliar que tipo de configuração de hardware exigimos para este aplicativo.
Requisitos e configuração de hardware
O principal componente necessário para este projeto é o módulo conversor USB para UART ou TTL que fará a interface necessária entre o PC ou Laptop com o módulo microcontrolador. Para este projeto, usaremos o módulo USB para UART baseado em CP2102 que é mostrado abaixo.
Sem mencionar que, além do componente acima, precisamos da placa de desenvolvimento baseada em microcontrolador N76E003, bem como do programador Nu-Link. Uma fonte de alimentação de 5 V adicional pode ser necessária se o programador não for usado como fonte de alimentação.
Diagrama de circuito para comunicação UART Nuvoton N76E003
Como podemos ver no esquema da placa de desenvolvimento abaixo, o segundo e o terceiro pinos da unidade do microcontrolador são usados como UART0 Tx e Rx respectivamente. Na extrema esquerda, a conexão da interface de programação é mostrada.
Pinos UART no microcontrolador Nuvoton N76E003
O N76E003 tem 20 pinos, dos quais 4 podem ser usados para comunicação UART. A imagem abaixo está mostrando os pinos UART destacados em uma caixa quadrada vermelha (Rx) e uma caixa quadrada azul (Tx).
Para o UART0, os pinos 2 e 3 são usados para comunicação UART, e para o UART1, os pinos 8 e 18 são usados para comunicação.
Registros UART no microcontrolador Nuvoton N76E003
O N76E003 possui dois UARTs full-duplex aprimorados com reconhecimento automático de endereço e detecção de erro de enquadramento - UART0 e UART1. Esses dois UARTs são controlados por meio de registros categorizados em dois UARTs diferentes. Existem dois pares de pinos RX e TX disponíveis no N76E003 para operações UART. Portanto, a primeira etapa é selecionar a porta UART desejada para as operações.
Neste tutorial, usaremos o UART0, portanto a configuração será mostrada apenas para o UART0. UART1 terá a mesma configuração, mas os registros serão diferentes.
Após selecionar um UART (UART0 neste caso), os pinos de I / O que são necessários para serem usados para comunicação RX e TX precisam ser configurados como entrada e saída. O pino RX do UART0 é o pino 3 do microcontrolador que é a porta 0.7. Como este é um pino de recepção de porta serial, a Porta 0.7 deve ser configurada como entrada. Por outro lado, a porta 0,6 que é o segundo pino do microcontrolador é um pino de transmissão ou pino de saída. Ele precisa ser definido como um modo quase bidirecional. Eles podem ser selecionados usando os registradores PxM1 e PxM2. Esses dois registros definem os modos de E / S onde x representa o número da porta (por exemplo, porta P1.0 o registro será P1M1 e P1M2, para P3.0 será P3M1 e P3M2, etc.) A configuração pode ser visto na imagem abaixo
Modos de operação UART em N76E003
Em seguida, a próxima etapa é determinar o modo de operações UART. Os dois UARTs podem operar em 4 modos. Os modos são-
Como podemos ver, o SM0 e o SM1 (7º e 6º bits do registro SCON) selecionam o modo de operações UART. O modo 0 é a operação síncrona e os outros três modos são operações assíncronas. No entanto, o gerador de Baud Rate e os bits de quadro são diferentes para cada modo de porta serial. Qualquer um dos modos pode ser selecionado de acordo com os requisitos da aplicação e isso também é o mesmo para o UART1. Para este tutorial, a operação de 10 bits com taxa de estouro do temporizador 3 dividida por 32 ou 16 é usada.
Agora é hora de obter informações e configurar o registro SCON (SCON_1 para UART1) para UART0.
O 6º e 7º bits definirão o modo UART conforme discutido anteriormente. O bit 5 é usado para definir o modo de comunicação do Multiprocessador para ativar as opções. No entanto, o processo depende de qual modo UART está selecionado. Além desses, o bit REN será definido como 1 para habilitar a recepção e o sinalizador TI será definido como 1 para a função printf a ser usada em vez da função de transmissão UART0 personalizada.
O próximo registro importante é o registro de controle de energia (PCON) (Timer 3 bit 7 e 6 para UART1). Se você é novo em temporizadores, verifique o tutorial do temporizador Nuvoton N76E003 para entender como usar temporizadores no microcontrolador N76E003.
O bit SMOD é importante para selecionar a taxa de transmissão dupla no modo UART0 1. Agora, como estamos usando o temporizador 3, o registro de controle do temporizador 3 T3CON precisa ser configurado. No entanto, o 7º e o 6º bit são reservados para a configuração da taxa de dados dupla para UART1.
E o valor pré-escalonador do Timer 3 -
O 5º bit BRCK definirá o Timer 3 como a fonte de relógio da taxa de baud para UART1. Agora, a folha de dados do N76E003 recebe a fórmula para calcular a taxa Baud desejada, bem como o valor definido de amostra para os registros alto e baixo do Timer 3 (16 bits).
Valor de amostra para fonte de relógio de 16 Mhz-
Portanto, a taxa de transmissão precisa ser configurada no registro do Timer 3 usando a fórmula acima. Para o nosso caso, será a Fórmula 4. Depois disso, iniciar o Timer 3 configurando o registrador TR3 para 1 encerrará o Timer de inicialização 3 do UART0. Para receber e enviar os dados UART0 para usar o registrador abaixo-
O registro SBUF é configurado automaticamente para Receber e Transmitir. Para receber dados do UART, espere que o sinalizador RI defina 1 e leia o registro SBUF e envie os dados para UART0, envie os dados para SBUF e espere que o sinalizador TI obtenha 1 para confirmar a transmissão de dados com sucesso.
Programando Nuvoton N76E003 para comunicação UART
A parte de codificação é simples e o código completo usado neste tutorial pode ser encontrado na parte inferior desta página. A explicação do código é a seguinte, O UART0 é inicializado em taxas de transmissão de 9600 usando a instrução na função principal-
InitialUART0_Timer3 (9600);
A função acima é definida no arquivo common.c e está configurando o UART0 com o temporizador 3 como a fonte da taxa de baud, no modo 1, e com uma taxa de baud de 9600. A definição da função é a seguinte-
void InitialUART0_Timer3 (UINT32 u32Baudrate) // use timer3 como gerador de Baudrate { P06_Quasi_Mode; // Configurando o pino UART como modo quase para transmitir P07_Input_Mode; // Definindo o pino UART como modo de entrada para receber SCON = 0x50; // UART0 Mode1, REN = 1, TI = 1 set_SMOD; // UART0 Double Rate Enable T3CON & = 0xF8; // T3PS2 = 0, T3PS1 = 0, T3PS0 = 0 (pré-escala = 1) set_BRCK; // Fonte de relógio da taxa de baud 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; // Trigger Timer3 set_TI; // Para a função printf deve definir TI = 1 }
A declaração é feita passo a passo conforme discutido antes e os registros são configurados de acordo. No entanto, na biblioteca BSP do N76E003, existe um bug que está em vez de P07_Input_Mode; existe P07_Quasi_Mode . Devido a isso, a função de recepção UART não funcionará.
A taxa de transmissão também é configurada de acordo com a entrada da taxa de transmissão e usando a fórmula fornecida pela folha de dados. Agora, na função principal ou no loop while , a função printf é usada. Para usar a função printf , o TI precisa ser definido como 1. Fora isso, no loop while , uma caixa de switch é usada e de acordo com os dados UART recebidos, o valor é impresso.
enquanto (1) { printf ("\ r \ nPressione 1 ou Pressione 2 ou Pressione 3 ou Pressione 4"); oper = Receive_Data_From_UART0 (); switch (oper) { case '1': printf ("\ r \ n1 é pressionado"); pausa; case '2': printf ("\ r \ n2 é pressionado"); pausa; case '3': printf ("\ r \ n3 é pressionado"); pausa; case '4': printf ("\ r \ n4 é pressionado"); pausa; padrão: printf ("\ r \ nTecla errada pressionada"); } Timer0_Delay1ms (300); } }
Pois bem, para o UART0 receba o Receive_Data_From_UART0 (); função é usada. Também é definido na biblioteca common.c .
UINT8 Receive_Data_From_UART0 (void) { UINT8 c; enquanto (! RI); c = SBUF; RI = 0; retorno (c); }
Ele aguardará o sinalizador RI obter 1 e retornar os dados de recebimento usando a variável c.
Flash do código e saída
O código retornou 0 aviso e 0 erros e piscou usando o método de flash padrão do Keil. Se você não tiver certeza de como compilar e fazer upload do código, consulte o artigo de introdução ao Nuvoton. As linhas abaixo confirmam que nosso código foi carregado com sucesso.
Reconstrução iniciada: Projeto: printf_UART0 Reconstruir destino 'GPIO' compilando PUTCHAR.C… compilando Print_UART0.C… compilando Delay.c… compilando Common.c… montando STARTUP.A51… vinculando… Tamanho do programa: dados = 54,2 xdata = 0 código = 2341 criando arquivo hexadecimal de ". \ Output \ Printf_UART1"… ". \ Output \ Printf_UART1" - 0 Erro (s), 0 Aviso (s). Tempo de compilação decorrido: 00:00:02 Carregar "G: \\ n76E003 \\ software \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Sample_Code \\ UART0_Printf \\ Saída \\ Printf_UART1" Apagamento do Flash concluído. Flash Write Done: 2341 bytes programados. Verificação do Flash concluída: 2341 bytes verificados. Carregamento do Flash finalizado às 15:48:08
A placa de desenvolvimento é conectada na fonte de alimentação por meio do programador e do laptop usando o módulo USB para UART. Para exibir ou enviar os dados UART, é necessário um software de monitor serial. Estou usando um termo tera para este processo.
Como você pode ver na imagem abaixo, fui capaz de exibir as strings enviadas de nosso controlador Nuvoton e exibi-las no software do monitor serial. Também foi capaz de ler valores do monitor serial.
Você pode conferir o vídeo no link abaixo para a demonstração completa deste tutorial. Espero que você tenha gostado do artigo e aprendido algo útil. Se você tiver alguma dúvida, pode deixá-la na seção de comentários abaixo ou usar nossos fóruns para postar outras questões técnicas.