ARM Cortex M software update via bootloader
In fact it's quite easy - there are multiple methods. I outlined one in this thread.

Basically you will have two separate pieces of software running. Consider the following setup (it's just an example):


Bootloader (Flash address 0x0000 - 0x1000)
Application (Flash address 0x1000 - 0x2000)


(of course, those are dependent on your requirements)

Now, the application will download the binary (we'll call it FW 2.0). It will set some special bit in your controller and perform a reboot. Your CPU always starts at address 0x0000, it will load your bootloader. Your bootloader checks if the "special" bit is set and will then flash the binary file to address 0x1000-0x2000. It will then reset that special bit, indicating no new firmware is available. It will then reset itself again.
Now, again, the bootloader starts - it will detect that the special bit is in fact NOT set and do nothing but simply perform a jump to the application (0x1000) from where the program will execute (now with the new firmware).

You might also want to include an option to run a default firmware or to load a firmware via UART in case your application cannot be written correctly or power is lost during the update.