cancel
Showing results for 
Search instead for 
Did you mean: 

STM32H573 external flash loader fails to erase sector during provisioning

benjacam
Associate II

Dear ST community,

I have a custom board with small external NOR flash MX25U1632F connected to STM32H573. I have written a custom external flash loader for this device. The loader works, for example, from stm32cubeprogrammer gui, and can read the external flash memory, and erase sectors.

My problem is during secure manager provisioning. I have built a sfi package using the provisioning.py --sfi-gen script provided in the x-cube-sec-m-h5-v2-1-0.zip.

During provisioning, initially, the device is in OB_PROD_STATE_OPEN state. Here, the sector erases complete successfully. With -vb=3 logging enable in STM32_Programmer_CLI:

2025-11-26 16:42:28,808 - DEBUG - Init flashloader...
2025-11-26 16:42:28,809 - DEBUG - halt ap 1
2025-11-26 16:42:28,811 - DEBUG - w ap 1 reg 0 R0 0x00000001
2025-11-26 16:42:28,812 - DEBUG - w ap 1 reg 1 R1 0x00000000
2025-11-26 16:42:28,813 - DEBUG - w ap 1 reg 2 R2 0x00000000
2025-11-26 16:42:28,814 - DEBUG - w ap 1 reg 3 R3 0x00000000
2025-11-26 16:42:28,815 - DEBUG - w ap 1 reg 4 R4 0x00000000
2025-11-26 16:42:28,816 - DEBUG - w ap 1 reg 5 R5 0x00000000
2025-11-26 16:42:28,816 - DEBUG - w ap 1 reg 6 R6 0x00000000
2025-11-26 16:42:28,817 - DEBUG - w ap 1 reg 7 R7 0x00000000
2025-11-26 16:42:28,818 - DEBUG - w ap 1 reg 8 R8 0x00000000
2025-11-26 16:42:28,820 - DEBUG - w ap 1 reg 9 R9 0x00000000
2025-11-26 16:42:28,821 - DEBUG - w ap 1 reg 10 R10 0x00000000
2025-11-26 16:42:28,822 - DEBUG - w ap 1 reg 11 R11 0x00000000
2025-11-26 16:42:28,822 - DEBUG - w ap 1 reg 12 R12 0x00000000
2025-11-26 16:42:28,823 - DEBUG - w ap 1 reg 13 SP 0x00000000
2025-11-26 16:42:28,824 - DEBUG - w ap 1 reg 14 LR 0x20000001
2025-11-26 16:42:28,826 - DEBUG - w ap 1 reg 15 PC 0x20000F8D
2025-11-26 16:42:28,827 - DEBUG - w ap 1 reg 16 xPSR 0x01000000
2025-11-26 16:42:28,828 - DEBUG - w ap 1 reg 17 MSP 0x20006948
2025-11-26 16:42:28,829 - DEBUG - w ap 1 reg 18 PSP 0x00000000
2025-11-26 16:42:28,829 - DEBUG - run ap 1
2025-11-26 16:42:28,848 - DEBUG - halt ap 1
2025-11-26 16:42:28,849 - DEBUG - r ap 1 reg 0 R0 0x00000001
2025-11-26 16:42:28,849 - DEBUG - Loader sector erase...
2025-11-26 16:42:28,852 - DEBUG - w ap 1 reg 0 R0 0x90009000
2025-11-26 16:42:28,853 - DEBUG - w ap 1 reg 1 R1 0x90009000
2025-11-26 16:42:28,854 - DEBUG - w ap 1 reg 2 R2 0x00000000
2025-11-26 16:42:28,855 - DEBUG - w ap 1 reg 3 R3 0x00000000
2025-11-26 16:42:28,856 - DEBUG - w ap 1 reg 4 R4 0x00000000
2025-11-26 16:42:28,857 - DEBUG - w ap 1 reg 5 R5 0x00000000
2025-11-26 16:42:28,858 - DEBUG - w ap 1 reg 6 R6 0x00000000
2025-11-26 16:42:28,859 - DEBUG - w ap 1 reg 7 R7 0x00000000
2025-11-26 16:42:28,860 - DEBUG - w ap 1 reg 8 R8 0x00000000
2025-11-26 16:42:28,861 - DEBUG - w ap 1 reg 9 R9 0x00000000
2025-11-26 16:42:28,862 - DEBUG - w ap 1 reg 10 R10 0x00000000
2025-11-26 16:42:28,863 - DEBUG - w ap 1 reg 11 R11 0x00000000
2025-11-26 16:42:28,864 - DEBUG - w ap 1 reg 12 R12 0x00000000
2025-11-26 16:42:28,865 - DEBUG - w ap 1 reg 13 SP 0x00000000
2025-11-26 16:42:28,866 - DEBUG - w ap 1 reg 14 LR 0x20000001
2025-11-26 16:42:28,867 - DEBUG - w ap 1 reg 15 PC 0x20000CA5
2025-11-26 16:42:28,868 - DEBUG - w ap 1 reg 16 xPSR 0x01000000
2025-11-26 16:42:28,873 - DEBUG - w ap 1 reg 17 MSP 0x20006948
2025-11-26 16:42:28,876 - DEBUG - w ap 1 reg 18 PSP 0x00000000
2025-11-26 16:42:28,877 - DEBUG - run ap 1
2025-11-26 16:42:28,917 - DEBUG - halt ap 1
2025-11-26 16:42:28,917 - DEBUG - r ap 1 reg 0 R0 0x00000001
2025-11-26 16:42:28,917 - DEBUG - Existing specified sectors are erased successfully Protected sectors are not erased

My loader has basic UART logs, and I can see it succeeds (I=init, P=pass, SE=sector erase):

I optsr=821095928
I P
SE 0x9000a000 0x9000a000
SE Erasing: 0xa000
SE Erasing: done
SE P

Later in the provisioning, the device has switched into provisioning state. Now, the sector erase is failing.

2025-11-26 16:42:54,409 - DEBUG - Erasing external memory sectors [160 511]
2025-11-26 16:42:54,409 - DEBUG - Init flashloader...
2025-11-26 16:42:54,411 - DEBUG - halt ap 1
2025-11-26 16:42:54,412 - DEBUG - w ap 1 reg 0 R0 0x00000001
2025-11-26 16:42:54,413 - DEBUG - w ap 1 reg 1 R1 0x00000000
2025-11-26 16:42:54,414 - DEBUG - w ap 1 reg 2 R2 0x00000000
2025-11-26 16:42:54,415 - DEBUG - w ap 1 reg 3 R3 0x00000000
2025-11-26 16:42:54,416 - DEBUG - w ap 1 reg 4 R4 0x00000000
2025-11-26 16:42:54,417 - DEBUG - w ap 1 reg 5 R5 0x00000000
2025-11-26 16:42:54,418 - DEBUG - w ap 1 reg 6 R6 0x00000000
2025-11-26 16:42:54,419 - DEBUG - w ap 1 reg 7 R7 0x00000000
2025-11-26 16:42:54,420 - DEBUG - w ap 1 reg 8 R8 0x00000000
2025-11-26 16:42:54,421 - DEBUG - w ap 1 reg 9 R9 0x00000000
2025-11-26 16:42:54,422 - DEBUG - w ap 1 reg 10 R10 0x00000000
2025-11-26 16:42:54,423 - DEBUG - w ap 1 reg 11 R11 0x00000000
2025-11-26 16:42:54,424 - DEBUG - w ap 1 reg 12 R12 0x00000000
2025-11-26 16:42:54,425 - DEBUG - w ap 1 reg 13 SP 0x00000000
2025-11-26 16:42:54,426 - DEBUG - w ap 1 reg 14 LR 0x20000001
2025-11-26 16:42:54,427 - DEBUG - w ap 1 reg 15 PC 0x20000F8D
2025-11-26 16:42:54,428 - DEBUG - w ap 1 reg 16 xPSR 0x01000000
2025-11-26 16:42:54,429 - DEBUG - w ap 1 reg 17 MSP 0x20006948
2025-11-26 16:42:54,430 - DEBUG - w ap 1 reg 18 PSP 0x00000000
2025-11-26 16:42:54,430 - DEBUG - run ap 1
2025-11-26 16:42:54,450 - DEBUG - halt ap 1
2025-11-26 16:42:54,450 - DEBUG - r ap 1 reg 0 R0 0x00000001
2025-11-26 16:42:54,451 - DEBUG - Loader sector erase...
2025-11-26 16:42:54,452 - DEBUG - w ap 1 reg 0 R0 0x900A0000
2025-11-26 16:42:54,453 - DEBUG - w ap 1 reg 1 R1 0x901FF000
2025-11-26 16:42:54,454 - DEBUG - w ap 1 reg 2 R2 0x00000000
2025-11-26 16:42:54,455 - DEBUG - w ap 1 reg 3 R3 0x00000000
2025-11-26 16:42:54,456 - DEBUG - w ap 1 reg 4 R4 0x00000000
2025-11-26 16:42:54,457 - DEBUG - w ap 1 reg 5 R5 0x00000000
2025-11-26 16:42:54,460 - DEBUG - w ap 1 reg 6 R6 0x00000000
2025-11-26 16:42:54,462 - DEBUG - w ap 1 reg 7 R7 0x00000000
2025-11-26 16:42:54,463 - DEBUG - w ap 1 reg 8 R8 0x00000000
2025-11-26 16:42:54,464 - DEBUG - w ap 1 reg 9 R9 0x00000000
2025-11-26 16:42:54,464 - DEBUG - w ap 1 reg 10 R10 0x00000000
2025-11-26 16:42:54,465 - DEBUG - w ap 1 reg 11 R11 0x00000000
2025-11-26 16:42:54,466 - DEBUG - w ap 1 reg 12 R12 0x00000000
2025-11-26 16:42:54,467 - DEBUG - w ap 1 reg 13 SP 0x00000000
2025-11-26 16:42:54,468 - DEBUG - w ap 1 reg 14 LR 0x20000001
2025-11-26 16:42:54,469 - DEBUG - w ap 1 reg 15 PC 0x20000CA5
2025-11-26 16:42:54,470 - DEBUG - w ap 1 reg 16 xPSR 0x01000000
2025-11-26 16:42:54,471 - DEBUG - w ap 1 reg 17 MSP 0x20006948
2025-11-26 16:42:54,472 - DEBUG - w ap 1 reg 18 PSP 0x00000000
2025-11-26 16:42:54,472 - DEBUG - run ap 1
2025-11-26 16:42:54,481 - DEBUG - Error: failed to erase memory
2025-11-26 16:42:54,481 - DEBUG - Error: SFIx : Not able to erase external flash

In my logs:

I optsr=821041144
I P
SE 0x900a0000 0x901ff000
SE Erasing: 0xa0000

 In both cases, the same stldr file is used, and similarly to the example https://github.com/STMicroelectronics/stm32-external-loader/blob/main/STM32H5x_boards/MX25LM51245G_STM32H573I-DK/Flash_loader/Src/Loader_Src.c, my loader uses if ((FLASH->OPTSR_CUR & FLASH_OPTSR_PRODUCT_STATE) == OB_PROD_STATE_OPEN) to determine whether to call SystemInit() and Hal_Init().

My debug shows that my loader gets as far as issuing the spi write enable command to the flash (a pre-requisite for issuing sector erase command), but does not run further. 

I'm a bit stuck to be honest! Its not really clear to me why my loader would stop suddenly - has it triggered an exception, has it timed out and been aborted by the cubeprogrammer? So this message is to seek some help/advice on how to debug and proceed.

Many thanks, Ben.

0 REPLIES 0