Usually, writing to FLASH is not rocket science; just writing a few magic register values to enable access, trigger erase cycle, and then writing to memory.
Thus, if you can write your actual firmware which communicates with user and does things, you definitely can write the flasher; as a part of the application, or as a separate bootloader project. The upside is, you can fully define the protocol as you wish, using any interface.
As always, I will encourage you to open up the reference manual and do it yourself.
If you write flash as part of the application, the only "weird" thing you need to remember is to make sure the flasher code (all of it; including compiler-generated memset/memcpy calls etc.) must be in RAM (or in another flash sector you are not erasing), so that you don't lose your flasher code while it is running. This will trigger the learning process of how to put code in RAM, which will be a valuable lesson in any case.