用STM32实现USB的IAP成功后,如何软复位

rqq2007   2008-4-28 22:22 楼主
已经可以自动升级了,但是成功后我手工复位,真实太失败了
请问如何使用指令达到复位的目的

PS:不想用函数指针的方式,因为会无端用一级堆栈

回复评论 (8)

STM32的软复位可以通过看门狗实现

                                 启动看门狗的功能之后进入死循环,不喂狗,然后就会有软复位。通过查看相应的状态位,可以判断是否为软复位。
点赞  2008-4-28 22:35

对,WDT是个法子

                                  
点赞  2008-4-29 15:49

是这个不?

                                 NVIC_GenerateSystemReset
点赞  2008-4-30 22:21

楼上厉害,这个是正道

这个函数操作的是 System Control Block组中Application Interrupt/Reset Control Register

这个在CM3的datasheet中有详细说明,不是STM32特有的。
Datasheet太多了,看得头大了,还是用ST提供的NVIC_GenerateSystemReset函数比较实惠。
点赞  2008-5-1 21:17

关于USB接口的IAP有几个问题请教一下

位于Flash地址0x08000000开始的空间?
是在EWARM下实现的吗?

我自己也做了一个使用USB接口模拟一个串口,在这个串口上实现FLash Loader的协议,但发现一些很奇怪的现象:
如果Bootloader使用GCC编译,那么不管应用程序使用GCC还是IAR编译的,都可以正常使用。
如果Bootloader使用IAR编译,那么如果应用程序使用GCC编译的话,可以正常使用;而如果应用程序使用IAR编译的话,则不能使用。
本来自己基本GCC,所以也没在意这个问题,当然如果能了解原因是最好的了。
点赞  2008-5-1 22:15

能把你的USB IAP过程和程序说一下吗?

                                 我也准备做在USB接口 IAP,谢谢!
点赞  2008-5-1 22:33

我的IAP程序和主程序是完全独立的

没有任何share的sub routine,这样就不存在编译的问题,因为我注意到ST的Lib是在升级的,所以做了这个决定。
当然,目前我的IAP Loader是无法升级的,以后应该可以做。

我是主程序设定IAP标志后,修改所有中断向量到Loader,跳过去,升级完成后,Reset系统,USB会重新枚举,这时候49年来了,已经换主程序了。
点赞  2008-5-2 11:56

Bootloader一般都应该是独立的吧

所以要分Bootloader和应用程序
看来你没明白我的意思,算了,本来也就是比较奇怪的问题

顺便说一下,Bootloader很简单就可以升级,按照ST的Flash Loader的功能,可以把Bootloader升级程序下载到RAM中去运行就可以了
点赞  2008-5-2 15:47
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复