[应用相关] DFU文件下载又遇到问题,火烧眉毛了.

[复制链接]
8923|21
 楼主| mzscg 发表于 2008-7-29 10:36 | 显示全部楼层 |阅读模式
我将BMP文件直接修改后缀,变为.bin文件(论坛里许多人说是可以这样做的)

然后用ST的dfu file manager将.bin文件转换为.dfu文件,(文件大小基本与一样,提示转换成功了)

然后到dfuse demo下,在upgrade or verify action 右边点choose,选择转换好的
.dfu文件,显示:TARGET:file correctly loaded.

但是,点upgrade后,再现:target01:Unable to find data for that device /target from the file.
贴图如下(无法贴图)


请问是什么原因。。
 楼主| mzscg 发表于 2008-7-29 10:38 | 显示全部楼层

自己先让贴浮起来,现在头大得要命。。

没有顺利过。。
香水城 发表于 2008-7-29 10:54 | 显示全部楼层

估计你没有选择或没有选对目标芯片

.dfu文件中必须包含目标芯片和目标固件的版本号。

这些信息是为了保证不会把不相干的程序下载到应用目标中,否则轻则下载的程序不工作,重则目标产品因为错误的程序被烧坏。
 楼主| mzscg 发表于 2008-7-29 11:04 | 显示全部楼层

回香水,目标芯片选择了SPI flash:m25p64

香水你的话让我又掉进了冰窟, 

我仔细叙述一下我的初衷吧:

1,我用的是ST的开发板:STM3210B

2,现在我想在 STM3210B给的demo (大家应该知道吧)的框架上,用我的bmp位图更换
掉demo里面的位图(demo的位图目前依然存放在m25p64里),其他部分做一些简单修改,得到自己的GUI,

3,根据香水的话:  我这种作法是不能用DFU了吗? 我是打算将所有位图存放在片外的flash上(m25p64),   

谁能告诉我,我该怎么做???
香水城 发表于 2008-7-29 11:20 | 显示全部楼层

DFU适用于产品发布之后对固件程序进行更新

既然是更新,就必须要求更新下去的程序与原程序同出一辙。

我不知道你为什么选择了DFU,也许你的需求不用这么麻烦。

如果只是使用STM32烧写Flash,完全可以使用其他方法,比如使用UART接收数据,再写入Flash。
vigia 发表于 2008-7-29 11:42 | 显示全部楼层

最简单的做法

找个BIN到HEX的工具,弄个位图的数组出来。

找个ST写SPI FLASH的DEMO,把你的数组编译到这个项目里,直接在项目里把数组写到flash里去。
 楼主| mzscg 发表于 2008-7-29 11:43 | 显示全部楼层

回香水,我也这么想过,我电脑没串口,对自己无语了

这样说吧,
香水你研究过st开发板给的demo吧,
他们是怎么将bmp写到片外的m25p64里面去的呢???

我需要简便的方法,,,不然我真的要换一台电脑了...
用USB总可以吧.....研究US传输去.....
 楼主| mzscg 发表于 2008-7-29 11:53 | 显示全部楼层

回vigia,一个位图150KB,怎么执行?

我的STM32:  FLASH 128kB, SRAM:20KB,

这样可以传到flash里吗???   也只有通过串口线来传到片外flash了.
vigia 发表于 2008-7-29 11:57 | 显示全部楼层

额,也是。。。

我记得圈圈写过一个ST的USB传输例子和上层驱动的吧,要不找他借借。。。
香水城 发表于 2008-7-29 12:00 | 显示全部楼层

如果只是要求一次性地把bmp文件放到Flash中,可以分段操作

比如按照6楼的方法,把150KB分为3段,把50KB的数据包含到程序中,每次烧写50KB,3次就完成了。
 楼主| mzscg 发表于 2008-7-29 13:48 | 显示全部楼层

回楼上的,我需要存许多bmp,这种方法不适用啊

圈圈,,我找他一下.

香水,ST有写过用USB从PC传输到STM32的吗????只要有这个,一切就搞定了.我快崩溃了.
香水城 发表于 2008-7-29 13:52 | 显示全部楼层

那么你可以试试使用ST提供的USB虚拟串口的例子

你的问题在于你没有相关的系统知识,想用USB又没有USB的知识,所以遇到问题不知所措,这样的问题一时半会儿是解决不了的。
 楼主| mzscg 发表于 2008-7-29 14:11 | 显示全部楼层

回复香水,是,,接触底层不久

基本上大部分东西都是一边学一边做,
我现在只有寻求通过USB,
有问题以后还得向你请教,呵呵,,,我顶住..
computer00 发表于 2008-7-29 14:17 | 显示全部楼层

使用USB做成虚拟串口的方案是可以的

这样的话你通过上位机使用串口发送数据,但是实际数据是发送到USB口的,在设备端某个批量端点可以接收到这些数据。
但是这里有个问题就是流控制。如果使用串口调试助手之类的来发,虚拟串口我还不知道如何使用硬件流控制,因为从
我制作的USB转串口的情况来看,似乎主机从来都未请求过串口流控制线的状态...

当然,用软件流控制是肯定可以的,这需要楼主自己开发一个上位机的应用软件来访问串口(访问WDM驱动,
不要直接去访问串口的端口),不知道楼主是否有这个时间。

理论上,使用DFU的方案肯定也是可以行得通的,问题在于楼主对这个USB协议以及DFU协议不大熟悉,
所以搞起来可能会麻烦些。固件更新,无非就是将一些数据发送给设备,然后由设备把数据写到存储器
中,至于数据是写到哪去的,完全是由设备自己来决定的。如果长度太长的话,应该还需要修改相关描述符。

至于我那个驱动,不建议使用,因为有时插上设备时会导致系统蓝屏,至于原因是什么,我还没搞清楚...
估计是DS自动生成的代码有点小问题。

如果你会USB HID设备的话,也可以考虑使用自定义的HID设备,设置查询时间为1ms,包最大长度为64字节,
理论上可以达到64KB/s的速度,对于你几百K的图片,下载一个需要几秒钟,还可以接受了。

我觉得最好的办法其实还是做成USB大容量存储设备,在FLASH上做个FAT12的文件系统,
在电脑端直接把文件复制进去即可,方便得很。不过这个方案也许会让楼主花更多的时间……
 楼主| mzscg 发表于 2008-7-29 14:39 | 显示全部楼层

多谢computer00蝈蝈,我还是静下来研究USB协议.

心情很焦急,,但也得忍啊,

非常感谢这么多兄弟出谋献策...
xwj 发表于 2008-7-29 14:48 | 显示全部楼层

computer00蝈蝈

蝈蝈是不是蛐蛐???
vigia 发表于 2008-7-29 14:52 | 显示全部楼层

LZ你非要USB的话VCD确实比DFU简单多了

你看看usb_endp.c的
void EP3_OUT_Callback(void)
{
  count_out = GetEPRxCount(ENDP3);
  PMAToUserBufferCopy(buffer_out, ENDP3_RXADDR, count_out);
  SetEPRxValid(ENDP3);
}

USB数据直接在这个中断里拷贝到buffer_out里了,不过现在的函数是只收一次的,如果发的数据超过64字节,buf就要被冲掉了,关于这些的控制你还得自己改改。我没仔细看过这个项目,不过好像是没看到关于流量的控制。
香水城 发表于 2008-7-29 14:56 | 显示全部楼层

我的理解是USB虚拟串口的流量控制是由USB驱动解决的

USB转COM的驱动负责控制流量,所以用户不必操心。在USB设备端,当设备来不及响应主机的请求只需使用NAK,USB主机会择机重发,不会发生数据丢失的。
computer00 发表于 2008-7-29 15:02 | 显示全部楼层

老X就知道瞎搅和...

香主说的是,的确是由USB驱动负责了流控制,我一下脑袋短路,又回到了标准串口去了……晕……
发送数据驱动应该也没有做超时限制的。

看来用虚拟串口是个不错的选择。
 楼主| mzscg 发表于 2008-7-29 16:28 | 显示全部楼层

俺决定直接在程序里放数组数据来传,,呵呵

决定试一下,谁推荐一个能 从BMP里直接读出 十六进制数的工具????

而且十六进制数还带0x的,,,我下了几个,都没有带0x的....郁闷..
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

234

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部