2025-10-07 3:28 PM
Last week we ran into issues flashing our custom boards (STM32H7S3L8H6) with the STM32Progammer_CLI. Originally we were using the version packaged with CubeCLT 1.18.0 (STM32CubeProgrammer v2.19.0).
I noticed that ~7% of flashes failed flash verification after a "successful" flash. The errors were always grouped within a small region of addresses, and this region stayed the same until a new .elf file was compiled. Using CubeProgrammer GUI i was able to validate that those memory regions were in-fact invalid.
For example, here is one of the test runs on our custom board:
=== Final Statistics ===
Total Flashes: 624
Successful: 580
Failed: 44
Success Rate: 92.95%
Failed Addresses (failure count):
0x080065C8: 12
0x080065C9: 7
0x080065CE: 6
0x080065CF: 5
0x080065CD: 5
0x080065CA: 4
0x080065CC: 3
0x080065CB: 2
As you can see by the addresses, this was flashing the bootloader (in internal flash).
The command used to flash for all versions was
STM32_Programmer_CLI -vb 3 --connect port=swd --download "$bootloader_file" --verify
See full debug flash log below:
-------------------------------------------------------------------
STM32CubeProgrammer v2.19.0
-------------------------------------------------------------------
ST-LINK SN : 003F004B3133511037363734
ST-LINK FW : V3J15M7
Board : STLINK-V3MINIE
Voltage : 1.81V
Connection to AP 0 requested and failed, Connection established with AP 1
SWD freq : 8000 KHz
Connect mode: Normal
Reset mode : Software reset
Device ID : 0x485
Revision ID : Rev B
Reading data...
r ap 1 @0x5200281C 0x00000004 bytes Data 0x00300002
Database: Config 0 is active.
flash loader /opt/st/stm32cubeclt_1.18.0/STM32CubeProgrammer/bin/FlashLoader/0x485.stldr is loaded
Reading data...
r ap 1 @0x5200281C 0x00000004 bytes Data 0x00300002
Database: Config 0 is active.
Device name : STM32H7RSxx
Reading data...
r ap 1 @0x08FFF80C 0x00000004 bytes Data 0x000CFFFF
w ap 1 @0x52002028 0x00000004 bytes Data 0x02000000
w ap 1 @0x52002028 0x00000004 bytes Data 0x04000000
Flash size : 64 KBytes (default)
Device type : MCU
Device CPU : Cortex-M7
BL Version : 0xE4
Opening and parsing file: bootloader.elf
Memory Programming ...
File : bootloader.elf
Size : 57.96 KB
Address : 0x08000000
Erasing Segment <0> Address <0x08000000> Size <59360>Bytes
Erasing memory corresponding to sector 0:
r ap 1 @0x40022040 0x00000004 bytes Data 0x00000000
Memory Erase via FlashLoader!
Memory erase...
halt ap 1
w ap 1 reg 15 PC (0x20000000)
w ap 1 reg 17 MSP (0x20000500)
w ap 1 reg 16 xPSR (0x01000000)
w ap 1 @0x20000B40 : 0x00000200 bytes, Data 0x00000000...
w ap 1 @0x20000000 : 0x00000004 bytes, Data 0x0000BE00...
w ap 1 @0x20000004 : 0x00000718 bytes, Data 0x8F4FF3BF...
Init flashloader...
halt ap 1
w ap 1 reg 0 R0 0x00000001
w ap 1 reg 1 R1 0x00000000
w ap 1 reg 2 R2 0x00000000
w ap 1 reg 3 R3 0x00000000
w ap 1 reg 4 R4 0x00000000
w ap 1 reg 5 R5 0x00000000
w ap 1 reg 6 R6 0x00000000
w ap 1 reg 7 R7 0x00000000
w ap 1 reg 8 R8 0x00000000
w ap 1 reg 9 R9 0x00000000
w ap 1 reg 10 R10 0x00000000
w ap 1 reg 11 R11 0x00000000
w ap 1 reg 12 R12 0x00000000
w ap 1 reg 13 SP 0x00000000
w ap 1 reg 14 LR 0x20000001
w ap 1 reg 15 PC 0x2000000B
w ap 1 reg 16 xPSR 0x01000000
w ap 1 reg 17 MSP 0x20000B18
w ap 1 reg 18 PSP 0x00000000
run ap 1
halt ap 1
r ap 1 reg 0 R0 0x00000001
Loader mass erase...
w ap 1 reg 0 R0 0x00000000
w ap 1 reg 1 R1 0x00000000
w ap 1 reg 2 R2 0x00000000
w ap 1 reg 3 R3 0x00000000
w ap 1 reg 4 R4 0x00000000
w ap 1 reg 5 R5 0x00000000
w ap 1 reg 6 R6 0x00000000
w ap 1 reg 7 R7 0x00000000
w ap 1 reg 8 R8 0x00000000
w ap 1 reg 9 R9 0x00000000
w ap 1 reg 10 R10 0x00000000
w ap 1 reg 11 R11 0x00000000
w ap 1 reg 12 R12 0x00000000
w ap 1 reg 13 SP 0x00000000
w ap 1 reg 14 LR 0x20000001
w ap 1 reg 15 PC 0x200002BD
w ap 1 reg 16 xPSR 0x01000000
w ap 1 reg 17 MSP 0x20000B18
w ap 1 reg 18 PSP 0x00000000
run ap 1
halt ap 1
r ap 1 reg 0 R0 0x00000001
erase: 0115ms
Download in Progress:
Size : 59360 Bytes
Address : 0x08000000
Buffer program...
halt ap 1
w ap 1 reg 15 PC (0x20000000)
w ap 1 reg 17 MSP (0x20000500)
w ap 1 reg 16 xPSR (0x01000000)
w ap 1 @0x20000B40 : 0x00000200 bytes, Data 0x00000000...
w ap 1 @0x20000000 : 0x00000004 bytes, Data 0x0000BE00...
w ap 1 @0x20000004 : 0x00000718 bytes, Data 0x8F4FF3BF...
Loader write range...
w ap 1 @0x20000B40 : 0x000073F0 bytes, Data 0x20010000...
W B1 in RAM @0x20000B40 size 0x000073F0 : 0142ms
Init flashloader...
halt ap 1
w ap 1 reg 0 R0 0x00000001
w ap 1 reg 1 R1 0x00000000
w ap 1 reg 2 R2 0x00000000
w ap 1 reg 3 R3 0x00000000
w ap 1 reg 4 R4 0x00000000
w ap 1 reg 5 R5 0x00000000
w ap 1 reg 6 R6 0x00000000
w ap 1 reg 7 R7 0x00000000
w ap 1 reg 8 R8 0x00000000
w ap 1 reg 9 R9 0x00000000
w ap 1 reg 10 R10 0x00000000
w ap 1 reg 11 R11 0x00000000
w ap 1 reg 12 R12 0x00000000
w ap 1 reg 13 SP 0x00000000
w ap 1 reg 14 LR 0x20000001
w ap 1 reg 15 PC 0x2000000B
w ap 1 reg 16 xPSR 0x01000000
w ap 1 reg 17 MSP 0x20000B18
w ap 1 reg 18 PSP 0x00000000
run ap 1
halt ap 1
r ap 1 reg 0 R0 0x00000001
w ap 1 reg 0 R0 0x08000000
w ap 1 reg 1 R1 0x000073F0
w ap 1 reg 2 R2 0x20000B40
w ap 1 reg 3 R3 0x00000000
w ap 1 reg 4 R4 0x00000000
w ap 1 reg 5 R5 0x00000000
w ap 1 reg 6 R6 0x00000000
w ap 1 reg 7 R7 0x00000000
w ap 1 reg 8 R8 0x00000000
w ap 1 reg 9 R9 0x00000000
w ap 1 reg 10 R10 0x00000000
w ap 1 reg 11 R11 0x00000000
w ap 1 reg 12 R12 0x00000000
w ap 1 reg 13 SP 0x00000000
w ap 1 reg 14 LR 0x20000001
w ap 1 reg 15 PC 0x2000004F
w ap 1 reg 16 xPSR 0x01000000
w ap 1 reg 17 MSP 0x20000B18
w ap 1 reg 18 PSP 0x00000000
run ap 1
w ap 1 @0x20007F30 : 0x000073F0 bytes, Data 0xF06FA0C8...
W B2 in RAM @0x20008440 size 0x000073F0: 0198ms
r ap 1 reg 0 R0 0x00000001
Wait W B1 in Flash @0x08000000 size 0x000073F0: 0002ms
w ap 1 reg 0 R0 0x080073F0
w ap 1 reg 1 R1 0x000073F0
w ap 1 reg 2 R2 0x20007F30
w ap 1 reg 3 R3 0x00000000
w ap 1 reg 4 R4 0x00000000
w ap 1 reg 5 R5 0x00000000
w ap 1 reg 6 R6 0x00000000
w ap 1 reg 7 R7 0x00000000
w ap 1 reg 8 R8 0x00000000
w ap 1 reg 9 R9 0x00000000
w ap 1 reg 10 R10 0x00000000
w ap 1 reg 11 R11 0x00000000
w ap 1 reg 12 R12 0x00000000
w ap 1 reg 13 SP 0x00000000
w ap 1 reg 14 LR 0x20000001
w ap 1 reg 15 PC 0x2000004F
w ap 1 reg 16 xPSR 0x01000000
w ap 1 reg 17 MSP 0x20000B18
w ap 1 reg 18 PSP 0x00000000
run ap 1
r ap 1 reg 0 R0 0x00000001
Write elapsed time: 0401ms
Sector[0] downloaded successfully
File download complete
Time elapsed during download operation: 00:00:00.538
Verifying ...
Reading data...
r ap 1 @0x08000000 0x0000E7E0 bytes Data 0x20010000
Error: Data mismatch found at address 0x080073ED (byte = 0xFF instead of 0x18)
Error: Download verification failed
To eliminate the thought that this was an issue with our custom board, we attempted the same flash on both the STM32H7S78-DK and the NUCLEO-H7S3L8. Both of these dev kits displayed the same issue.
We tried updating to the new Cube CLT (v1.19.0) which gives us STM32CubeProgrammer version: 2.20.0
With this version, we saw an entirely different behavior. Flashes failed ~3% of the time, but they did not fail during validation, they actually failed to flash entirely. See debug output below:
-------------------------------------------------------------------
STM32CubeProgrammer v2.20.0
-------------------------------------------------------------------
ST-LINK SN : 003F004B3133511037363734
ST-LINK FW : V3J15M7
Board : STLINK-V3MINIE
Voltage : 1.80V
Connection to AP 0 requested and failed, Connection established with AP 1
SWD freq : 8000 KHz
Connect mode: Normal
Reset mode : Software reset
Device ID : 0x485
Revision ID : Rev B
Reading data...
r ap 1 @0x5200281C 0x00000004 bytes Data 0x00300002
Database: Config 0 is active.
flash loader /home/ubuntu/st/stm32cubeclt_1.19.0/STM32CubeProgrammer/bin/FlashLoader/0x485.stldr is loaded
Reading data...
r ap 1 @0x5200281C 0x00000004 bytes Data 0x00300002
Database: Config 0 is active.
Device name : STM32H7RSxx
Reading data...
r ap 1 @0x08FFF80C 0x00000004 bytes Data 0x000CFFFF
w ap 1 @0x52002028 0x00000004 bytes Data 0x02000000
w ap 1 @0x52002028 0x00000004 bytes Data 0x04000000
Flash size : 64 KBytes (default)
Device type : MCU
Device CPU : Cortex-M7
BL Version : 0xE4
Opening and parsing file: bootloader.elf
Memory Programming ...
File : bootloader.elf
Size : 57.96 KB
Address : 0x08000000
Erasing Segment <0> Address <0x08000000> Size <59360>Bytes
Erasing memory corresponding to segment 0:
r ap 1 @0x40022040 0x00000004 bytes Data 0x00000000
Memory Erase via FlashLoader!
Memory erase...
halt ap 1
w ap 1 reg 15 PC (0x20000000)
w ap 1 reg 17 MSP (0x20000500)
w ap 1 reg 16 xPSR (0x01000000)
w ap 1 @0x20000BA0 : 0x00000200 bytes, Data 0x00000000...
w ap 1 @0x20000000 : 0x00000004 bytes, Data 0x0000BE00...
w ap 1 @0x20000004 : 0x00000774 bytes, Data 0x8F4FF3BF...
Init flashloader...
halt ap 1
w ap 1 reg 0 R0 0x00000001
w ap 1 reg 1 R1 0x00000000
w ap 1 reg 2 R2 0x00000000
w ap 1 reg 3 R3 0x00000000
w ap 1 reg 4 R4 0x00000000
w ap 1 reg 5 R5 0x00000000
w ap 1 reg 6 R6 0x00000000
w ap 1 reg 7 R7 0x00000000
w ap 1 reg 8 R8 0x00000000
w ap 1 reg 9 R9 0x00000000
w ap 1 reg 10 R10 0x00000000
w ap 1 reg 11 R11 0x00000000
w ap 1 reg 12 R12 0x00000000
w ap 1 reg 13 SP 0x00000000
w ap 1 reg 14 LR 0x20000001
w ap 1 reg 15 PC 0x2000000B
w ap 1 reg 16 xPSR 0x01000000
w ap 1 reg 17 MSP 0x20000B74
w ap 1 reg 18 PSP 0x00000000
run ap 1
halt ap 1
r ap 1 reg 0 R0 0x00000001
Loader mass erase...
w ap 1 reg 0 R0 0x00000000
w ap 1 reg 1 R1 0x00000000
w ap 1 reg 2 R2 0x00000000
w ap 1 reg 3 R3 0x00000000
w ap 1 reg 4 R4 0x00000000
w ap 1 reg 5 R5 0x00000000
w ap 1 reg 6 R6 0x00000000
w ap 1 reg 7 R7 0x00000000
w ap 1 reg 8 R8 0x00000000
w ap 1 reg 9 R9 0x00000000
w ap 1 reg 10 R10 0x00000000
w ap 1 reg 11 R11 0x00000000
w ap 1 reg 12 R12 0x00000000
w ap 1 reg 13 SP 0x00000000
w ap 1 reg 14 LR 0x20000001
w ap 1 reg 15 PC 0x200002D5
w ap 1 reg 16 xPSR 0x01000000
w ap 1 reg 17 MSP 0x20000B74
w ap 1 reg 18 PSP 0x00000000
run ap 1
halt ap 1
r ap 1 reg 0 R0 0x00000001
erase: 0058ms
Download in Progress:
Size : 59360 Bytes
Address : 0x08000000
Buffer program...
halt ap 1
w ap 1 reg 15 PC (0x20000000)
w ap 1 reg 17 MSP (0x20000500)
w ap 1 reg 16 xPSR (0x01000000)
w ap 1 @0x20000BA0 : 0x00000200 bytes, Data 0x00000000...
w ap 1 @0x20000000 : 0x00000004 bytes, Data 0x0000BE00...
w ap 1 @0x20000004 : 0x00000774 bytes, Data 0x8F4FF3BF...
Loader write range...
w ap 1 @0x20000BA0 : 0x000073F0 bytes, Data 0x20010000...
W B1 in RAM @0x20000BA0 size 0x000073F0 : 0083ms
Init flashloader...
halt ap 1
w ap 1 reg 0 R0 0x00000001
w ap 1 reg 1 R1 0x00000000
w ap 1 reg 2 R2 0x00000000
w ap 1 reg 3 R3 0x00000000
w ap 1 reg 4 R4 0x00000000
w ap 1 reg 5 R5 0x00000000
w ap 1 reg 6 R6 0x00000000
w ap 1 reg 7 R7 0x00000000
w ap 1 reg 8 R8 0x00000000
w ap 1 reg 9 R9 0x00000000
w ap 1 reg 10 R10 0x00000000
w ap 1 reg 11 R11 0x00000000
w ap 1 reg 12 R12 0x00000000
w ap 1 reg 13 SP 0x00000000
w ap 1 reg 14 LR 0x20000001
w ap 1 reg 15 PC 0x2000000B
w ap 1 reg 16 xPSR 0x01000000
w ap 1 reg 17 MSP 0x20000B74
w ap 1 reg 18 PSP 0x00000000
run ap 1
halt ap 1
r ap 1 reg 0 R0 0x00000001
w ap 1 reg 0 R0 0x08000000
w ap 1 reg 1 R1 0x000073F0
w ap 1 reg 2 R2 0x20000BA0
w ap 1 reg 3 R3 0x00000000
w ap 1 reg 4 R4 0x00000000
w ap 1 reg 5 R5 0x00000000
w ap 1 reg 6 R6 0x00000000
w ap 1 reg 7 R7 0x00000000
w ap 1 reg 8 R8 0x00000000
w ap 1 reg 9 R9 0x00000000
w ap 1 reg 10 R10 0x00000000
w ap 1 reg 11 R11 0x00000000
w ap 1 reg 12 R12 0x00000000
w ap 1 reg 13 SP 0x00000000
w ap 1 reg 14 LR 0x20000001
w ap 1 reg 15 PC 0x2000004F
w ap 1 reg 16 xPSR 0x01000000
w ap 1 reg 17 MSP 0x20000B74
w ap 1 reg 18 PSP 0x00000000
run ap 1
w ap 1 @0x20007F90 : 0x000073F0 bytes, Data 0xF06FA0C8...
W B2 in RAM @0x200084A0 size 0x000073F0: 0110ms
r ap 1 reg 0 R0 0x00000000
halt ap 1
w ap 1 reg 15 PC (0x20000000)
w ap 1 reg 17 MSP (0x20000500)
w ap 1 reg 16 xPSR (0x01000000)
Loader write range...
w ap 1 @0x20000BA0 : 0x000073F0 bytes, Data 0x20010000...
W B1 in RAM @0x20000BA0 size 0x000073F0 : 0093ms
halt ap 1
r ap 1 reg 0 R0 0x00000000
Error: failed to download Sector[0]
Error: failed to download the File
At this point we reverted back to a very old version (stm32cubeclt_1.11.1) STM32CubeProgrammer version: 2.12.0.
With this version, boards flashed with a 100% success rate.
I'm not entirely sure if this is a regression, or a known issue, but figured I would post it here to get some clarity!
Thanks,
Austin