Chinaunix首页 | 论坛 | 博客
  • 博客访问: 347964
  • 博文数量: 69
  • 博客积分: 3077
  • 博客等级: 中校
  • 技术积分: 602
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-11 09:40
个人简介

或以为孤权重,妄相忖度

文章分类

全部博文(69)

文章存档

2012年(1)

2011年(10)

2010年(39)

2009年(19)

我的朋友

分类: 嵌入式

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  我们移植的基础也是这个版本  下面是这个优秀代码的参数
Imagefat.jpg
作者使用的是标准的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的编译情况
Image00000fat.jpg
这个是partition.c 还有 sd_mmc_spi.c 编译后的情况:
Image00001fat.jpg
一些需要注意的地方:

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  呵呵 大家有兴趣就玩一下 呵呵 (有好消息别忘了告诉我哈)




工程代码里面做了:读写操作 创建文件 删除文件等demo操作 使用的时候需要哪块 copy 哪块就行了 呵呵 ( 很方便吧 累死偶鸟 呵呵 ) 下面是演示流程 数据从串口发送出来 调试的时候接上串口就行了


演示过程
1. 初始化SD卡
2. 初始化分区 (SD卡只有一个分区)
3. 初始化FAT文件系统
4. 打开文件系统根目录
5. 输出SD卡的卡信息
6. 输出文件系统目录项 类似于DOS下的dir命令
7. 创建一个空白文件 命名为“worm.txt”
8. 再次dir 可以看到“worm.txt”文件创建成功
9. 往“worm.txt”文件里面写“ABCDEFG”7个字节
10. 再来一次dir 可以看到 “worm.txt”文件后面的数字7, 代表文件大小为7个字节
11. 打开“worm.txt”文件 并输出里面的内容
12. Thank you .



演示开始咯 先看一下SD卡的内容 4个文件
Image00000.jpg

看代码运行过程 串口输出的信息
Image00001.jpg
Image00002.jpg

把卡插到PC机上 打开盘符 可以看到worm.txt文件被创建了
Image00003.jpg
打开 worm.txt 文件 看到了内容 “ABCDEFG”  呵呵
Image00004.jpg
新版豆皮用户请下载 SD_fat16_With_PowerSwitch.rar
新版豆皮添加了 SD卡电源开关。

完整工程在附件里

STM32_fat16.rar  是豆皮1.0版本的代码工程

SD_fat16_With_PowerSwtich.rar   是豆皮2.0以上版本的代码工程 增加了SD卡的power switch开关的版本

敬请继续关注 豆皮的的教程会逐步推出.

阅读(2938) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

朱彬木杉2013-04-14 09:41:04

怎么下不到源码啊