打印

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

[复制链接]
438|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小蘭|  楼主 | 2020-4-26 10:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
声明:楼主是以前没有移植过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稍微有点了解了,但又貌似什么都不了解,现在幸运的是终于成功了,记得下午还想放弃的,哈哈,差点功亏一篑了。

使用特权

评论回复

相关帖子

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

本版积分规则

451

主题

463

帖子

1

粉丝