Timers no STM32F103C8T6

O que são timers?

Em sistemas embarcados, muitas tarefas precisam ser executadas em intervalos de tempo precisos, como piscar LEDs, gerar sinais PWM, medir períodos ou sincronizar eventos.

Uma abordagem comum para isso seria utilizar loops com delays em software, porém isso bloqueia o processador e reduz a eficiência do sistema.

Os timers resolvem esse problema através de periféricos de hardware dedicados, capazes de contar ciclos de clock de forma independente da CPU.

No STM32F103C8T6, os timers funcionam como contadores automáticos que podem gerar interrupções quando atingem um valor pré-configurado, permitindo a execução de tarefas de forma periódica e precisa.

Esse mecanismo é fundamental em sistemas embarcados, pois permite criar temporizações confiáveis sem sobrecarregar o processamento principal.

Neste artigo, será utilizado o TIM2 para gerar uma interrupção periódica e alternar o estado do LED no PC13, demonstrando na prática o funcionamento do timer.

Árvore de clock STM32F103C8T6 com HSE e PLL

Essa configuração é essencial porque define a base de tempo dos timers. Quanto mais preciso o clock, mais preciso será o comportamento temporal do sistema.

Esquema de ligação do LED

Antes da configuração do timer, utilizamos o LED onboard da Blue Pill como saída de teste.

LED conectado à Blue Pill STM32F103C8T6

O LED está conectado ao pino PC13 e será utilizado para visualizar o funcionamento do timer.

Configuração do PC13 como GPIO Output

O pino PC13 precisa ser configurado como saída digital para permitir o controle do LED.

Configuração PC13 como GPIO Output no STM32CubeIDE

Configuração do Timer + NVIC (interrupção global)

Nesta etapa configuramos o TIM2 no STM32CubeIDE para gerar interrupções periódicas com base no clock de 72 MHz. Além disso, habilitamos a interrupção global no NVIC.

Configuração do Timer com interrupção global no NVIC

Parâmetros utilizados no projeto

Com essa configuração, o clock de 72 MHz é dividido inicialmente por 7200, gerando uma base de 10 kHz para o contador do timer.

O ARR define o período final da interrupção, permitindo controle preciso do intervalo de tempo.

Interrupção (NVIC)

Ao habilitar o NVIC, o STM32 passa a executar automaticamente a rotina de callback sempre que ocorre overflow do timer. A prioridade 0 garante execução imediata da interrupção.

Como o timer funciona internamente

O timer é um contador de hardware que incrementa a cada pulso de clock.

Quando o contador atinge o valor de ARR, uma interrupção é gerada automaticamente.

Fórmula do timer

Ftimer = Fclock / ((PSC + 1) × (ARR + 1))

Exemplo prático (TIM2 + interrupção)


#include "main.h"
#include "tim.h"
#include "gpio.h"

TIM_HandleTypeDef htim2;

int main(void)
{
    HAL_Init();
    SystemClock_Config(); // HSE + PLL (72MHz)

    MX_GPIO_Init();
    MX_TIM2_Init();

    HAL_TIM_Base_Start_IT(&htim2);

    while (1)
    {
    }
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM2)
    {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
    }
}

Como funciona o código

O TIM2 é iniciado em modo de interrupção.

Quando ocorre overflow (ARR atingido), o NVIC chama automaticamente o callback.

Dentro do callback, o LED do PC13 é alternado.

Aplicações dos timers

Diferença entre Timers e HAL_Delay() no STM32

Quando estamos começando a programar o STM32, é comum utilizar a função HAL_Delay() para criar temporizações. Embora seja simples, essa função bloqueia a execução do programa durante o tempo especificado.

Por exemplo, ao executar HAL_Delay(1000), o microcontrolador fica aguardando aproximadamente 1 segundo antes de continuar a execução da próxima instrução.

Já os timers funcionam de maneira diferente. Eles são periféricos de hardware que realizam a contagem do tempo de forma independente da CPU, permitindo que o programa principal continue executando outras tarefas normalmente.

No exemplo apresentado neste artigo, o LED é alternado através da interrupção do TIM2, enquanto o laço principal (while(1)) permanece livre para executar qualquer outra atividade necessária.

HAL_Delay() Timer + Interrupção
Bloqueia a CPU Executa em hardware
Programa fica parado Programa continua executando
Ideal para testes simples Ideal para aplicações reais
Menor eficiência Maior desempenho

Por esse motivo, em projetos embarcados profissionais, os timers são largamente utilizados para geração de eventos periódicos, aquisição de dados, controle de motores, protocolos de comunicação e diversas outras aplicações que exigem precisão temporal sem interromper o funcionamento do sistema.

Conclusão

Os timers são periféricos fundamentais do STM32, permitindo a execução de tarefas periódicas com precisão e sem bloquear o funcionamento do sistema.

Ao longo deste artigo, vimos como configurar o TIM2, entender a influência da árvore de clock baseada em HSE + PLL e utilizar interrupções através do NVIC para executar eventos automaticamente.

Também foi possível comparar essa abordagem com o uso da função HAL_Delay(). Enquanto o delay interrompe a execução do programa durante um determinado intervalo de tempo, os timers trabalham de forma independente da CPU, permitindo que outras tarefas continuem sendo executadas normalmente.

Esse conceito é amplamente utilizado em aplicações embarcadas reais, tornando os timers uma das ferramentas mais importantes para o desenvolvimento de sistemas eficientes e com comportamento temporal previsível.

Com essa base, já é possível aplicar timers em projetos reais como controle de tempo, geração de sinais e automação embarcada.

Próximo passo: evoluir no STM32

O curso STM32 para Iniciantes foi desenvolvido para ajudar estudantes e profissionais a iniciarem no desenvolvimento de sistemas embarcados utilizando microcontroladores da família STM32.

Você vai aprender GPIO, ADC, PWM, UART, SPI, I2C, CAN, timers e muito mais.

👉 Acesse agora:

Ver curso STM32 para Iniciantes