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:
- PORRSTF - Power-On Reset, causado pela inicialização da alimentação;
- BORRSTF - Brown-Out Reset, causado por queda da tensão de alimentação;
- PINRSTF - Reset externo através do pino NRST;
- SFTRSTF - Reset gerado pelo software;
- IWDGRSTF - Reset causado pelo Independent Watchdog;
- WWDGRSTF - Reset causado pelo Window Watchdog;
- LPWRRSTF - Reset relacionado aos modos de baixo consumo.
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.
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?
- Primeiro acionamento do equipamento após conectar a fonte de alimentação;
- Ligação após substituição ou conexão de uma bateria;
- Retorno do sistema após uma interrupção completa de energia;
- Inicialização após desligamento total do circuito.
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?
- Queda momentânea da tensão de alimentação;
- Fonte de alimentação com instabilidade;
- Bateria com baixa carga ou incapacidade de fornecer corrente suficiente;
- Grande pico de consumo causado por motores, válvulas ou atuadores;
- Problemas no projeto da alimentação, como regulador subdimensionado;
- Ruídos ou interferências na linha de alimentação.
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.
- Níveis mais altos proporcionam maior proteção contra baixa tensão;
- Níveis mais baixos permitem uma operação em uma faixa maior de tensã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:
- O circuito BOR detecta a baixa tensão;
- O microcontrolador entra em estado de reset;
- A flag BORRSTF é armazenada no RCC->CSR;
- O firmware identifica a causa após a reinicialização.
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?
- Pressionamento de um botão físico de reset conectado ao NRST;
- Acionamento por um circuito externo de supervisão;
- Reset realizado por uma ferramenta de programação ou depuração;
- Circuitos externos que monitoram falhas e solicitam reinicialização.
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:
- O pino NRST é levado ao nível baixo;
- O circuito interno de reset é acionado;
- O STM32 reinicia a execução do firmware;
- A flag PINRSTF permanece registrada para diagnóstico.
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?
- Reinicialização após atualização de firmware;
- Retorno do bootloader para a aplicação principal;
- Recuperação após detectar uma condição inesperada;
- Reinicialização controlada de periféricos e do sistema;
- Aplicações que precisam reiniciar o software sem desligar a alimentação.
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:
- O usuário solicita uma atualização;
- O bootloader recebe o novo firmware;
- O firmware é gravado na memória Flash;
- O bootloader executa NVIC_SystemReset();
- O STM32 reinicia e inicia a nova aplicação.
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?
- Travamento da aplicação;
- Loop infinito no código;
- Falha em uma rotina de comunicação;
- Corrupção do fluxo normal de execução;
- Interrupção que impede a execução do programa principal;
- Erros difíceis de reproduzir durante operação em campo.
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á:
- A aplicação deixa de executar corretamente;
- O comando de atualização do watchdog deixa de ser chamado;
- O contador do IWDG chega ao limite;
- O STM32 executa um reset automático;
- A flag IWDGRSTF é registrada.
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
- Atualizar o watchdog somente após garantir que o sistema está funcionando corretamente;
- Evitar colocar o refresh do watchdog em uma rotina que sempre será executada mesmo com falhas;
- Registrar a ocorrência do reset para análise posterior;
- Utilizar tempos de watchdog compatíveis com a aplicação.
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:
- O contador chega ao limite inferior sem que o software faça a atualização;
- O software tenta atualizar o watchdog antes do período permitido pela janela.
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?
- Falha no controle de tempo de uma tarefa crítica;
- Execução do firmware fora do período esperado;
- Erros de programação que causam atualização antecipada ou atrasada do watchdog;
- Travamentos que impedem o software de atualizar o WWDG corretamente;
- Problemas em rotinas que possuem requisitos temporais rígidos.
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.
- O firmware não atualiza o WWDG dentro da janela correta;
- O Window Watchdog detecta a condição inválida;
- O STM32 executa um reset automático;
- A flag WWDGRSTF é registrada no RCC->CSR.
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
- Definir corretamente a janela de atualização conforme o tempo real da aplicação;
- Atualizar o watchdog em uma rotina com execução previsível;
- Evitar múltiplos pontos do código realizando atualização do watchdog;
- Registrar a causa do reset para análise posterior;
- Utilizar o WWDG somente quando o comportamento temporal do sistema for bem conhecido.
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:
- Sleep Mode: a CPU é parada, mas os periféricos continuam funcionando;
- Stop Mode: reduz significativamente o consumo desligando diversos clocks internos;
- Standby Mode: modo de menor consumo, onde grande parte do sistema é desligada.
Quando ocorre o Low Power Reset?
- Saída de determinados modos de baixo consumo;
- Sequências incorretas de entrada ou retorno dos modos Sleep, Stop ou Standby;
- Eventos de wake-up que provocam uma reinicialização do sistema;
- Configuração inadequada dos recursos de gerenciamento de energia.
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
- Configurar corretamente as fontes de wake-up antes de entrar em baixo consumo;
- Garantir que os periféricos necessários sejam preparados antes da suspensão;
- Registrar a causa do reset para facilitar diagnóstico;
- Testar todas as condições de retorno dos modos de economia de energia.
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:
- PORRSTF: indica que ocorreu uma inicialização da alimentação;
- PINRSTF: indica que posteriormente houve um reset pelo pino externo.
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.
- Falha elétrica;
- Problema de firmware;
- Intervenção externa;
- Evento relacionado ao gerenciamento de energia.
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:
- Ler as flags de reset;
- Registrar ou armazenar a causa do reset;
- Limpar as flags;
- 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: