已经可以自动升级了,但是成功后我手工复位,真实太失败了
请问如何使用指令达到复位的目的
PS:不想用函数指针的方式,因为会无端用一级堆栈
STM32的软复位可以通过看门狗实现
启动看门狗的功能之后进入死循环,不喂狗,然后就会有软复位。通过查看相应的状态位,可以判断是否为软复位。
是这个不?
NVIC_GenerateSystemReset
楼上厉害,这个是正道
这个函数操作的是 System Control Block组中Application Interrupt/Reset Control Register
这个在CM3的datasheet中有详细说明,不是STM32特有的。
Datasheet太多了,看得头大了,还是用ST提供的NVIC_GenerateSystemReset函数比较实惠。
关于USB接口的IAP有几个问题请教一下
位于Flash地址0x08000000开始的空间?
是在EWARM下实现的吗?
我自己也做了一个使用USB接口模拟一个串口,在这个串口上实现FLash Loader的协议,但发现一些很奇怪的现象:
如果Bootloader使用GCC编译,那么不管应用程序使用GCC还是IAR编译的,都可以正常使用。
如果Bootloader使用IAR编译,那么如果应用程序使用GCC编译的话,可以正常使用;而如果应用程序使用IAR编译的话,则不能使用。
本来自己基本GCC,所以也没在意这个问题,当然如果能了解原因是最好的了。
能把你的USB IAP过程和程序说一下吗?
我也准备做在USB接口 IAP,谢谢!
我的IAP程序和主程序是完全独立的
没有任何share的sub routine,这样就不存在编译的问题,因为我注意到ST的Lib是在升级的,所以做了这个决定。
当然,目前我的IAP Loader是无法升级的,以后应该可以做。
我是主程序设定IAP标志后,修改所有中断向量到Loader,跳过去,升级完成后,Reset系统,USB会重新枚举,这时候49年来了,已经换主程序了。
Bootloader一般都应该是独立的吧
所以要分Bootloader和应用程序
看来你没明白我的意思,算了,本来也就是比较奇怪的问题
顺便说一下,Bootloader很简单就可以升级,按照ST的Flash Loader的功能,可以把Bootloader升级程序下载到RAM中去运行就可以了