Interrupções e EXTI com STM32F103C8T6

O que são interrupções?

Em sistemas eletrônicos digitais, o processamento normalmente ocorre de forma sequencial, onde o sistema executa continuamente um fluxo principal de instruções dentro de um loop.

Interrupções são mecanismos de hardware que permitem que eventos externos ou internos interrompam temporariamente essa execução para que uma rotina de atendimento seja executada imediatamente.

No STM32, as interrupções externas são implementadas através do periférico EXTI (External Interrupt/Event Controller), que permite detectar mudanças de nível lógico em pinos GPIO sem a necessidade de verificação contínua por software (polling).

Esse mecanismo é essencial em sistemas embarcados, pois reduz o consumo de CPU e garante resposta rápida a eventos assíncronos, como acionamento de botões, sensores digitais e sinais externos.

Neste exemplo, será utilizado o pino PA0 como entrada de interrupção e o LED do PC13 como saída para demonstrar o funcionamento do sistema baseado em eventos.

Esquema de ligação

Esquema de ligação STM32 EXTI

O botão foi conectado ao pino PA0 e o LED onboard da Blue Pill utiliza o pino PC13.

Funcionamento da interrupção EXTI

Fluxo da interrupção EXTI

Quando o botão conectado ao PA0 é pressionado, o periférico EXTI detecta a mudança de nível lógico e gera uma interrupção.

O NVIC então executa automaticamente a função HAL_GPIO_EXTI_Callback(), onde vamos alternar o estado do LED no PC13.

Configuração no STM32CubeIDE

Passo 1 — Configurar o PC13 como saída

Configure o pino PC13 como GPIO_Output.

Configurando PC13 como GPIO Output

Passo 2 — Configurar o PA0 como EXTI

Configure o pino PA0 como GPIO_EXTI0.

Configurando PA0 como GPIO EXTI0

Passo 3 — Configurar Pull-up

Configure o PA0 com resistor interno Pull-up.

Configuração Pull-up do PA0

Dessa forma o pino ficará normalmente em nível alto, indo para nível baixo quando o botão for pressionado.

Passo 4 — Habilitar interrupção no NVIC

Vá em:

Habilitando interrupção EXTI0

Código em C utilizando HAL

O código abaixo alterna o LED do PC13 sempre que o botão conectado ao PA0 for pressionado.


#include "main.h"

int main(void)
{
    HAL_Init();

    SystemClock_Config();

    MX_GPIO_Init();

    while (1)
    {

    }
}

/*
 * Callback da interrupção EXTI
 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(GPIO_Pin == GPIO_PIN_0)
    {
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
    }
}
        

Como funciona o código

HAL_GPIO_EXTI_Callback() é chamada automaticamente pela HAL quando ocorre uma interrupção externa.

A variável GPIO_Pin identifica qual pino gerou a interrupção.

No nosso exemplo verificamos:


if(GPIO_Pin == GPIO_PIN_0)
        

Isso garante que a interrupção veio do PA0.

Em seguida:


HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        

alterna o estado do LED conectado ao PC13.

Como estamos utilizando interrupções, o while principal pode permanecer vazio.

Vantagens de utilizar interrupções

Observação importante sobre o PC13

Na Blue Pill o LED onboard do PC13 normalmente trabalha invertido.

Mesmo assim, a função Toggle continua funcionando corretamente.

Conclusão

As interrupções externas (EXTI) são um recurso fundamental em sistemas embarcados, pois permitem que o microcontrolador reaja imediatamente a eventos externos sem depender de verificação contínua por software.

Neste artigo, foi apresentado o funcionamento do periférico EXTI no STM32F103C8T6, incluindo a configuração de um pino GPIO como fonte de interrupção e o uso de callbacks da HAL para tratamento do evento.

Foi demonstrado também como o NVIC gerencia a execução das interrupções e como o STM32 prioriza automaticamente eventos críticos do sistema.

Esse conceito é amplamente utilizado em aplicações reais como leitura de botões, sensores digitais, encoders e sistemas baseados em eventos, sendo essencial para projetos eficientes e responsivos.

Com esse conhecimento, o próximo passo é avançar para o uso de interrupções mais complexas, como timers e comunicação serial, onde múltiplos eventos podem ocorrer simultaneamente.

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.

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

👉 Acesse agora:

Ver curso STM32 para Iniciantes