Well actually the hardest part is the other way around.
要从app进bootloader很简单。每次复位之后都是由bootloader引导的,那个按钮只是bootloader里面写的一段通用代码罢了,用一个GPIO的电平作为判断条件。你可以改代码把它换成其它的东西,记住这一点。
如果程序已经引导进入app了,现在你想在app里面通过软件回到bootloader去升级固件。首先bootloader里面有段现成的software reset代码可以复制到你的app里面实现软件复位。
其次复位之后RAM数据都没了,你要考虑bootloader怎么判断你是希望刷固件还是希望直接进app。这个时候你可以考虑利用STM32 flash中的option byte来传递状态。只用1bit就行了。比如0代表不需要更新固件,1代表需要更新。那么你从app里面软复位的时候把这个bit置1。bootloader引导进入条件判断分支的时候就先把这个bit清0,再停留在bootloader里面等待上位机发固件过来。
但是你用什么东西去刷固件就是上位机软件的活了。DFUSe上面有个按钮你点了就会推出DFU模式开始执行app。要想自动化,就得在上位机上面把这个操作给写了。就这样。