ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:357.05KB ,
资源ID:28045162      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28045162.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(FATFS搭建以及测试方案.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

FATFS搭建以及测试方案.docx

1、FATFS搭建以及测试方案第一部分FATFS系统的特点和原理FatFs是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块。FatFs的编写遵循ANSI C,并且完全与磁盘I/O层分开。因此,它独立于硬件构架。它可以被嵌入到低成本的微控制器中,如AVR、8051、PIC、ARM、Z80、68K等等,而不需要做任何修改。图1.1 FATFS示意图其特点是: 兼容Windows的FAT文件系统 不依赖于硬件平台与架构,易于移植 代码和工作区占用空间非常小 多种配置选项 多卷(物理驱动器和分区) 多ANSI/OEM或Unicode中长文件名的支持 RTOS

2、的支持 多扇区大小的支持 只读,最少API,I/O缓冲区等等另外,FatFs提供了丰富的API函数,包括驱动器的建立,文件的读写以及目录的设立等等。第二部分 FATFS文件系统移植主要实现功能分析2.1 功能分析结合项目实际情况,本次FatFs文件系统的移植主要实现的功能为: 通过特定的“开始”按键等输入控制文件的创建以及实验的开始; 从节点收集的数据持续写入特定的txt文件中,在写入过程中需要加入断电保护使得设备在突发断电中可以将当前缓存中的数据全部写入或者舍弃; 按下“结束”按键,停止本次实验,并生成第一次实验数据文件,再度按下“开始”按钮开始实验时会重新建立一个新的txt文本文档,并将数

3、据写入; 在实验过程中需要对当前SD卡的读写状态进行监视,比如写入的状态和剩余的容量等: 当SD卡剩余容量小于一定界限时(此界限可根据反应时间和写入速度决定),会给予报警信号进行提示;另外,分析以下功能实现的主要矛盾点: 传感器节点采样速度为200Hz,平均5ms一次,每次采集数据大小约为1KB,所以SD卡写入速度理论上应为200KB/s。这个速度会受到写入次数、文件系统操作次数以及文件数量的影响。 写入的数据需要断电保护,主要目的是防止断电使得一帧数据并未完全写入txt文件中,成为无用数据。2.2 主要实现函数与流程根据以上需求,在本次SD卡文件系统的实现中,主要使用f_mount、f_op

4、en、f_write、f_lseek、f_sync等函数,下面着重结合FATFS系统的原理对以上函数的工作流程进行分析。根据FATFS的例程显示,一般的写操作包括以下几个步骤:1f_mount主要功能:注册/注销一个工作区。描述:f_mount 函数在FatFs 模块上注册/注销一个工作区。在使用任何其他文件函数之前,必须使用该函数为每个卷注册一个工作区。要注销一个工作区,只要指定FileSystemObject 为NULL 即可,然后该工作区可以被丢弃。该函数只初始化给定的工作区,以及将该工作区的地址注册到内部表中,不访问磁盘I/O层。卷装入过程是在f_mount 函数后或存储介质改变后的第

5、一次文件访问时完成的。此函数主要功能是注册一个驱动器,以为后面创建文件所用。2f_open主要功能:创建/打开一个用于访问文件的文件对象。描述:如果函数成功,则创建一个文件对象。该文件对象被后续的读/写函数用来访问文件。如果想要关闭一个打开的文件对象,则使用 f_close 函数。如果不关闭修改后的文件,那么文件可能会崩溃。在使用任何文件函数之前,必须使用 f_mount 函数为驱动器注册一个工作区。只有这样,其他文件函数才能正常工作。另外,此函数创建的文件可设置多种模式,本例中由于需要创建并写入文档,则需要设置可写并自动创建的方式。3f_write主要功能:写入数据到一个文件。图2.1 f_

6、write的工作原理示意图描述:先前的f_open是将一个创建的文件设置为活动的状态,也就是允许按照其事先设置的模式进行读写操作等。文件对象中的读/写指针以已写入字节数增加。该函数成功后,应该检查 *ByteWritten 来检测磁盘是否已满。在写操作过程中,一旦 *ByteWritten *ByteToWritten ,则意味着该卷已满。4f_lseek主要功能:移动一个打开的文件对象的文件读/写指针。也可以被用来扩展文件大小(簇预分配)。描述:采集的数据是按照一定的频率写入文档的,每次写入需要在上一次写入的位置接着写,而非替换原有数据。f_write的指针每次都默认指向文档开头。因此,必须

7、在写操作前将写指针移向文本最后。5f_close主要功能:关闭一个活动的文件。描述:f_close 函数关闭一个打开的文件对象。无论向文件写入任何数据,文件的缓存信息都将被写回到磁盘。该函数成功后,文件对象不再有效,并且可以被丢弃。如果文件对象是在只读模式下打开的,不需要使用该函数,也能被丢弃。6f_sync主要功能:冲洗一个写文件的缓存信息。图2.2 f_write的工作原理示意图描述:其执行过程与f_close相同。但是文件仍处于打开状态,并且可以继续对文件执行读/写/移动指针操作。这适用于以写模式长时间打开文件,比如数据记录器。定期的或f_write 后立即执行 f_sync可以将由于突

8、然断电或移去磁盘而导致数据丢失的风险最小化。在 f_close 前立即执行 f_sync 没有作用,因为在 f_close 中执行了 f_sync。换句话说,这两个函数的差异就是文件对象是不是无效的。本例设计的程序基本结构如下所示:图2.3 写数据流程图第三部分FATFS移植测试问题分析与解决方案3.1 数据写入的测试首先通过中断模拟汇聚节点收集数据的大小和速度,汇聚节点采样速率为200Hz,即每5ms采集一次,每次数据大小最大为1024字节。首先需要STM32每5ms产生一个1024字节的数据包。3.1.1 测试1:测试f_write的写入速度测试目的:当前工程使用的为SDIO的1线模式,其

9、理论速度为2MB/s,理论上满足数据的写入速度,设计实验验证实际的数据写入是否满足200Hz的要求。测试手段:在写文件程序中,包括文件写指针的寻址以及数据的写入,每完成一个函数会控制一个LED灯的亮灭,通过示波器观察其电平拉低的时间,即为每个函数所需要的耗时。测试代码:1 for(write_count = 0; write_count C68)这个函数中,此函数的主要功能为初始化SD硬件。其中的功能包括对SD卡基本功能的设置函数:SD_USER_Init()(main.c - C124)(由于此函数需要用户自定义,所以放在了main.c中进行了定义)以及初始化信息的返回。SD_USER_In

10、it函数第一步便是对SD卡的初始化:SD_Init(main.c - C129)此函数的详解可见于其定义处(sdcard.c C129)。其中包括对GPIO,SDIO以及DMA时钟的配置,以及对SDIO外设寄存器的默认设置(SDIO_Deinit -C142)。完成以上设置,接下来进入:SD_PowerON(sdcard.c - C181)也就是SD卡的上电步骤。在这个步骤中首先要注意此函数仅是为了配置SD卡,因此仅需要一根线,而且时钟频率也只需设置为400kHz,所以并不需要在此步设置4线模式。在SD_PowerON中存在一处修改,从SD卡协议中(Page 91)可以发现在上电后有需要等待7

11、4个时钟之后电压到达有效值之后才可以接着发送CMD0,但是在官方库的代码中并未等待这74个时钟。因此在sdcard.c的C204-216添加了74个循环。图3.1 上电流程图SD_InitializeCards函数主要发送CMD2和CMD3,获得CID寄存器内容和SD卡的相对地址(RCA),并通过CMD9,获取CSD寄存器内容。到这里,实际上SD卡的初始化就已经完成了。SD_Init函数又通过调用SD_GetCardInfo函数,获取SD卡相关信息,之后调用SD_SelectDeselect函数,选择要操作的卡(CMD7+RCA),通过SD_EnableWideBusOperation函数设置

12、SDIO的数据位宽为4位(但MMC卡只能支持1位模式)。经过此修改,初始化通过,并且获取卡的类型。上电部分的其它函数则参照以下流程图: 第二个问题出现在CMD55没有足够的处理时间以导致程序会进入一个死循环。由于修改时钟频率带来的错误。最开始配置SDIO时,其频率并不能设置为25MHz,而是应为400kHz,1线模式。初始化完成之后才应将时钟频率提高至25MHz。另外,时钟速度最高为25MHz,高于此速度会导致SDIO传输不可用。SD_EnableWideBusOperation(sdcard.c C655)则是设置SDIO读写时钟频率以及4线模式的函数。在C672-688中间是对SDIO传输

13、模式的设置。但是在官方的驱动中,程序会卡在SDEnWideBus(sdcard.c C674)中的FindSCR(sdcard.c C2440)中的C2764处,无法继续进行。此错误主要是因为在此函数的C2744处没有给予足够的时间处理命令,需要加一段时间的延时(C2746-2747)。另外添加了C2770-2771两行代码以保证最后可以跳出该循环。 第三个问题出现在SDIO的时钟速率上。初始化的最后会设置SDIO_CK时钟的频率,并设置工作模式(DMA/轮询)。在DMA模式中,如果只读,可以设置SDIO_CK的时钟为24Mhz,而如果要读写的话,这个时钟设置为18M左右比较合适,否则出错的几

14、率比较大,虽然我们的代码加入了防出错处理,不过这样会降低写入效率。而轮询模式,则必须设置SDIO_CK时钟频率不大于18Mhz,否则不能正常读写。以上问题解决后,SDIO可以用4线模式传输数据(D0D3均有数据传输),而且较为稳定,但是速度仍然受限为500kB/s。并且无论将时钟分频为24,18或14MHz,在写入任务(循环4000次写入,每次1KB,共计4MB)相同的情况下,使用手机的表秒功能进行计时,最终其写入速度均为500kB/s左右。表3.1 FATFS文件系统下SDIO传输速度测试结果SDIO_CK的输出频率写入数据总大小单次试验用时平均写入速度24MHz4MB8.32s480KB/

15、s18MHz4MB8.59s465KB/s14MHz4MB8.11s493KB/s可以发现,写入任务所需时间并不随时钟的变化而变化,上述的单次试验用时的微小偏差可以认为是人为原因导致的,可以忽略不计。分析:虽然SDIO的理论写入速度为12MB/s,但是SD本身的写入速度也会受到其等级和品质的影响。所以需要进一步对SD卡本身的读写能力进行测试,以确定其速度受限的根本原因。3.1.3 测试3:不带文件系统的SD卡读写测试方案设计:为了测试其写入速度受限的来源是否为FATFS文件系统,拟直接通过SDIO口将数据传输至SD卡中。为将变量尽可能减少,仍然与测试3采用相同的写入任务,即单次1KB,分为40

16、00次写入,并分为多种时钟(24,18,14MHz)观察平均写入速度。测试手段:将原有的SD卡测试例程移植到现有的SDIO_4bits的,并直接写入数据。写入任务与带有文件系统的SDIO读写测试相同。可以发现其速度有略微的提升,但是仍远未达到额定速度。表3.2 无文件系统的SDIO传输速度SDIO_CK的输出频率写入数据总大小单次试验用时平均写入速度24MHz4MB7.02s569KB/s18MHz4MB6.57s608KB/s14MHz4MB6.32s632KB/s鉴于此,需要另外考虑修改方法。3.1.4 测试4:FATFS读写原理以及改进调试源码可以将其写数据的过程总结为下图的流程,总体来说的原理为每满512字节往SD卡里写一次数:以此为基准,如果每次写入2048B的数据,进一步测试其写入的平均速度为:假设每次用f_write向文件内写入700字节,因为FATFS的机制,他会把512字节直接通过disk_write直接写入SD的物理磁盘,另外188字节存到数据缓冲区中等待至下一次700字节写的324字节凑够512字节写入。因此,在RAM中开一段循环Buffer,新采集的不定长数据会循环写入Buffer中,而数据读取也会按照固定的长度循环进行,以此提高数据发送的速度。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1