The RP2040 has a built-in boot loader that implements the sequence "instantiate the device as a flash drive, wait for UF2 file, flash QSPI, reboot", which is triggered by holding QSPI /CS down on boot. This boot loader is built into the ROM of the chip, so it's always there, and can't be bypassed or subverted - hold down the button and provide the UF2 - simple.
The only mention I can find of the boot loader on the GD32F450 is in the GD32F450xx_Datasheet_Rev2.2.pdf document:
The boot loader is located in the internal 30KB of information blocks for the boot ROM memory (system memory). It is used to reprogram the Flash memory by using USART0 (PA9 and PA10), USART2 (PB10 and PB11, or PC10 and PC11), and USBFS (PA9, PA10, PA11 and PA12) in device mode. It also can be used to transfer and update the Flash memory code, the data and the vector table sections. In default condition, boot from bank 0 of Flash memory is selected. It also supports to boot from bank 1 of Flash memory by setting a bit in option bytes.
So it seems you can download via USB, and you can do it using the built-in boot loader (by setting the boot pins, which could be done in the same way as the RP2040, holding a button down on power-up), but it's not clear *how* to talk to it, or whether it does enumerate as a flash disk like the RP2040 (I doubt this is the case or they'd probably mention it). What would be good to know is whether my own cross-platform code can scan for a device in DFU and then send it data.
I mean, I could slap a USB analyzer on the link, and record the process of using the Windows DFU loader (which presumably does this exact thing) but it'd be nice if I didn't have to, and there was some documentation somewhere, or (even better
![Smiley :)](https://www.eevblog.com/forum/Smileys/default/smiley.gif)
) some code...
If the only option is that you have to use a Windows DFU pre-built binary, then the chip isn't an option for me, and I'd prefer not to go down the analyze-the-bus-traffic for the simple reason that I'd have to buy a USB analyzer
If that second link is generic, and the DFU mode works to a standard protocol, that's awesome, I can crib from the code and get what I need