野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11241|回复: 2

【外部SPI Flash模拟U盘总结】小内存mcu移植U盘总结

[复制链接]
发表于 2018-1-6 21:09:28 | 显示全部楼层 |阅读模式

声明:楼主是以前没有移植过USB的小白,如有描述不到位的地方,见笑了。
本来问题是不存在的,出现问题的根本原因在于楼主使用的MCU是stm32F103CBT6,Flash 128k,RAM 20k,所以在本身已经使用了大量ram的一个不是太小的工程中移植U盘内存感觉很吃紧,就因为内存不够,各个文件、函数都反反复复去翻,到处track,总是看到一些看不懂的协议错误等。
总结下问题解决的过程:
1、由于内存不足,所以我就把USB的memory文件中的Data_Buffer的大小从0x40 * 64 改成 0x10 * 64 , 这样改了之后track了usb_bot.c文件,并且特别关注了Decode函数中的USB命令CB[0],然后就发现存在内存不足的问题,因为有个获取Data_Len的函数每次返回的长度是31(后来是64),超过了改过的0x10;
2、所以就决定把Data_Buffer的大小从0x40 * 64 改成 0x40 * 8,这样改过之后,插上电脑后终于能识别了,但是仍然看不到磁盘,仅仅在设备管理器中能看到,用Diskman也能看到,不过不能对其进行任何操作;
3、问题没有解决,仍然认为问题在于内存太小,所以想反向解决问题:把扇区的4096 改成 1024 , 并且对擦出、读、写操作进行了修改,使之最终以4096进行操作,这样浪费了很多的时间和一定的空间,终于插上电脑后能看到磁盘了,也能对其进行写操作,问题还有:对磁盘拷贝了文件后,再拔插,拷贝的文件就看不见了,但是能看到磁盘空间又减小了,即拷贝的文件确实写入了FLASH;
4、猜测是U盘系统的问题,于是找到memory文件,对内存写的操作函数里面的参数数据进行了track,然后发现Data_len是64,而之前改过Data_Buffer的大小为0x40 * 16(后来又改的),这就没办法了啊,如果改回0x40 * 64的话,又是内存不足的错误了;
5、又试图更改写入的函数,用写4次的代价来换取内存空间,失败了;
6、实在没办法了,此时注意到Data_Buffer的格式是uint32_t,但是检查了所有的Data_Buffer都是以字节进行操作的,此处定义成u32不是大大的浪费吗??
7、把Data_Buffer的定义由uint32_t Data_Buffer 改成uint8_t Data_Buffer ,至此U盘程序终于移植成功了。

调试了这么多,绕了好多弯路,最终只改了一个定义就解决了问题。所以我对U盘移植程序再总结一下:

1、移植U盘程序主要关注memory文件、usb_bot文件、hw_config文件、mass_mal文件;
2、对于小内存的MCU按我上面那样改内把原来的64*64*4 = 16k的内存节省到4k,对于STM32f103C8T6这样的MCU也是足够了,这是这次移植的一个重要经验。

修修改改,也对usb稍微有点了解了,但又貌似什么都不了解,现在幸运的是终于成功了,记得下午还想放弃的,哈哈,差点功亏一篑了。

来看个图:
移植成功1.PNG
移植成功2.PNG
回复

使用道具 举报

发表于 2018-1-8 08:54:57 | 显示全部楼层
赞,是不是感觉学会了好多东西
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-9 12:02:50 | 显示全部楼层
flyleaf 发表于 2018-1-8 08:54
赞,是不是感觉学会了好多东西

感觉更多的是调试经验,对USB本身还是不太清楚啊,还得好好学习。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 15:24 , Processed in 0.036313 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表