Você está na página 1de 21

CAPÍTULO – 4

UART
UNIVERSAL ASYNCHRONOUS RECEIVER
TRANSMITTER
UART na Placa Tiva Launchpad
Interface de hardware implementado de um canal RS232 assíncrono. O
TM4C123 tem oito portas UART.

Observação: O LaunchPad envia o canal UART0 através do cabo USB, por isso, não
será necessário o circuito mostrado acima. No lado do PC , o canal serial torna-se
uma porta COM virtual (COM3, COM8, COM13, etc).
UM FRAME DE DADOS SERIAIS:

1 BIT DE INÍCIO + 8 BITS DE DADOS + 1 BIT DE PARADA

OBS: Ao alterar a frequência de clock do barramento, sem


alterar o registrador da taxa de transmissão, a UART irá
operar a uma taxa de transmissão incorreta.
Esquema da Transmissão Serial
EXEMPLO 1: usando a UART0
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h" Adicionar o arquivo
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
uartstdio.c no projeto

#define GPIO_PA0_U0RX 0x00000001


#define GPIO_PA1_U0TX 0x00000401 //driverlib/pin_map.h

void ConfigureUART(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // Habilita a PORTA.
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // Habilita UART0
GPIOPinConfigure(GPIO_PA0_U0RX); // Configura os pinos da GPIO para a UART0
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

// Usa o oscilador interno preciso de 16MHz como fonte de clock da UART0


UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);

// Inicializa a UART0 para 115200 bits/s com clock de 16MHz


UARTStdioConfig(0, 115200, 16000000);
}
SEGUE O PROGRAMA ...
Continuação ...
int main(void)
{
ConfigureUART(); // Inicializa a UART.

UARTCharPut(UART0_BASE, 'A');
UARTCharPut(UART0_BASE, 0x30); //caracter 0x30 na tab. ASCII
UARTCharPut(UART0_BASE, 70); //caracter 70 na tab. ASCII
UARTCharPut(UART0_BASE, 0x0A); //nova linha
UARTCharPut(UART0_BASE, 0x07); //bell

UARTprintf("\n%d", 70);
UARTprintf("\n%c", 70); //caracter 70 na tab. ASCII
UARTprintf("\n%c", 'Y');
UARTprintf("\n%4d", 70);
UARTprintf("\n%04d", 70);

UARTprintf("\tOlá mundo !\n");


}
Principais funções para trabalhar com a UART

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);

GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);


UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
UARTStdioConfig(0, 115200, 16000000);

UARTCharPut(UART0_BASE, 'A');
x=UARTCharGet(UART0_BASE);
x=UARTgetc();
UARTprintf("\nEscolha a cor do LED:\n");
GPIOPinConfigure()
A função GPIOPinConfigure() (pág. 265 datasheet da Tivaware)
configura os pinos que serão usados como função alternativa, ou
seja, não serão usados como I/O.

Apenas um periférico pode ser associado a cada pino GPIO e deve-


se chamar um por vez.
A lista dos pinos com função alternativa está na biblioteca
pin_map.h

GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART()
A função GPIOPinTypeUART() (pág. 282 datasheet da Tivaware)
configura os pinos que serão usados na UART.

O primeiro argumento da função é a porta base, por exemplo,


GPIO_PORTA_BASE.
O segundo argumento da função reúne os pinos da porta base a
serem usados na transmissão e recepção.

GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 |
GPIO_PIN_1);
UARTClockSourceSet()
A função UARTClockSourceSet() (pág. 566 datasheet da Tivaware)
configura a fonte de clock que será usada como base de tempo
para a UART selecionada.

As possibilidades de fonte de clock são:


Clock do sistema (UART_CLOCK_SYSTEM)
Oscilador interno preciso (UART_CLOCK_PIOSC)

UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
UARTStdioConfig()
A função UARTStdioConfig( ) está vinculada à biblioteca uartstdio.h,
localizada na pasta utils da Tivaware. Ela configura qual a UART
será usada, o baud rate e a frequência do clock de referência.

O primeiro argumento é a UART que será usada, UART0.


O segundo argumento é o baud rate, 115200 bits/s.
O terceiro argumento e o clock de referência para gerar o baud
rate, 16MHz.

UARTStdioConfig(0, 115200, 16000000);


UARTCharPut()
A função UARTCharPut() (pág. 565 datasheet da Tivaware) envia
um caractere para a UART especificada.

O primeiro argumento é a UART que será usada, por exemplo,


UART0.
O segundo argumento é um caractere ou o endereço de um
caractere (instrução) na tabela ASCII.

UARTCharPut(UART0_BASE, 'A');
UARTCharPut(UART0_BASE, 0x30);//caractere 0 tab. ASCII
UARTCharPut(UART0_BASE, 0x0A); //nova linha
UARTCharGet()
A função UARTCharGet() (pág. 564 datasheet da Tivaware) recebe
um caractere vindo da UART especificada e o retorna para quem
a chamou.

O argumento da função é a UART que está sendo usada, por


exemplo, UART0.
Pode ser substituída pela função UARTgetc().

x=UARTCharGet(UART0_BASE); ou
x=UARTgetc(); //uartstdio.h
UARTprintf()
A função UARTprintf( ) está vinculada à biblioteca uartstdio.h. Ela
escreve uma string na UART configurada.

O argumento da função é uma string, podendo ser uma frase, um


número ou ainda um caractere.

UARTprintf("\tOlá mundo !\n");


UARTprintf("%d", 1000);
UARTprintf("%c", 'Y');

\n (nova linha) \b (backspace – retorna 1 posição)


\t (tabulação) \r (retorno – início da linha)
EXEMPLO 2: Seleciona LED
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"

#define GPIO_PA0_U0RX 0x00000001


#define GPIO_PA1_U0TX 0x00000401 //driverlib/pin_map.h

#define LEDS (*((volatile long *) 0x40025038)) //PF3 2 1


#define RED 0x02 //PF1
#define BLUE 0x04 //PF2
#define GREEN 0x08 //PF3

void ConfigureUART(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // Habilita a PORTA.
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // Habilita UART0
GPIOPinConfigure(GPIO_PA0_U0RX); // Configura os pinos da GPIO para a UART0
GPIOPinConfigure(GPIO_PA1_U0TX);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

// Usa o oscilador interno preciso de 16MHz como fonte de clock da UART0


UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);

// Inicializa a UART0 para 115200 bits/s com clock de 16MHz


UARTStdioConfig(0, 115200, 16000000);
}

SEGUE O PROGRAMA ...


Continuação ...
int main(void)
{
char x;

SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_3 | GPIO_PIN_2 | GPIO_PIN_1);

ConfigureUART(); // Inicializa a UART.

UARTprintf("\nEscolha a cor do LED:\n");


UARTprintf("\tR->RED\n");
UARTprintf("\tG->GREEN\n");
UARTprintf("\tB->BLUE\n");

while(1)
{
x=UARTCharGet(UART0_BASE); // ou x=UARTgetc();

switch (x)
{
case 'R': case 'r':
LEDS=RED;
break;
case 'G': case 'g':
LEDS=GREEN;
break;
case 'B': case 'b':
LEDS=BLUE;
break;
default:
LEDS=0;
}
}
}
Configurações do Tera Term

1- Conecta a placa na USB


2- Liga a placa
3- Abre o Tera Term

FILE  New connection  opção


“Serial”

SETUP  Serial port


Configurações do Tera Term

SETUP  Fonte

SETUP  Save setup

Salvar “teraterm.ini” ou
criar uma configuração
personalizada com outro
nome .ini
EXERCÍCIOS:
1- Melhore o exemplo 2, adicionando outras cores, conforme mostra a figura abaixo:

2- Faça um programa que crie um contador decimal, o qual inicia em zero e usa as
teclas ‘+’, ‘-’ e ‘Z’(‘z’) para incrementar, decrementar e zerar o mesmo, respectivamente.
O valor da contagem deve ser mostrado tanto na placa como no TeraTerm.

TRAVAS:
Trava ‘+’ em 9;
Trava ‘-’ em 0.
EXERCÍCIOS:
3- Faça um programa que verifique uma senha de 5 dígitos alfanuméricos. O usuário
tem 3 tentativas (monitoradas) para acertar a senha. Os leds devem acender conforme
a descrição abaixo:

Azul: digitação
Verde: senha correta
Vermelho: senha
incorreta (2s)

Para limpar a tela:


UARTprintf("\x1B[2J");
UARTprintf("\x1B[0;0H"); ou UARTprintf("\x1B[2J\x1B[0;0H");

Você também pode gostar