打印

USB不同向量表如何能在第一次枚举后被另一USB使用

[复制链接]
2568|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chasedreamsl|  楼主 | 2010-9-7 11:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
把STM32的Flash分成两部分,0x0800 0000开始20K称为boot层,其它空间为CTRL层。boot主要功能是利用USB去升级CTRL的程序。同样CTRL也用到USB,USB部分代码全部相同,只是中断向量表不一样。这样在boot层有一次USB枚举,然后断开USB设备,在以ctrl层又要进行一次枚举。
      现在的问题就是:
     1.能否利用boot层的枚举成功后,在CTRL层不再枚举,而通过什么途径利用boot层的枚举?
     我的做法是把boot层使用到的全局变量copy到CTRL,这样模拟已经枚举成功的环境,但是现在好像不成功。boot跳转CTRL层后不能再打开USB,sscom提示串口被占用。
     2.从USB协议上进行修改可以完成这种要求吗?
注:USB从官方提供的虚拟串口修改。
沙发
香水城| | 2010-9-7 12:41 | 只看该作者
怎么跳转的?跳转前作了什么?

使用特权

评论回复
板凳
chasedreamsl|  楼主 | 2010-9-7 12:52 | 只看该作者
2# 香水城
USB_GlobalValSave(); //保存USB全局变量在SRAM空间中间
while (1)
{
CtrlEntryAddress = *(vu32*) (CTRL_SA + 4);
if(CtrlEntryAddress >= CTRL_SA && CtrlEntryAddress < SYSZONE_SA)
{
vCtrlEntry = (pFunction) CtrlEntryAddress;
__set_MSP(*(vu32*) CTRL_SA);
vCtrlEntry();
}
}

香主,跳转肯定是没有问题的。

使用特权

评论回复
地板
香水城| | 2010-9-7 13:32 | 只看该作者
1)要保证不是从任何一个USB函数中间跳转出来。
2)在2部分的代码中,必须保证USB的全局变量位置不变,因为链接时USB的变量是按照绝对地址分配的。

按照上述2),"保存USB全局变量在SRAM空间中间"这个步骤就显得多余了,因此也说明在2部分的代码中,你的USB全局变量位置改变了。

使用特权

评论回复
5
chasedreamsl|  楼主 | 2010-9-7 14:26 | 只看该作者
4# 香水城
1)要保证不是从任何一个USB函数中间跳转出来。
2)在2部分的代码中,必须保证USB的全局变量位置不变,因为链接时USB的变量是按照绝对地址分配的。

按照上述2),"保存USB全局变量在SRAM空间中间"这个步骤就显得多余了,因此也说明在2部分的代码中,你的USB全局变量位置改变了。

     “1)要保证不是从任何一个USB函数中间跳转出来。”这条可以肯定是在没有使用USB函数中出来;
      第“2)”条,我是把boot层中全局变量保存后再拷贝到CTRL层相对应USB全局变量中。在这里虽然说“全局变量地址变了”,但是USB全局变量的值是没有变的,也就是USB状态还保留。我不知道这样是否可以模拟出Boot层的使用环境,从而达到不要再断开USB再重新枚举的过程。
注:两个层都有同样的全部的USB函数。

使用特权

评论回复
6
香水城| | 2010-9-7 14:32 | 只看该作者
必须要保证USB的全局变量位置不变

比如boot层中某个全局变量的地址是0x08001000,到了CTRL层相对应的地址改变为0x08001100,在boot层中的USB函数,还会到原来的地址(0x08001000)去访问这个变量,可是你把地址改变了,自然就会出错了!

使用特权

评论回复
7
chasedreamsl|  楼主 | 2010-9-7 14:46 | 只看该作者
6# 香水城
香主,真不好意思。我可能没把我这里的Flash环境说清楚。
     首先,Boot层和监控层是采用两个工程,两个工程都有相同的全部的USB函数。再次,Boot层只是用USB下载,完了以后自动会跳转到CTRL层(DFU差不多了)。最后,到了CTRL层就不再使用Boot层的USB函数,因为CTRL自己有Boot层完全一样的。
     所以,我一直就是想把Boot层的USB相关的全局变量保存起来传到CTRL,这样CTRL模拟Boot层环境,达到不要再次枚举的目的。
    我现在最想确认的问题是这样的方案的可行性? 如果香主有更好方案,还恳请香主赐教。谢谢。

使用特权

评论回复
8
香水城| | 2010-9-7 14:51 | 只看该作者
原理上行的通,但你实际操作中的问题,只有现场调试才能比较准确地找出原因。

会不会是在跳转时,CTRL工程的初始化程序,尤其是编译器自带的初始化部分,改变了那些变量的内容?

使用特权

评论回复
9
chasedreamsl|  楼主 | 2010-9-12 16:55 | 只看该作者
8# 香水城
问题解决了。谢谢香主。

使用特权

评论回复
10
mcuisp| | 2010-9-12 17:59 | 只看该作者
构想是完全可行的,不过要对C编译器比较熟才行。

使用特权

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

本版积分规则

1

主题

78

帖子

1

粉丝