或以为孤权重,妄相忖度
分类: 嵌入式
2011-07-19 14:59:21
功能介绍 :移植FAT16文件系统到豆皮上 可以在SD卡上创建文件 写文件 修改文件 删除文件 创建目录 (文件名规格8.3模式) 上一个教程 我们已经实现了对SD卡进行初始化 读写SD卡的任意扇区 下面我们继续玩SD卡 使用STM32来操作SD卡上的FAT16文件系统 毕竟现在的卡都很大了 只是把sd卡当作是大容量的flash使用 有点浪费 也麻烦 因为 如果不支持FAT16/32文件系统 那么SD卡上的内容就不能被windows等PC机操作系统识别 呵呵 |
下面先介绍一下准备移植的文件系统 是一个开源代码 网址连接: 代码写的很精炼 代码的作者一直在更新着 最新的版本是:2008-06-08 我们移植的基础也是这个版本 下面是这个优秀代码的参数 作者使用的是标准的ANSI C编写 并且层次结构很好 顶层是文件系统操作 中间是设备层 底层是各种SPI操作函数 层与层之间独立性很好 我们移植所需要做的 也就是修改底层就OK 下面copy 一下作者对本代码移植的说明: Adapting the software to your needs The only hardware dependent part is the communication layer talking to the memory card. The other parts like partition table and FAT16 support are completely independent, you could use them even for managing Compact Flash cards or standard ATAPI hard disks. By changing the MCU* variables in the Makefile, you can use other Atmel microcontrollers or different clock speeds. You might also want to change the configuration defines in the files fat16_config.h, partition_config.h, sd_raw_config.h and sd-reader_config.h. For example, you could disable write support completely if you only need read support. |
下面谈谈我的移植 1. 保留了fat16.c fat16.h partition.c partition.h 2. 把 fat16_config.h 里面的内容整合到 fat16.h里面 3. 把 partition_config.h 里面的内容整合到 partition.h 里面 4. 源代码中的sd_raw.c 全部整合到工程的sd_mmc_spi.c里面 4. 然后就是底层的SPI操作 这个根据STM32的函数进行调整 也在sd_mmc_spi.c里面 5. over啦 呵呵 看一下编译后的CODE MEMORY情况 这个是fat16.c的编译情况 这个是partition.c 还有 sd_mmc_spi.c 编译后的情况: |
一些需要注意的地方: 1. 初始化SD卡的时候 spi的频率不要太高 工程里面设置的是 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; 然后初始化成功了 一定记得把spi频率提高 这样传输速率高了 读写速率也就搞了撒 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; 2. 本代码在读写sd卡的时候提供2种方式 一种是使用静态内存 就是使用512字节的缓冲区 这样读写速度快些 但是 针对更小型的单片机 片内资源紧张的mcu 也提供了一种动态内存的方式 使用的ram特别的少 看上面的那个图 只需要50字节左右 呵呵 当然 对于STM32 我是使用了静态内存的 呵呵 3. fat16.h 里面有一个参数 #define CLUSTER_BUFFER_SIZE 64 这个是读写簇的一个缓冲区 我在代码中也注释了的 // 设置簇写的缓冲区大小 64字节属于一个比较平衡适中的参数 如果内存紧张 可以把这个数值改小 但是 读写速度也会稍微降低一些 |
简单测试了一下读写性能 1. 写文件 不停的写一个512K的文件 耗时84S 6.1K/S 的样子 呵呵 按照工程的设置 可以达到6.1K/S 觉得差不多了 2. 读文件 读文件的速度还不错 读512K文件 只要不到2S 可以达到256K/S 这个速度还是不错的 呵呵 其实如果还需要更快的速度 可以加一级cache 512字节 听网友说读写性能提高很多 写可以达到26K/S 呵呵 大家有兴趣就玩一下 呵呵 (有好消息别忘了告诉我哈) |
看代码运行过程 串口输出的信息 把卡插到PC机上 打开盘符 可以看到worm.txt文件被创建了 完整工程在附件里 |