A bit more polish now. You have to press and hold down the buttons for 2 seconds on boot in order to enter the bootloader - I don't want to accidentally flash a device just because someone left a .HEX file in there.
It now gives better visual feedback as to what's going on. Rapid-blinking of LED's means it's going to start flashing. Rapid-blinking of LED1 means flash in progress, and held LED1&LED2 means that all good. Errors are still reported as per usual.
Serial output is now optional, through HAL_USE_SERIAL.