打印

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

[复制链接]
7709|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
McuPlayer|  楼主 | 2008-4-28 22:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
已经可以自动升级了,但是成功后我手工复位,真实太失败了
请问如何使用指令达到复位的目的

PS:不想用函数指针的方式,因为会无端用一级堆栈
沙发
香水城| | 2008-4-28 22:35 | 只看该作者

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

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

使用特权

评论回复
板凳
McuPlayer|  楼主 | 2008-4-29 15:49 | 只看该作者

对,WDT是个法子

使用特权

评论回复
地板
simon21ic| | 2008-4-30 22:21 | 只看该作者

是这个不?

NVIC_GenerateSystemReset

使用特权

评论回复
5
McuPlayer|  楼主 | 2008-5-1 21:17 | 只看该作者

楼上厉害,这个是正道

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

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

使用特权

评论回复
6
simon21ic| | 2008-5-1 22:15 | 只看该作者

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

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

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

使用特权

评论回复
7
shanggzq| | 2008-5-1 22:33 | 只看该作者

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

我也准备做在USB接口 IAP,谢谢!

使用特权

评论回复
8
McuPlayer|  楼主 | 2008-5-2 11:56 | 只看该作者

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

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

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

使用特权

评论回复
9
simon21ic| | 2008-5-2 15:47 | 只看该作者

Bootloader一般都应该是独立的吧

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

顺便说一下,Bootloader很简单就可以升级,按照ST的Flash Loader的功能,可以把Bootloader升级程序下载到RAM中去运行就可以了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

338

主题

7307

帖子

26

粉丝