打印

STM32 从USB-IAP程序跳到USB-APP程序不重枚举USB设备可不可以?

[复制链接]
4408|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huanhuanhdu|  楼主 | 2013-8-7 16:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 huanhuanhdu 于 2013-8-7 17:04 编辑

LZ现在做一个项目,使用USB-IAP的方式实现STM32 F103固件升级,而APP程序也是实现一个USB设备。IAP程序起始地址为0x08000000,APP程序起始地址为0x08004000。
一般做法是IAP 和APP 是两个USB设备,具有两个不同的USB PID,在IAP 和APP 之间切换时需要USB设备重枚举。但是这样在软件看来,就需要打开两个USB设备,并且需要等待USB重枚举的漫长时间。
也可以将APP 程序作为复位后进入的程序,即将APP 程序和IAP 程序的起始地址换一换,因为固件升级操作并不频繁,而在固件升级时进行两次打开USB设备并且等待USB重枚举等复杂操作也是可以接受的。但是,如果这样跳到IAP 之后升级APP 失败了,那就再也开不了机了!
所以,我想还是IAP 程序作为复位后默认进入的程序,然后再跳到APP 程序执行,但有不想等待USB重枚举而能够正常执行APP 程序。能不能有办法实现呢?
沙发
uet_cache| | 2013-8-7 16:50 | 只看该作者
官方的程序是用的按键,如果按下键执行IAP 升级程序,否则执行APP程序。这有信号选择的。

我刚用107 USB HOST从U盘升级程序。。官方写的例程,移植到开发板上,挺好用。楼主可以看看官方的例程。。。

使用特权

评论回复
板凳
huanhuanhdu|  楼主 | 2013-8-7 17:03 | 只看该作者
uet_cache 发表于 2013-8-7 16:50
官方的程序是用的按键,如果按下键执行IAP 升级程序,否则执行APP程序。这有信号选择的。

我刚用107 USB H ...

嗯,谢谢你。LZ用的是F103,应用场合也不适合使用其他存储设备升级,只考虑使用主机升级固件。

使用特权

评论回复
地板
puchuang| | 2013-8-7 19:09 | 只看该作者
软件升级   应该是比较可靠的解决方法

使用特权

评论回复
5
kseeker| | 2013-8-7 19:18 | 只看该作者
你说的这种情况,主要涉及两个问题:
1,IAP中的代码在App中无法调用(不是绝对的),因此某些函数需要有两份。
2,某些初始化过程中保存的变量需要从IAP传递到App中。一种方法是将要传递的数据都放到一个结构中去,然后为结构指定一个固定的地址,并且声明为不需要初始化,这样该结构就可以在iap和app中共享。也可以修改app和iap占用的内存空间,使二者占用不同的地址区域,在要共享的数据前加一个标记,转到app后去iap的空间中搜索该标记从而找到所需数据。

使用特权

评论回复
6
huanhuanhdu|  楼主 | 2013-8-7 21:19 | 只看该作者
我找到一个比较好的折中办法:
1. IAP 起始地址0x08000000,APP 起始地址0x08004000,上电复位进入IAP 程序;
2. APP 程序的长度和CRC32校验码存放在0x0800FC00(Flash最后一页);
3. IAP 如果检测到是上电复位,IAP首先检查APP程序的CRC32校验码是否正确,如果正确则立即跳到APP程序;否则在IAP程序中等待软件重新配置APP程序FLash区;

这样,USB设备重枚举只会在第一次上电的时候会出现,当然,如果STM32固件需要升级,那么软件首先请求STM32 软复位,

4. STM32 软复位后进入IAP程序,IAP判断出如果是软复位,则等在IAP 中,接收上层软件的命令并配置APP Flash区;
5. 配置APP Flash完成之后,软件请求跳到APP区

使用特权

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

本版积分规则

2

主题

4

帖子

1

粉丝