Em muitos projetos é necessário disponibilizar uma interface serial RS232, e alguns dos motivos são:
- Depuração de código sem a necessidade do gravador/simulador;
- Alteração de configuração do produto em campo;
- Atualização de firmware em campo;
- Meio de download de log para acompanhamento de funcionamento;
- Meio de comunicação com outra aplicação seguindo um protocolo (MODBUS por exemplo);
- Comunicação com módulos de comunicação (Modem GPRS, Wi-Fi, Bluetooth…);
- Etc…
Para exemplificar, será utilizada a placa FRDM-K64F. Será uma série dividida em três partes:
- Utilizando a UART da FRDM-K64F com o componente fsl_debug_console;
- Utilizando a UART da FRDM-K64F com o componente fsl_uart sem Interrupção;
- Utilizando a UART da FRDM-K64F com o componente fsl_uart com Interrupção.
Com esta placa é possível disponibilizar esta interface basicamente de duas maneiras:
- Montar um circuito de interface bem conhecido utilizando um MAX3232 e assim consegue-se os níveis de tensão para o padrão RS232, ou até mesmo sem este transceptor, caso seja necessária a comunicação com algum módulo (GPS);
- Utilizar a serial disponibilizada pelo gravador/simulador presente na placa. Desta maneira não é necessário nenhum circuito a mais, porém, esta interface só funcionará quando o código estiver em modo de depuração. Esta será a serial utilizada nesta série.
Detalhe da UART utilizada na FRDM-K64F
No esquemático da placa K64F, página 4, tem os sinais RX e TX da UART ligados ao debugger. E os sinais que são ligados ao microcontrolador da placa, PTB16 e PTB17.
Ainda no esquemático mas na página 3, estão os sinais utilizados para a UART0 do microcontrolador.
Preparação do ambiente
O ambiente pode ser preparado utilizando este artigo do Denis Shimizu. Para a preparação da placa, sugiro seguir este artigo escrito por mim.
Criação do projeto
1) Com o KDS aberto, seguir o caminho “File -> New -> Kinetis Project“.
2) No campo “Project Name” digitar o seguinte nome “K64F-UART”. Clicar em “Next”.
3) Selecionar o microcontrolador no caminho “Processor -> Kinetis K -> MK60 -> MK64F (120MHz) -> MK64FN1M0xxx12”. Clicar em “Next“.
4) No campo Kinetis SDK, selecionar o KSDK instalado. No meu caso é o “KSDK_1.3.0”. Marcar a opção “Processor Expert”. No campo “Start with perspective designed for”, manter marcada a opção “use current perspective”. No campo “Project Mode”, manter marcada a opção “Standalone”. Clicar em “Next”.
5) Em “Target Compiler“, selecionar “GNU C Compiler“. Clicar em “Finish“.
Adicionando e configurando o componente via Processor Expert
1) Abrir a janela referente ao Processor Expert. Caso esta ainda não esteja disponível, é possível exibí-la seguindo o caminho: “Menu Processor Expert -> Show Views”.
2) Selecionar as abas “Components Library -> Categories”. Selecionar o componente de serial pelo seguinte caminho: “KSDK 1.3.0 -> Peripheral Drivers/HAL -> Utilities -> fsl_debug_console”.
3) Clicar duas vezes no componente para adicioná-lo ao projeto.
4) Clicar no componente que acabou de ser adicionado, e clicar na aba “Component Inspector”.
5) Para facilitar a visualização dos parâmetros, normalmente eu altero as algumas configurações do PE. Clicar no botão “Advanced”. Clicar na seta para baixo onde mais configurações são exibidas e desmarcar a opção “Tabs View”.
6) Vendo o trecho do esquema nas figuras anteriores, é necessário utilizar a UART0, que já está selecionada.
7) No campo “Pins -> Pins/Signals -> Receiver -> RxD” alterar o pino para PTB16.
8) No campo “Pins -> Pins/Signals -> Transmitter -> TxD” alterar o pino para PTB17.
9) Configuração feita, agora é necessário gerar o código. Clicar no botão “Generate Processor Expert Code” e aguardar o fim do barra de progresso.
Funções disponíveis para o componente serial utilizado
Código de exemplo
Vamos criar um simples menu de configuração, fazendo uso das funções do componente adicionado.
A ideia do menu é mostrar uma lista de parâmetros, selecioná-los de acordo com a numeração. Se a opção selecionada não estiver disponível, apresenta uma mensagem de opção inválida.
Para isso, vamos utilizar uma estrutura de máquina de estado bem simples, sem nos preocuparmos com o tamanho do código, mas sim em utilizar as funções do componente serial.
//Função para limpar a tela do terminal serial
void LimpaTela(void)
{
uint8_t i;
for(i = 0; i < 30; i++)
debug_printf(“\n”);
debug_printf(“\r”);
}
int main(void)
{
uint8_t Estado = 0; //Controle da máquina de estados
uint8_t Opcao = 0; //Recebe opção selecionada
while(1)
{
switch(Estado)
{
//Imprime Menu
case 0:
LimpaTela(); //Limpa a tela do terminal serial
//Apresenta o menu de configuração
debug_printf("Menu de Configuracao\r\n\n");
debug_printf("1 - Calibracao de sensores\r\n");
debug_printf("2 - Configuracao de canais de comunicacao\r\n");
debug_printf("3 - Teste de hardware\r\n\n");
debug_printf("OPCAO: ");
Estado = 1; //Alterna para o estado de aguardar opção
break;
//Aguarda Seleção da opção e testa se é válida
case 1:
Opcao = debug_getchar(); //Espera uma tecla ser pressionada
LimpaTela(); //Limpa a tela do terminal serial
//Tratamento da opção selecionada
switch(Opcao)
{
case '1':
debug_printf("Calibracao de sensores\r\n\n");
debug_printf("1 - Sensor 1\r\n");
debug_printf("2 - Sensor 2\r\n");
debug_printf("3 - Sensor 3\r\n");
break;
case '2':
debug_printf("Configuracao de canais de comunicacao\r\n\n");
debug_printf("1 - Canal 1\r\n");
debug_printf("2 - Canal 2\r\n");
debug_printf("3 - Canal 3\r\n");
break;
case '3':
debug_printf("Teste de hardware\r\n\n");
debug_printf("1 - Saida 1\r\n");
debug_printf("2 - Saida 2\r\n");
debug_printf("3 - Saida 3\r\n");
break;
//Qualquer tecla diferente é uma opção inválida
default:
debug_printf("Opcao Invalida\r\n\n");
break;
}
OSA_TimeDelay(2000); //Função de Delay criada pelo PE 2000ms
Estado = 0; //Alterna para o estado de apresentação do menu
break;
}
}
}
Para testar a aplicação, é necessário um terminal serial. Eu utilizo o teraterm.
Configurar o terminal serial para se comunicar com a porta COM gerada pela placa. O baudrate deve ser 115200.
Estas são as telas geradas de acordo com as opções selecionadas.
Conclusão
A funcionalidade do Processor Expert de já criar funções com base em uma porta serial é bem interessante, assim já é possível fazer testes de hardware e algumas depurações. Mas não é a maneira mais eficiente, por conta do tamanho do código gerado para cada função. Sendo assim, nos próximos artigos serão apresentadas outras maneiras de utilizar a UART.





