Flags de Reset no STM32 (RCC->CSR)

O que são as flags de reset?

Em sistemas embarcados, identificar a causa de um reset é uma informação extremamente importante para garantir a confiabilidade do equipamento. Um microcontrolador pode reiniciar por diversos motivos, como falha na alimentação, acionamento externo, erro de software ou travamento da aplicação.

O STM32 possui um mecanismo interno de diagnóstico que registra automaticamente a origem do último reset ocorrido. Essas informações ficam armazenadas no registrador RCC->CSR (Reset Control Status Register), pertencente ao controlador de clock RCC.

Dentro desse registrador existem diversas flags de status. Cada flag representa uma possível causa de reinicialização do microcontrolador, permitindo que o firmware identifique exatamente o motivo pelo qual o sistema foi reiniciado.

Entre as principais causas de reset estão:

Essas flags são mantidas pelo hardware mesmo após o microcontrolador iniciar novamente. Dessa forma, o programa pode consultar essas informações logo no início da execução e registrar a causa do reset para análise posterior.

Essa funcionalidade é muito utilizada em equipamentos industriais, sistemas automotivos e dispositivos IoT, onde o equipamento pode estar instalado em locais de difícil acesso e precisa armazenar informações sobre falhas ocorridas durante a operação.

Registrador RCC CSR STM32 mostrando as flags de reset

Como ler as flags de reset

As flags de reset podem ser consultadas pelo software logo após a inicialização do microcontrolador. No STM32 utilizando a biblioteca HAL, a forma mais simples é utilizar as macros disponibilizadas pela própria ST.

Cada macro verifica uma determinada condição armazenada no registrador RCC->CSR.


if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST))
{
    // Power-On Reset detectado
}

if (__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST))
{
    // Brown-Out Reset detectado
}

if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST))
{
    // Reset pelo pino NRST detectado
}

if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST))
{
    // Reset por software detectado
}

if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST))
{
    // Reset pelo Independent Watchdog detectado
}

if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST))
{
    // Reset pelo Window Watchdog detectado
}

if (__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST))
{
    // Reset Low Power detectado
}

Também é possível acessar diretamente o registrador RCC->CSR para realizar uma análise mais detalhada dos bits de status.


uint32_t flags_reset;

flags_reset = RCC->CSR;

O valor armazenado em flags_reset contém todos os bits referentes às causas de reset. Cada bit representa uma flag específica conforme definido no manual de referência do microcontrolador.

Em aplicações profissionais, normalmente as flags são lidas no início da função main(), antes da inicialização dos periféricos, para garantir que a informação do último reset seja preservada.


int main(void)
{
    HAL_Init();

    // Verifica causa do último reset
    diagnosticoReset();

    // Limpa as flags após a leitura
    __HAL_RCC_CLEAR_RESET_FLAGS();

    SystemClock_Config();

    while (1)
    {
        // Aplicação principal
    }
}

A ordem é importante: primeiro o firmware deve identificar a causa do reset, depois limpar as flags. Caso contrário, as informações do evento anterior serão perdidas.

Power-On Reset (PORRSTF)

A flag PORRSTF (Power-On Reset Flag) indica que o microcontrolador foi reiniciado devido à aplicação inicial da alimentação elétrica.

Quando o STM32 é ligado, o circuito interno de gerenciamento de energia monitora a subida da tensão de alimentação. Enquanto a tensão não atingir um nível adequado para o funcionamento correto do dispositivo, o hardware mantém o microcontrolador em estado de reset.

Após a alimentação estabilizar, o STM32 libera o reset interno e inicia a execução do firmware armazenado na memória Flash. Nesse momento, a flag PORRSTF é registrada no controlador RCC, permitindo que o software identifique que ocorreu uma inicialização completa do sistema.

Quando ocorre o Power-On Reset?

Leitura da flag PORRST

A identificação do Power-On Reset pode ser feita através da biblioteca HAL utilizando a macro de leitura das flags do RCC.


if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST))
{
    // Sistema iniciado por Power-On Reset
}

Também é possível verificar diretamente o bit correspondente no registrador RCC->CSR.


uint32_t reset_status;

reset_status = RCC->CSR;

Aplicação prática

Em equipamentos embarcados, identificar um Power-On Reset permite diferenciar uma inicialização normal do sistema de uma reinicialização causada por uma falha durante a operação.

Por exemplo, um produto pode armazenar em memória não volátil a causa do último reset ocorrido. Caso a flag PORRSTF esteja ativa, o firmware pode registrar que o equipamento foi ligado ou que houve uma perda completa de alimentação.

Exemplo de utilização em um sistema real

Imagine um controlador industrial que possui uma placa STM32 instalada em campo. Após uma manutenção, o técnico liga novamente a alimentação e o equipamento inicia.

Durante a inicialização, o firmware consulta as flags de reset e encontra:


PORRSTF = 1

Dessa forma, o sistema sabe que o evento foi causado pela aplicação da alimentação e não por uma falha de software, watchdog ou comando externo de reset.

Brown-Out Reset (BORRSTF)

A flag BORRSTF (Brown-Out Reset Flag) indica que o microcontrolador foi reiniciado devido a uma queda da tensão de alimentação abaixo do nível mínimo necessário para uma operação segura.

O STM32 possui um circuito interno de monitoramento de tensão chamado Brown-Out Reset (BOR). Esse circuito acompanha continuamente a alimentação do microcontrolador e, caso a tensão fique abaixo do limite configurado, gera automaticamente um reset no dispositivo.

Essa proteção evita que o processador continue executando instruções em uma condição de baixa tensão, onde podem ocorrer comportamentos inesperados, corrupção de dados na memória, falhas de comunicação ou execução incorreta do firmware.

Quando ocorre o Brown-Out Reset?

Leitura da flag BORRST

Após um reset causado pelo circuito de Brown-Out, a flag BORRSTF fica armazenada no registrador RCC->CSR e pode ser consultada pelo firmware.


if (__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST))
{
    // Reset causado por Brown-Out detectado
}

A informação pode ser utilizada para registrar eventos de falha de alimentação e auxiliar na análise de problemas em campo.

Níveis de detecção do Brown-Out

Dependendo da família STM32 utilizada, o nível de tensão em que o BOR atua pode ser configurado através das opções de alimentação do dispositivo.

A escolha correta do nível de detecção permite equilibrar proteção do sistema e faixa de operação da aplicação.

Exemplo de aplicação em campo

Considere um equipamento embarcado que controla uma carga de alta corrente. Durante o acionamento dessa carga, ocorre uma queda momentânea na fonte de alimentação.

O STM32 identifica que a tensão ficou abaixo do limite seguro e executa automaticamente o seguinte processo:

Importância do BOR em sistemas embarcados

A flag BORRSTF é uma das informações mais importantes para diagnóstico de falhas em produtos eletrônicos.

Em equipamentos instalados em campo, ela pode indicar problemas como fonte inadequada, cabeamento com queda de tensão, bateria descarregada ou consumo excessivo de algum componente conectado ao sistema.

Reset pelo pino NRST (PINRSTF)

A flag PINRSTF (Pin Reset Flag) indica que o microcontrolador foi reiniciado através do pino externo de reset NRST.

O pino NRST é uma entrada dedicada do STM32 responsável por reiniciar o dispositivo externamente. Quando esse pino é colocado em nível lógico baixo, o circuito interno de reset é ativado e o microcontrolador retorna para o estado inicial de execução.

Esse mecanismo permite que outros circuitos ou o próprio usuário possam reiniciar o sistema sem a necessidade de remover a alimentação ou executar qualquer comando pelo firmware.

Quando ocorre o Reset pelo pino NRST?

Funcionamento do reset externo

Quando o pino NRST é levado ao nível baixo, o STM32 interrompe imediatamente a execução do programa e inicia uma sequência interna de reset.

Após a liberação do pino NRST, o microcontrolador inicia novamente a execução do firmware e registra a ocorrência através da flag PINRSTF no registrador RCC->CSR.

Leitura da flag PINRST

A identificação de um reset externo pode ser feita utilizando a biblioteca HAL:


if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST))
{
    // Reset causado pelo pino NRST
}

Essa informação pode ser utilizada pelo firmware para registrar eventos de operação ou identificar ações externas sobre o equipamento.

Exemplo com botão de reset

Uma aplicação comum é utilizar um botão conectado entre o pino NRST e o GND.

Ao pressionar o botão:

Uso com programadores e depuradores

Durante o desenvolvimento, ferramentas como o ST-Link podem utilizar o pino NRST para reiniciar o microcontrolador antes da gravação ou durante processos de depuração.

Nessa situação, após o reinício do sistema, o firmware pode identificar que o reset ocorreu através de uma origem externa consultando a flag PINRSTF.

Aplicação em sistemas embarcados

A detecção do PINRSTF é importante para diferenciar um reset solicitado externamente de outros eventos, como falhas de alimentação ou problemas no software.

Em equipamentos industriais, essa informação pode ser armazenada em memória não volátil para criar um histórico de eventos e facilitar diagnósticos durante manutenção.

Software Reset (SFTRSTF)

A flag SFTRSTF (Software Reset Flag) indica que o microcontrolador foi reiniciado através de uma solicitação realizada pelo próprio software.

Diferente de resets causados por eventos externos ou condições elétricas, esse tipo de reset é gerado pelo firmware durante a execução da aplicação. O próprio programa solicita ao hardware que reinicie o microcontrolador.

No STM32, o reset por software normalmente é realizado através da função NVIC_SystemReset(), fornecida pela biblioteca CMSIS. Essa função envia um comando ao controlador NVIC para iniciar uma sequência completa de reset do sistema.

Como executar um Software Reset?

O reset por software pode ser solicitado pelo código da aplicação:


NVIC_SystemReset();

Após a execução dessa função, o STM32 reinicia como se tivesse ocorrido um reset físico. O processador retorna ao estado inicial, os registradores são reinicializados e o programa começa novamente a partir do vetor de reset.

Quando utilizar o Software Reset?

Leitura da flag SFTRST

Após um reset solicitado pelo firmware, a flag SFTRSTF fica armazenada no registrador RCC->CSR.


if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST))
{
    // Reset causado por software
}

Essa informação permite ao sistema identificar que o reinício foi intencional e solicitado pela própria aplicação.

Exemplo de uso em bootloader

Um cenário muito comum é durante uma atualização de firmware.

O fluxo pode ocorrer da seguinte forma:

Registro da causa do reset

Em sistemas mais avançados, a aplicação pode salvar informações antes de executar o reset por software.


salvarMotivoReset();

NVIC_SystemReset();

Dessa forma, após a reinicialização, o firmware consegue identificar que o reset foi solicitado internamente e também recuperar informações adicionais do estado anterior do sistema.

Aplicação em sistemas embarcados

O Software Reset é muito utilizado em equipamentos que precisam realizar reinicializações controladas sem intervenção do usuário.

Ele permite criar mecanismos de recuperação automática, aumentando a confiabilidade do sistema e facilitando atualizações e manutenção do firmware.

Watchdog Reset (IWDGRSTF)

A flag IWDGRSTF (Independent Watchdog Reset Flag) indica que o microcontrolador foi reiniciado pelo Independent Watchdog (IWDG).

O watchdog é um mecanismo de segurança utilizado para detectar falhas no software. Ele funciona como um temporizador independente que precisa ser atualizado periodicamente pelo firmware.

Caso a aplicação deixe de atualizar o watchdog dentro do tempo configurado, o hardware assume que o sistema entrou em uma condição inesperada e executa automaticamente um reset no microcontrolador.

Como funciona o Independent Watchdog?

O IWDG utiliza um contador interno que é decrementado continuamente. Enquanto o software executa corretamente, ele deve enviar comandos periódicos para recarregar esse contador.


HAL_IWDG_Refresh(&hiwdg);

Se essa atualização não ocorrer antes do contador chegar a zero, o STM32 gera um reset automático e registra a causa através da flag IWDGRSTF.

Quando ocorre o Watchdog Reset?

Leitura da flag IWDGRST

Após um reset causado pelo watchdog independente, a flag IWDGRSTF permanece armazenada no registrador RCC->CSR.


if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST))
{
    // Reset causado pelo Independent Watchdog
}

Essa informação permite ao firmware identificar que o sistema reiniciou devido a uma possível falha durante a execução do software.

Exemplo prático

Imagine um controlador STM32 instalado em uma máquina industrial. Durante a operação, uma falha de software faz com que o programa fique preso em um laço infinito.

O comportamento será:

Uso em sistemas embarcados

O Independent Watchdog é muito utilizado em produtos que precisam operar continuamente sem intervenção humana.

Equipamentos industriais, sistemas automotivos e dispositivos IoT utilizam o watchdog como uma camada de proteção contra travamentos inesperados do firmware.

A análise da flag IWDGRSTF permite identificar problemas de software que poderiam passar despercebidos em testes normais.

Boas práticas utilizando IWDG

Window Watchdog Reset (WWDGRSTF)

A flag WWDGRSTF (Window Watchdog Reset Flag) indica que o microcontrolador foi reiniciado pelo Window Watchdog (WWDG).

O Window Watchdog é um periférico de segurança utilizado para monitorar a execução do software e verificar se determinadas tarefas estão sendo executadas dentro do tempo esperado.

Diferente de um temporizador comum, o WWDG possui uma janela de atualização. Isso significa que o software não pode atualizar o watchdog em qualquer momento: a atualização deve ocorrer dentro de uma faixa de tempo configurada previamente.

Caso o firmware não atualize o contador dentro dessa janela, o hardware entende que ocorreu uma falha na execução do programa e gera automaticamente um reset no microcontrolador.

Como funciona o Window Watchdog?

O WWDG possui um contador interno que é decrementado continuamente enquanto o sistema está em funcionamento.

Durante a operação normal, o firmware deve atualizar esse contador periodicamente utilizando o periférico configurado.

A atualização do contador do Window Watchdog é realizada pelo firmware através da função HAL correspondente ao periférico configurado.


HAL_WWDG_Refresh(&hwwdg);

O reset pode ocorrer em duas situações:

Em ambos os casos, o STM32 considera que existe uma falha no comportamento da aplicação e executa um reset automático.

Quando ocorre o Window Watchdog Reset?

Leitura da flag WWDGRST

Após um reset causado pelo Window Watchdog, a flag WWDGRSTF permanece registrada no RCC->CSR.


if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST))
{
    // Reset causado pelo Window Watchdog
}

Essa informação permite que o firmware identifique que o último reinício do sistema ocorreu devido a uma falha relacionada ao monitoramento de tempo da aplicação.

Exemplo prático

Imagine um controlador STM32 responsável por executar uma tarefa de controle a cada 20 ms. O projeto define que o Window Watchdog deve ser atualizado dentro de uma janela específica de tempo.

Durante a operação, uma falha no software faz com que essa tarefa seja executada fora do intervalo esperado.

Aplicação em sistemas embarcados

O Window Watchdog é utilizado em aplicações onde o tempo de execução das tarefas precisa ser controlado com precisão.

Sistemas industriais, equipamentos de automação, controle de motores e aplicações críticas podem utilizar o WWDG para detectar comportamentos anormais do firmware.

A análise da flag WWDGRSTF permite identificar falhas relacionadas ao tempo de execução e auxilia no diagnóstico de problemas ocorridos durante a operação do equipamento.

Boas práticas utilizando WWDG

Low Power Reset (LPWRRSTF)

A flag LPWRRSTF (Low-Power Reset Flag) indica que o microcontrolador foi reiniciado devido a um evento relacionado aos modos de baixo consumo de energia.

Os microcontroladores STM32 possuem recursos de economia de energia que permitem reduzir o consumo de corrente quando o sistema não precisa executar todas as funções normalmente. Esses recursos são utilizados principalmente em aplicações alimentadas por bateria ou dispositivos que precisam operar por longos períodos.

Durante a utilização desses modos, determinados eventos de entrada ou saída podem provocar uma sequência especial de reinicialização. Quando isso ocorre, o hardware registra a ocorrência através da flag LPWRRSTF no registrador RCC->CSR.

Modos de baixo consumo do STM32

Os principais modos de economia de energia disponíveis nos microcontroladores STM32 são:

Quando ocorre o Low Power Reset?

Leitura da flag LPWRRST

A aplicação pode verificar se o último reset foi causado por um evento de baixo consumo através da biblioteca HAL:


if (__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST))
{
    // Reset causado por Low Power
}

Essa informação pode ser utilizada para registrar o comportamento do sistema após retornar de estados de economia de energia.

Exemplo prático

Considere um dispositivo alimentado por bateria que entra em modo Standby para reduzir o consumo durante longos períodos.

Após um evento de despertar, o sistema executa a sequência de retorno e o firmware consulta as flags de reset:


LPWRRSTF = 1

Dessa forma, a aplicação consegue identificar que o evento anterior estava relacionado ao gerenciamento de energia.

Aplicação em sistemas embarcados

A flag LPWRRSTF é especialmente importante em dispositivos alimentados por bateria, sensores remotos e equipamentos IoT, onde os modos de baixo consumo são utilizados para aumentar a autonomia energética.

Registrar essa informação permite analisar o comportamento do sistema após períodos de economia de energia e identificar possíveis problemas durante o processo de suspensão e retomada da aplicação.

Boas práticas com modos Low Power

Combinação de flags de reset

As flags de reset do STM32 não funcionam como um registro exclusivo de uma única causa. Mais de uma flag pode permanecer ativa simultaneamente no registrador RCC->CSR.

Isso acontece porque as flags são armazenadas pelo hardware e permanecem marcadas até que o software execute a limpeza manual. Dessa forma, uma flag gerada anteriormente pode continuar ativa junto com uma nova causa de reset.

Exemplo de múltiplas flags ativas

Imagine que o equipamento foi ligado normalmente e depois ocorreu um reset externo através do pino NRST.


PORRSTF = 1
PINRSTF = 1

Nesse caso, o sistema possui duas informações registradas:

Outro exemplo: falha de software

Considere um equipamento que foi ligado, executou normalmente por algumas horas e depois travou. O watchdog foi responsável por reiniciar o sistema.


PORRSTF  = 1
IWDGRSTF = 1

A interpretação correta é que o sistema teve uma inicialização por alimentação e, em algum momento posterior, ocorreu um reset causado pelo Independent Watchdog.

Como interpretar corretamente as flags

Para descobrir a causa real do último reset, o firmware deve analisar todas as flags presentes antes de realizar a limpeza do registrador.


if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST))
{
    // Houve reset pelo watchdog
}

if (__HAL_RCC_GET_FLAG(RCC_FLAG_BORRST))
{
    // Houve problema de alimentação
}

if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST))
{
    // Reset externo detectado
}

Em sistemas mais avançados, é comum criar uma função de diagnóstico que verifica todas as flags e armazena o resultado em uma variável ou memória não volátil.

Exemplo de registro da causa do reset


typedef struct
{
    uint8_t por;
    uint8_t bor;
    uint8_t pin;
    uint8_t software;
    uint8_t watchdog;
    uint8_t low_power;

} CAUSA_RESET_T;

Essa abordagem permite criar um histórico de falhas e analisar o comportamento do equipamento mesmo quando ele está instalado em campo.

Importância do diagnóstico de reset

A análise das combinações de flags é fundamental em aplicações críticas, pois um simples reinício pode ter diversas origens.

Por isso, a leitura das flags deve sempre ser realizada antes da limpeza do registrador RCC->CSR.

Como limpar as flags de reset

As flags de reset do STM32 permanecem armazenadas no registrador RCC->CSR mesmo após o microcontrolador reiniciar. Elas não são apagadas automaticamente pelo hardware.

Isso permite que o firmware consulte a causa do último reset durante a inicialização do sistema. Porém, elas permanecem armazenadas no registrador RCC->CSR até que o software execute a limpeza através do bit RMVF (Remove Reset Flag).

Limpeza utilizando a biblioteca HAL

Quando utilizando a biblioteca HAL da ST, a limpeza das flags pode ser feita através da macro:


__HAL_RCC_CLEAR_RESET_FLAGS();

Essa função remove os indicadores de reset armazenados no registrador RCC->CSR, permitindo que o próximo reset seja identificado corretamente.

Sequência recomendada no firmware

A ordem correta durante a inicialização do sistema deve ser:

  1. Ler as flags de reset;
  2. Registrar ou armazenar a causa do reset;
  3. Limpar as flags;
  4. Continuar a inicialização normal da aplicação.

int main(void)
{
    HAL_Init();

    // Analisa a causa do último reset
    diagnosticoReset();

    // Limpa as flags armazenadas
    __HAL_RCC_CLEAR_RESET_FLAGS();

    SystemClock_Config();

    while (1)
    {
        // Aplicação principal
    }
}

Por que não limpar imediatamente?

Um erro comum é limpar as flags antes de realizar a análise. Nesse caso, todas as informações sobre a origem do reset serão perdidas.

Por exemplo, se o sistema reiniciou devido ao watchdog e o firmware executar a limpeza antes da leitura:


IWDGRSTF = 1

Essa informação será apagada e não será possível identificar que houve uma falha no software.

Armazenando a causa do reset

Em aplicações profissionais, a causa do reset normalmente é salva em uma memória que não é perdida após a reinicialização, como EEPROM externa, Flash interna ou backup SRAM.

Um exemplo simples:


uint32_t ultimo_reset;

ultimo_reset = RCC->CSR;

// Salvar ultimo_reset em memória não volátil

__HAL_RCC_CLEAR_RESET_FLAGS();

Dessa forma, mesmo que o equipamento seja desligado posteriormente, o histórico do último evento pode ser recuperado durante uma manutenção.

Importância em sistemas embarcados

A limpeza correta das flags de reset é uma etapa essencial para criar um sistema confiável de diagnóstico.

Equipamentos industriais, dispositivos IoT e sistemas críticos utilizam essa informação para detectar falhas, identificar problemas recorrentes e melhorar a manutenção do produto.

Tabela resumo

Flag Origem Significado
PORRST Energia Power-On Reset
BORRST Energia Brown-Out Reset
PINRST Hardware Reset externo
SFTRST Software Reset por código
IWDGRST Watchdog Independent Watchdog
WWDGRST Watchdog Window Watchdog
LPWRRST Energia Low Power Reset

Conclusão

As flags de reset do STM32, armazenadas no registrador RCC->CSR, são uma ferramenta fundamental para diagnóstico e aumento da confiabilidade de sistemas embarcados.

Através dessas informações, o firmware consegue identificar a origem de uma reinicialização, seja ela causada por alimentação, hardware externo, software, watchdog ou gerenciamento de energia.

O uso correto das flags de reset permite detectar problemas que muitas vezes seriam difíceis de identificar, como travamentos ocasionais do software, falhas na alimentação elétrica ou eventos inesperados durante a operação.

Em aplicações profissionais, essas informações podem ser armazenadas em memória não volátil, criando um histórico de eventos que facilita a análise e manutenção de equipamentos instalados em campo.

Combinadas com técnicas como watchdog, bootloader e sistemas de recuperação automática, as flags de reset tornam o firmware mais robusto, confiável e preparado para operar continuamente em ambientes reais.

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