2022-01-31 05:27 PM
We have two revisions of our board.
RevA has STM32H743 RevY chip running bootloader V13.2 (confirmed using STLINK).
RevB has STM32H743 RevV chip running bootloader V9.0 (confirmed using STLINK).
On our RevA board we can connect successfully from another MCU to ROM Bootloader on USART2 and upload and flash firmware. This contradicts the AN2606 page264 which says USART2 does not work.
We are trying to get our RevB board working with STM32H743 RevV chip running bootloader V9.0 and it does not work. There are only very minor changes between the boards.
I have checked the following:
Does anyone have any suggestions on other things to try to get this working? Like I said it works on Rev Y chip so why not on Rev V?
Has anyone got the ROM bootloader on Rev V STM32H743 working with any of the ports?
Cheers,
Felix
2022-01-31 07:36 PM
I just ran it under the STLINK. I put the unit into bootloader then halt in STCUBE programmer. Reading the PC it is a value around 0x1FF0AAF4. Can an ST employee please confirm that this address is in the initial loop? Or... has it accidentally synced to a port other than USART2?
2022-02-01 02:16 PM
I found the video at https://www.youtube.com/watch?v=kTMjjED8ErA which has some very useful reverse engineering tips for the bootloader. This information should be in a trouble shooting section of AN2606.
Following the instructions in the video I dumped the USART1,2,3 registers (in that order) from my device.
This is the register state in the normal operation of my application firmware (we use USART2 during normal operation):
C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin>STM32_Programmer_CLI.exe -c port=SWD mode=HOTPLUG -r32 0x40011000 0x2c -r32 0x40004400 0x2c -r32 0x40004800 0x2c
-------------------------------------------------------------------
STM32CubeProgrammer v2.8.0
-------------------------------------------------------------------
ST-LINK SN : 005000373438510634313939
ST-LINK FW : V3J9M3
Board : STLINK-V3MINI
Voltage : 3.34V
SWD freq : 24000 KHz
Connect mode: Hot Plug
Reset mode : Software reset
Device ID : 0x450
Revision ID : Rev V
Device name : STM32H7xx
Flash size : 2 MBytes
Device type : MCU
Device CPU : Cortex-M7
BL Version : 0x90
Reading 32-bit memory content
Size : 44 Bytes
Address: : 0x40011000
0x40011000 : 00000000 00000000 00000000 00000000
0x40011010 : 00000000 00000000 00000000 000000C0
0x40011020 : 00000000 00000000 00000000
Reading 32-bit memory content
Size : 44 Bytes
Address: : 0x40004400
0x40004400 : 0000012D 00000000 00000001 00000029
0x40004410 : 00000000 00000000 00000000 006000D0
0x40004420 : 00000000 00000000 00000000
Reading 32-bit memory content
Size : 44 Bytes
Address: : 0x40004800
0x40004800 : 00000000 00000000 00000000 00000000
0x40004810 : 00000000 00000000 00000000 000000C0
0x40004820 : 00000000 00000000 00000000
Now, here is the register dump after putting the STM32 into bootloader mode but not sending anything to any of the ports. (omitting the command line and header for brevity):
0x40011000 : 0000140D 00500000 00000000 00000000
0x40011010 : 00000000 00000000 00000000 006000D0
0x40011020 : 00000000 00000000 00000000
0x40004400 : 0000140D 00500000 00000000 00000000
0x40004410 : 00000000 00000000 00000000 006000D0
0x40004420 : 00000000 00000000 00000000
0x40004800 : 0000140D 00500000 00000000 00000000
0x40004810 : 00000000 00000000 00000000 006000D0
0x40004820 : 00000000 00000000 00000000
Finally here are the registers after sending 12 lots of 0x7F to USART2 RX (PA3):
0x40011000 : 0000140D 00500000 00000000 00000000
0x40011010 : 00000000 00000000 00000000 006000D0
0x40011020 : 00000000 00000000 00000000
0x40004400 : 0000140D 00500000 00000000 0000022D
0x40004410 : 00000000 00000000 00000000 006080F8
0x40004420 : 00000000 0000017F 00000000
0x40004800 : 0000140D 00500000 00000000 00000000
0x40004810 : 00000000 00000000 00000000 006000D0
0x40004820 : 00000000 00000000 00000000
It can be observed that USART2 seems to have been configured and indeed there seems to be a 0x7F in the USART2 RDR register low byte. However if I send other data like 0xA5 I still see the RDR set to the same value (0x0000017f). So... what is going on? I get no response from the USART2 regardless of what data I send. @Imen DAHMEN Can you please get an ST dev to take a look at this? I'm blocked on this and it is looking like a bootloader bug.
2022-02-01 02:30 PM
I just checked again and I can see the 0xA5 appearing in the RDR. So it looks as though USART2 is definitely receiving the data I'm sending. I do not see any toggling on the PA2 pin. I'm monitoring it with an oscilloscope set to trigger on falling edge. The line stays high the whole time. Perhaps the TX is on another pin?
2022-02-01 03:24 PM
I went through the registers for the USART2 and all the configuration and status makes sense that it has been configured correctly, autobaud detected and received my data. Additionally I went through the GPIO config registers and confirmed that the AF MUX is set to USART2 for PA2,3
0x58020000 : AA82AAAF 00000100 CFC3FFF0 24000000
0x58020010 : 0000600C 00000000 00000000 00000000
0x58020020 : 55557700 600AA004
2022-02-02 01:13 PM
I dug out an old Nucleo-H753ZI board and ripped of the relevant SB zero ohm resistors for PA2 and PA3. I jumpered boot0 to 3v3 and reset it. I used a usb virtual com port (115200 8e1) to send 0x7f to the Nucleo's STM32H753 and it responds as expected; 0x79 for the first 0x7f sent and then a 0x1f for every two 0x7f sent after that. The STM32 on the nucleo is rev V bootloader 0x90.
The USART 1,2,3 registers are:
0x40011000 : 0000140D 00500000 00000000 00000000
0x40011010 : 00000000 00000000 00000000 006000D0
0x40011020 : 00000000 00000000 00000000
0x40004400 : 0000140D 00500000 00000000 0000022B
0x40004410 : 00000000 00000000 00000000 006090D0
0x40004420 : 00000000 0000017F 0000001F
0x40004800 : 0000140D 00500000 00000000 00000000
0x40004810 : 00000000 00000000 00000000 006000D0
0x40004820 : 00000000 00000000 00000000
This is a different variant in a different package but it indicates that we must be doing something wrong which is causing the bootloader on our board to choose the wrong port. Can someone from ST confirm that the bootloaders for the 743 and 753 are binary identical?
2022-02-02 02:33 PM
In debugger, write to the USART Tx data register and observe the pin in question.
JW
2022-02-02 02:46 PM
Thank you for the helpful suggestion.
I ran..
C:\Program Files\STMicroelectronics\STM32Cube\STM32CubeProgrammer\bin>STM32_Programmer_CLI.exe -c port=SWD mode=HOTPLUG -w32 0x40004428 0x000000a5
And I can see 0xa5 received in the terminal program I'm using. So the port is active as expected.
2022-02-02 07:46 PM
I've worked through all the pins listed in AN2606 to check their states when we are in the bootloader.
I don't think it is accidentally picking up and locking to another port.
USB DFU
PA11 - Low
PA12 - High
USART1
PA9 - Low
PA10 - Low
PB14 - High PB14,15 are used in out app for USB+- I fitted a plug that has pull up resistors and no connection to a host to prevent and toggling on these lines.
PB15 - High
USART2
PA3 - Rx sending 0x7F 115200 8e1
PA2 - Tx no reply. Can get data to send by using STLink to set USART2_TDR
USART3
PB10 - NC - Not a problem as this is an output
PB11 - NC - This is potentially a problem if noise causes a toggle on this line. I have tried putting a pull down on this and it did not help. The evidence from looking at registers is that USART1 and USART3 do not receive data and baud detect.
I2C1
PB6 - High - Connected as i2c clock for devices on board
PB9 - 0.5V - connected to base of a BJT
I2C2
PF0 - Unconnected - Grounding did not help
PF1 - Unconnected - Grounding did not help
I2C3
PA8 - High
PC9 - Low - Pull down
SPI1
PA4 - Low
PA5 - Low
PA6 - Low
PA7 - Low
SPI2
PI0 - Unconnected - Grounding did not help
PI1 - Unconnected - Grounding did not help
PI2 - Unconnected - okay as it is output for bootloader
PI3 - Unconnected - Grounding did not help
SPI3
PC10 - Unconnected - Pulling down did not help.
PC11 - Low
PC12 - Low
PA15 - Low
SPI4
PE11 - Unconnected - Grounding did not help
PE12 - Unconnected - Grounding did not help
PE13 - Unconnected - okay as it is output for bootloader
PE14 - Unconnected - Grounding did not help
FDCAN
PH13 - Unconnected - Pulling down did not help.
PH14 - Unconnected - Pulling down did not help.
2022-02-10 02:30 PM
I finally got the Rev V (Bootloader 9) STM32H743 talking on the USART2 port. We had to mod our board to put all the pins mentioned in AN2606 into a safe state. It seems that the move to bootloader 9 from bootloader 13 has made it more sensitive to noise on the pins it watches.
If you are listening ST, this bootloader design is terrible. Normally a bootloader samples a handful of pins to decide which port is enabled so the designer only has to consider and manage the state of those pins. In your design the designer has to take account of the state of over 30 pins! There is no way to diagnose which of these 30 pins is causing an issue other than trial and error.
It is possible to get information about the state of the bootloader by reading the PC, but without disassembling the bootloader this is not helpful. I recommend that ST publish the linker map and source for the bootloader so that programmers can diagnose issues more readily.