STM32 串口IAP问题

最近在做利用串口的固件升级调试,是这么设想的,把片上的Flash分为3个区域,分别为BootLoader APP1和APP2,比如设备在运行APP1时,收到升级指令,新固件就下载到APP2区域,如果下载失败或者更新失败,就从新返回到APP1区域执行,这样防止设备升级过程中,由于未知原因,造成设备变成砖块。
目前测试的情况是:
BootLoader能正常引导程序下载, 且跳转运行都正常。在调试过程中发现如下现象;
1、BootLoader第一次引导程序运行在APP1区域,APP1区域程序运行正常,当在运行过程中发送升级指令,返回到BootLoader,程序卡死了,必须重新上电,才能正常进入BootLoader引导,而且程序也能正常引导到APP2区域并执行。
2、当下载完成BootLoader后,掉电一次,然后下载APP1正常执行,在发送升级指令,能正常进入BootLoader。
3、当正常运行在APP1,发送升级指令,在下载APP2过程中,拔掉串口线,固件下载失败,能正常返回APP1执行。
4、当正常运行在APP2,发送升级指令,在下载APP1过程中,拔掉串口线,固件下载失败,在返回APP2时,程序跑飞了,不能正常执行。
我用的片子是STM32F103RET6,有512K的flash。
有遇到过这样的事情吗?