cancel
Showing results for 
Search instead for 
Did you mean: 

Catching and clearing BusFaults in STM32 H743

APipe.2
Associate

We are having issues with corrupted flash on the STM32 H7 series. The problem manifests where a read to the offending address in flash will cause a bus fault. We think it is down to bad CRC and the way to resolve is usually to wipe the flash and reprogram. What I would like to do is do this on the fly, so detect the offending address and erase the page. I was hoping to do this roughly though the following:

// enable the busfault handler
SCB->SHCSR|= SCB_SHCSR_BUSFAULTENA_Msk;
 
// disable all faults
 __disable_fault_irq();
 __DSB();
 
// read the offending data here
read()
 
// check the outcome
if (SCB->SHCSR & SCB_SHCSR_BUSFAULTPENDED_Msk) {
 // erase the sector here
}
 
// reset
 __enable_fault_irq();
 __DSB();
SCB->SHCSR &= ~SCB_SHCSR_BUSFAULTENA_Msk;

However this does not work - the fault is prevented correctly but the pending bit is never set and I don't seem to have anyway to detect that a bus fault would have occurred

What am I missing? Or am I totally barking up the wrong tree?

This discussion is locked. Please start a new topic to ask your question.
1 REPLY 1
Bubbles
ST Employee

Hello @APipe.2​,

not CRC but ECC.

The bus fault is a result of 2-bit error in the program memory, the ECC can handle 1-bit errors. Most of the time one error exists in the flash word before a second bit goes bad. So here I'd recommend to enable the 1-bit error interrupt (ECCC) and try fixing the problem before it escalates to ECCD - two bit error detection.

BR,

J

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.

Announcement

We’re moving the ST Community to a new platform to give you a better and more reliable community experience.