FATFS移植、调试过程(在STM32上使用W25Q64)花了几天的时间好不容易自己移植好了FATFS,以前一般都是用别个现成的东西,真的自己移植还是有一点点的操蛋。移植FATFS其实不难,当然这是对于一个成功移植好的人来说。FATFS移植资料网上有一大堆,但是在移植成功之前还是搞得我一头雾水.1、准备工作硬件:STM32F4+W25Q64软件:FATFS0.1版本,好像现在最高的就是0.1版的吧,没去细查。FATFS官方源码下载好之后只有几个文件。添加两个C文件进去就好了,添加文件这种事比较基础,没什么好说的。只要我这截图上有的文件都加上去了,基本上就可以了。这里面需要我们修改的是diskio.c,其它文件不用动,当然有时候动动也没事,我用别人的东西总喜欢看看里面是什么。在diskio.c里面,一共有6个接口函数,我按照重要性从最不重要的开始讲参考正点原子的代码,我在开头宏定义了扇区大小等内容。[cpp]viewplaincopyprint?#defineFLASH_SECTOR_SIZE512#defineFLASH_BLOCK_SIZE8uint32_tFLASH_SECTOR_COUNT=2048*6;这三个内容在diskio.c都会用到。这里解释一下这三个东西,我之前查这个搞了半天没理解[cpp]viewplaincopyprint?FLASH_SECTOR_SIZE是指一个扇区块的大小512个字节[cpp]viewplaincopyprint?<prename=codeclass=cpp>FLASH_BLOCK_SIZE一个扇区分成了8块,也就是4K的大小,为什么是八块,百度后发现是因为与FAT类型有关,具体解释在正点原子<h1class=phstyle=word-wrap:break-word;margin:0px;padding:15px0px10px;font-size:20px;font-family:'MicrosoftYaHei','HiraginoSansGB',STHeiti,Tahoma,SimHei,sans-serif;font-weight:100;color:rgb(68,68,68);>-第四十五章FATFS实验里面有说明</h1></pre><p></p><pre></pre><prename=codeclass=cpp>FLASH_SECTOR_COUNT这一段的内容是指有多少个扇区块,有什么用呢,在格式化W25Q64的时候,这个就可以认为是我的W25Q64的容量</pre>因为在W25Q64里面是没有MBR/DBR这些大小的,所以需要使用FATFS格式化成一个存储设备<p></p><p>要使用格式化就需要使用diskio.c里面的disk_ioctl函数</p><p>这是第一个函数。</p><p>#if_USE_IOCTL<br>DRESULTdisk_ioctl(<br><spanstyle=white-space:pre></span>BYTEpdrv,<spanstyle=white-space:pre></span>/*Physicaldrivenmuber(0..)*/<br><spanstyle=white-space:pre></span>BYTEcmd,<spanstyle=white-space:pre></span>/*Controlcode*/<br><spanstyle=white-space:pre></span>void*buff<spanstyle=white-space:pre></span>/*Buffertosend/receivecontroldata*/<br>)<br>{<br><spanstyle=white-space:pre></span>DRESULTres;<br><spanstyle=white-space:pre></span>switch(cmd)<br><spanstyle=white-space:pre></span>{<br><spanstyle=white-space:pre></span>caseCTRL_SYNC:<br><spanstyle=white-space:pre></span>res=RES_OK;<br><spanstyle=white-space:pre></span>break;<br><spanstyle=white-space:pre></span>caseGET_SECTOR_SIZE:<br><spanstyle=white-space:pre></span>*(WORD*)buff=FLASH_SECTOR_SIZE;<br><spanstyle=white-space:pre></span>res=RES_OK;<br><spanstyle=white-space:pre></span>break;<br><spanstyle=white-space:pre></span>caseGET_BLOCK_SIZE:<br><spanstyle=white-space:pre></span>*(WORD*)buff=FLASH_BLOCK_SIZE;<br><spanstyle=white-space:pre></span>res=RES_OK;<br><spanstyle=white-space:pre></span>break;<br><spanstyle=white-space:pre></span>caseGET_SECTOR_COUNT:<br><spanstyle=white-space:pre></span>*(DWORD*)buff=FLASH_SECTOR_COUNT;<br><spanstyle=white-space:pre></span>res=RES_OK;<br><spanstyle=white-space:pre></span>break;<br><spanstyle=white-space:pre></span>default:<br><spanstyle=white-space:pre></span>res=RES_PARERR;<br><spanstyle=white-space:pre></span>break;<br><spanstyle=white-space:pre></span>}<br><spanstyle=white-space:pre></span>returnres;<br>}<br>#endif</p><p>从函数可以看到,这里需要修改宏定义_USE_IOCTL,这个定义在FATFS附带的头文件ffconf.h里面</p><p>#define_USE_WRITE<spanstyle=white-space:pre></span>1<spanstyle=white-space:pre></span>/*1:Enabledisk_writefunction*/<br>#define_USE_IOCTL<spanstyle=white-space:pre></span>1<spanstyle=white-space:pre></span>/*1:Enabledisk_ioctlfucntion*/</p><p>同样在ffconf.h里面,需要配置</p><p>#define<spanstyle=white-space:pre></span>_USE_MKFS<spanstyle=white-space:pre></span>1<spanstyle=white-space:pre></span>/*0:Disableor1:Enable*/</p><p>/*Toenablef_mkfs()function,set_USE_MKFSto1andset_FS_READONLYto0*/</p><p>如果不置1,可能编译报错</p><p><br></p><p>然后是第二个函数,不用理他,一个获取时间的</p><p>/*-----------------------------------------------------------------------*/<br>/*Getcurrenttime*/<br>/*-----------------------------------------------------------------------*/<br>DWORDget_fattime(void)<br>{<br><spanstyle=white-space:pre></span>returnRES_OK;<br>}</p><p><br></p><p>第三个函数,获取状态,也不用理他<br>DSTATUSdisk_status(<br><spanstyle=white-space:pre></span>BYTEpdrv<spanstyle=white-space:pre></span>/*Physicaldrivenmuber(0..)*/<br>)<br>{<br><spanstyle=white-space:pre></span>returnRES_OK;<br>}<br></p><p><br></p><p>第四个函数是初始化函数,把自己W25Q64的初始化接口放进去就可以了</p><p>DSTATUSdisk_initialize(<br><spanstyl