豆皮 - STM32开发板基础教程(十四) - 基于STM32 的 FAT16文件系统 (原创)


豆皮 - STM32开发板基础教程(十四) - 基于STM32 的 FAT16文件系统  (原创)


版权所有 STMFANS 原创,转载请保留出处

http://www.stmfans.com/bbs/viewthread.php?tid=1218&page=1&extra=page%3D1





功能介绍 :移植FAT16文件系统到豆皮上 可以在SD卡上创建文件 写文件 修改文件 删除文件 创建目录 (文件名规格8.3模式)

上一个教程 我们已经实现了对SD卡进行初始化 读写SD卡的任意扇区 下面我们继续玩SD卡 使用STM32来操作SD卡上的FAT16文件系统   毕竟现在的卡都很大了 只是把sd卡当作是大容量的flash使用 有点浪费 也麻烦 因为 如果不支持FAT16/32文件系统 那么SD卡上的内容就不能被windows等PC机操作系统识别 呵呵


下面先介绍一下准备移植的文件系统 是一个开源代码 网址连接:http://www.roland-riegel.de/sd-reader/index.html    代码写的很精炼 代码的作者一直在更新着 最新的版本是:2008-06-08  我们移植的基础也是这个版本  下面是这个优秀代码的参数

Imagefat.jpg
2008-11-14 20:15



作者使用的是标准的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
2008-11-14 20:54



这个是partition.c 还有 sd_mmc_spi.c 编译后的情况

Image00001fat.jpg
2008-11-14 20:54





一些需要注意的地方:

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
2008-11-14 20:54



看代码运行过程 串口输出的信息


Image00001.jpg
2008-11-14 20:54

Image00002.jpg
2008-11-14 20:54


把卡插到PC机上 打开盘符 可以看到worm.txt文件被创建了

Image00003.jpg
2008-11-14 20:54


打开 worm.txt 文件 看到了内容 “ABCDEFG”  呵呵

新版豆皮用户请下载 SD_fat16_With_PowerSwitch.rar
新版豆皮添加了 SD卡电源开关。

Image00004.jpg
2008-11-14 20:54





完整工程在附件里

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

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

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




[ 本帖最后由 littleworm 于 2009-2-25 18:24 编辑 ]

STM32_fat16.rar (440.39 KB)

阅读权限: 20

IAR442工程

SD_fat16_With_PowerSwtich.rar (442.85 KB)

阅读权限: 20

1

评分人数

  • aleyn

我有一個夢想 擁有一大片土地 做個小地主 每天帶著一群狗奴才去調戲良家婦女....

好好学习!!

TOP

小虫子的教程就是简单易懂。

TOP

学习了,谢谢。

TOP

简单易懂

TOP

版本更新了....

http://www.roland-riegel.de  11月21日 更新了,支持SDHC和FAT32了。麻烦楼主再去移植一次吧。。。

[ 本帖最后由 tozzz 于 2008-11-22 23:28 编辑 ]

TOP

学习了,谢谢。

TOP

没办法,分数不够,顶一下

TOP

学习了,谢谢。

TOP

好东西,顶

TOP

原帖由 tozzz 于 2008-11-22 23:25 发表
http://www.roland-riegel.de  11月21日 更新了,支持SDHC和FAT32了。麻烦楼主再去移植一次吧。。。
]



貌似哥们说 移植了之后 感觉效率低了好多  呵呵
这好让人伤心啊
嗯 有时间移植一下 呵呵
我有一個夢想 擁有一大片土地 做個小地主 每天帶著一群狗奴才去調戲良家婦女....

TOP

学习了,谢谢。

TOP

经典的咚咚,收藏了!

TOP

谢谢,支持一下

TOP

支持,正学习呢

TOP

支持,正学习呢

TOP

小虫子的教程就是收获大啊,谢谢了!

TOP

看到这,感觉这里的教程非常好,谢谢版主们的无私奉献了

TOP

谢谢!下载学习!

TOP

刚买了个4G卡,准备测试下,现在买1G卡很难

TOP

多谢分享.

TOP

今天看了有关FAT的资料,才发现FAT16最高支持到2G,在winxp下4G卡只能格式化FAT32,浪费了4G的卡了

TOP

原帖由 armfans 于 2008-12-21 23:18 发表
今天看了有关FAT的资料,才发现FAT16最高支持到2G,在winxp下4G卡只能格式化FAT32,浪费了4G的卡了



写FAT16源代码的老外公布了最新版本的源码
支持了FAT32的
移植也很方便
你过去看看
尝试自己移植一下?
呵呵
加油
我有一個夢想 擁有一大片土地 做個小地主 每天帶著一群狗奴才去調戲良家婦女....

TOP

感谢您的努力

TOP

俺是用MDK的,试着想移过来呢,结果错误一大堆,俺是菜鸟,哪位大侠能移到MDK下啊?如果能移那个最新的支持FAT32的就更强了,强烈期盼中!!!!!!!!

TOP

Thanks  LZ !

TOP

再次感谢了

TOP

写的非常好!!!

TOP

还没看懂  先下下来再说

TOP

收藏了先

TOP

Review opelc.org on alexa.com