stm32_reset_cause: handle POR/PDR reset cause

This commit is contained in:
Andrey Gusakov 2025-01-22 10:19:56 +03:00 committed by rusefillc
parent d2c19fab24
commit 647db3be46
3 changed files with 23 additions and 14 deletions

View File

@ -252,7 +252,9 @@ void errorHandlerWriteReportFile(FIL *fd, int index) {
}
auto cause = getMCUResetCause();
if ((cause != Reset_Cause_NRST_Pin) && (cause != Reset_Cause_BOR) && (cause != Reset_Cause_Unknown)) {
// TODO: should we also report Unknown?
if ((cause != Reset_Cause_NRST_Pin) && (cause != Reset_Cause_BOR) &&
(cause != Reset_Cause_POR) && (cause != Reset_Cause_Unknown)) {
// not an expected cause
needReport = true;
}

View File

@ -106,6 +106,7 @@ typedef enum {
Reset_Cause_WWatchdog, // Window watchdog
Reset_Cause_Soft_Reset, // NVIC_SystemReset or by debugger
Reset_Cause_NRST_Pin, // Reset from NRST pin
Reset_Cause_POR, // POR/PDR reset
Reset_Cause_Illegal_Mode, // Reset after illegal Stop, Standby or Shutdown mode entry
Reset_Cause_BOR, // BOR reset
Reset_Cause_Firewall, // Firewall reset

View File

@ -15,20 +15,22 @@
#ifdef STM32H7XX
// Reset Status Register flags for H7
#define BORRSTF RCC_RSR_BORRSTF
#define PINRSTF RCC_RSR_PINRSTF
#define PORRSTF RCC_RSR_PORRSTF
#define SFTRSTF RCC_RSR_SFTRSTF
#define IWDGRSTF RCC_RSR_IWDG1RSTF
#define WWDGRSTF RCC_RSR_WWDG1RSTF
#define SFTRSTF RCC_RSR_SFTRSTF
#define PINRSTF RCC_RSR_PINRSTF
#define LPWRRSTF RCC_RSR_LPWRRSTF
#define BORRSTF RCC_RSR_BORRSTF
#else
// Control/Status Register flags for F4/F7
#define BORRSTF RCC_CSR_BORRSTF
#define PINRSTF RCC_CSR_PINRSTF
#define PORRSTF RCC_CSR_PORRSTF
#define SFTRSTF RCC_CSR_SFTRSTF
#define IWDGRSTF RCC_CSR_IWDGRSTF
#define WWDGRSTF RCC_CSR_WWDGRSTF
#define SFTRSTF RCC_CSR_SFTRSTF
#define PINRSTF RCC_CSR_PINRSTF
#define LPWRRSTF RCC_CSR_LPWRRSTF
#define BORRSTF RCC_CSR_BORRSTF
#endif // STM32H7XX
static Reset_Cause_t readMCUResetCause() {
@ -42,18 +44,20 @@ static Reset_Cause_t readMCUResetCause() {
RCC->CSR |= RCC_CSR_RMVF;
#endif
if (cause & IWDGRSTF) {
if (cause & BORRSTF) {
return Reset_Cause_BOR;
} else if (cause & PINRSTF) {
return Reset_Cause_NRST_Pin;
} else if (cause & PORRSTF) {
return Reset_Cause_POR;
} else if (cause & SFTRSTF) {
return Reset_Cause_Soft_Reset;
} else if (cause & IWDGRSTF) {
return Reset_Cause_IWatchdog;
} else if (cause & WWDGRSTF) {
return Reset_Cause_WWatchdog;
} else if (cause & SFTRSTF) {
return Reset_Cause_Soft_Reset;
} else if (cause & PINRSTF) {
return Reset_Cause_NRST_Pin;
} else if (cause & LPWRRSTF) {
return Reset_Cause_Illegal_Mode;
} else if (cause & BORRSTF) {
return Reset_Cause_BOR;
}
return Reset_Cause_Unknown;
}
@ -75,6 +79,8 @@ const char *getMCUResetCause(Reset_Cause_t cause) {
return "NVIC_SystemReset or by debugger";
case Reset_Cause_NRST_Pin:
return "Reset from NRST pin";
case Reset_Cause_POR:
return "Power on/power-down reset";
case Reset_Cause_Illegal_Mode:
return "Reset after illegal Stop, Standby or Shutdown mode entry";
case Reset_Cause_BOR: