Guia Completo: Configuração e Uso da UART no STM32

A UART (Universal Asynchronous Receiver/TransmitterUsando UART no STM32 para comunicação serialUsando UART no STM32 para comunicação serialDescubra as melhores práticas para implementar a comunicação UART no STM32, incluindo exemplos com HAL, DMA e técnicas de depuração para projetos confiáveis.) é um dos protocolos mais essenciais para comunicação serial em sistemas embarcados. No STM32, ela serve como ferramenta crítica para debug, integração com módulos externos (como GPS, sensores e dispositivos IoT) e comunicação entre microcontroladores. Este guia aprofundado combina conceitos teóricos, configuração prática e técnicas avançadas para dominar a UART no ecossistema STM32.

📌 Sumário🔗

Conceitos Básicos da UART🔗

A UARTUsando UART no STM32 para comunicação serialUsando UART no STM32 para comunicação serialDescubra as melhores práticas para implementar a comunicação UART no STM32, incluindo exemplos com HAL, DMA e técnicas de depuração para projetos confiáveis. é um protocolo assíncrono e full-duplex (transmissão e recepção simultâneas). Seus parâmetros fundamentais incluem:

  • Baud Rate: Velocidade de comunicação (ex: 9600, 115200 bps).
  • Frame: 1 start bit + 5-9 data bits + paridade (opcional) + 1-2 stop bits.
  • Sincronização: Baseada em acordos pré-definidos, sem clock compartilhado.
graph LR A[Start Bit] --> B[Data Bits] --> C[Parity Bit] --> D[Stop Bits]

Cálculo do Baud Rate

A taxa é determinada pela fórmula:

$$ \text{Baud Rate} = \frac{f_{CK}}{8 \times (2 - \text{OVER8}) \times \text{USARTDIV}} $$

Onde:

Arquitetura e Funcionamento no STM32🔗

Os microcontroladores STM32Famílias de microcontroladores STM32: Uma visão geralFamílias de microcontroladores STM32: Uma visão geralProfundo mergulho nas famílias STM32, explorando arquitetura, aplicações e desempenho. Descubra dicas e casos práticos para projetos embarcados. oferecem módulos UART flexíveis, com suporte a:

flowchart TD A[Transmissor UART] -->|Tx| B[Canal Serial] B -->|Rx| C[Receptor UART] C --> D[Processamento de Dados]

Configuração de Hardware e Software🔗

Passo a Passo com HAL

1. Habilitar Clock do UART e GPIOConfigurando e usando GPIOs no STM32Configurando e usando GPIOs no STM32Explore neste tutorial os fundamentos e configurações práticas dos GPIOs no STM32, com exemplos de LED, botões e modos alternativos.:

__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();

2. Configurar Pinos (TX: PA9, RX: PA10):

GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
GPIO_InitStruct.Pull = GPIO_PULLUP; // Pull-up para estabilidade
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

3. Inicializar a UARTUsando UART no STM32 para comunicação serialUsando UART no STM32 para comunicação serialDescubra as melhores práticas para implementar a comunicação UART no STM32, incluindo exemplos com HAL, DMA e técnicas de depuração para projetos confiáveis.:

UART_HandleTypeDef huart1;
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
HAL_UART_Init(&huart1);

Exemplo Prático: Transmissão, Recepção e Debug🔗

Envio de Dados e Redirecionamento do printf

// Envio simples
char msg[] = "Temperatura: 25°C\r\n";
HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
// Redirecionar printf
#include <stdio.h>
int _write(int file, char *ptr, int len) {
    HAL_UART_Transmit(&huart1, (uint8_t*)ptr, len, HAL_MAX_DELAY);
    return len;
}
printf("ADC Value: %d\r\n", adc_value); // Uso direto

Recepção com Interrupção e Buffer Circular

uint8_t rx_buffer[64];
HAL_UART_Receive_IT(&huart1, rx_buffer, sizeof(rx_buffer));
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart == &huart1) {
        // Processar dados (ex: parser de comandos)
        HAL_UART_Receive_IT(&huart1, rx_buffer, sizeof(rx_buffer)); // Reiniciar recepção
    }
}

UART com DMA: Otimizando Performance🔗

O DMA permite transferir dados entre memória e UARTUsando UART no STM32 para comunicação serialUsando UART no STM32 para comunicação serialDescubra as melhores práticas para implementar a comunicação UART no STM32, incluindo exemplos com HAL, DMA e técnicas de depuração para projetos confiáveis. sem consumir ciclos da CPU:

// Transmissão via DMA
HAL_UART_Transmit_DMA(&huart1, (uint8_t*)dados, tamanho);
// Recepção contínua em modo circular
HAL_UART_Receive_DMA(&huart1, rx_buffer, sizeof(rx_buffer));

Vantagens:

  • Ideal para grandes volumes de dados (ex: streaming de sensores).
  • Reduz latência em sistemas críticos.

Protocolos e Tratamento de Erros🔗

Implementação de Protocolos

Para garantir integridade dos dados, adote estruturas como:

<START> [COMANDO] [DADOS] [CHECKSUM] <END>

Exemplo com checksum:

uint8_t calcular_checksum(uint8_t *dados, int tamanho) {
    uint8_t sum = 0;
    for (int i = 0; i < tamanho; i++) sum ^= dados[i];
    return sum;
}

Tratamento de Erros

Intercepte erros comuns (overrun, noise, framing):

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) {
    if (huart->ErrorCode & HAL_UART_ERROR_ORE) {
        __HAL_UART_CLEAR_OREFLAG(huart); // Limpar flag de overrun
    }
    // Log de erro ou reinicialização
}

Casos de Uso Reais🔗

1. Integração com Módulo GPS:

// Leitura de sentença NMEA
HAL_UART_Receive_DMA(&huart1, gps_buffer, 82); // Tamanho típico de uma sentença

2. Comunicação com Raspberry Pi:

  • Protocolo customizado com cabeçalho, payload e CRC.
  • Baud rates elevados (230400 ou 460800 bps).

3. Sistema Multi-MCU:

Boas Práticas e Troubleshooting🔗

Tabela de Soluções Rápidas

ProblemaSolução
Dados corrompidosVerifique baud rate, conexão GND, pull-ups
Timeouts frequentesAumente timeout ou prioridade de interrupção
Erros de overrunUse DMA ou aumente prioridade da ISR

Dicas Avançadas

  • Isolamento Eletrônico: Use optoacopladores em ambientes ruidosos.
  • Buffer Circular: Gerencie dados de recepção sem perda.
#define BUFFER_SIZE 128
uint8_t buffer[BUFFER_SIZE];
volatile uint32_t head = 0, tail = 0;
void armazenar_dado(uint8_t dado) {
    buffer[head] = dado;
    head = (head + 1) % BUFFER_SIZE;
}
  • Modularização: Separe funções de inicialização, TX e RX para reuso.

Conclusão🔗

A UART no STM32 é uma ferramenta versátil para debug, integração de periféricos e comunicação entre sistemas. Dominar sua configuração, otimização via DMA e tratamento de erros permite desenvolver soluções robustas e eficientes. Este guia combinou fundamentos teóricos, exemplos práticos e técnicas avançadas para cobrir desde projetos simples até sistemas complexos. Adapte essas estratégias às suas necessidades e explore todo o potencial da comunicação serialTouchscreen capacitivo com STM32: Integração e calibraçãoTouchscreen capacitivo com STM32: Integração e calibraçãoDescubra como utilizar touchscreens capacitivos com STM32, explorando conexão, calibração e firmware para interfaces precisas e responsivas. em seus projetos embarcados.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados