STM32的FATFS文件系統(tǒng)移植筆記
作者:
時(shí)間:2016-11-26
來源:網(wǎng)絡(luò)
收藏
復(fù)制代碼 MSD0_WriteSingleBlock()和MSD0_WriteMultiBlock()函數(shù)都是SD卡操作的底層函數(shù),我們在SPI_MSD0_Driver.c文件中實(shí)現(xiàn)。
7、實(shí)現(xiàn)disk_ioctl()函數(shù)
該函數(shù)在磁盤格式化、獲取文件系統(tǒng)信息等操作時(shí)會(huì)被調(diào)用。
實(shí)現(xiàn)后的程序如下:
本文引用地址:http://m.butianyuan.cn/article/201611/321826.htm- DRESULT disk_ioctl (
- BYTE drv, /* Physical drive nmuber (0..) */
- BYTE ctrl, /* Control code */
- void *buff /* Buffer to send/receive control data */
- )
- {
- if (drv==0)
- {
- MSD0_GetCardInfo(&SD0_CardInfo);
- switch (ctrl)
- {
- case CTRL_SYNC :
- return RES_OK;
- case GET_SECTOR_COUNT :
- *(DWORD*)buff = SD0_CardInfo.Capacity/SD0_CardInfo.BlockSize;
- return RES_OK;
- case GET_BLOCK_SIZE :
- *(WORD*)buff = SD0_CardInfo.BlockSize;
- return RES_OK;
- case CTRL_POWER :
- break;
- case CTRL_LOCK :
- break;
- case CTRL_EJECT :
- break;
- /* MMC/SDC command */
- case MMC_GET_TYPE :
- break;
- case MMC_GET_CSD :
- break;
- case MMC_GET_CID :
- break;
- case MMC_GET_OCR :
- break;
- case MMC_GET_SDSTAT :
- break;
- }
- }else if(drv==1){
- switch (ctrl)
- {
- case CTRL_SYNC :
- return RES_OK;
- case GET_SECTOR_COUNT :
- return RES_OK;
- case GET_SECTOR_SIZE :
- return RES_OK;
- case GET_BLOCK_SIZE :
- return RES_OK;
- case CTRL_POWER :
- break;
- case CTRL_LOCK :
- break;
- case CTRL_EJECT :
- break;
- /* MMC/SDC command */
- case MMC_GET_TYPE :
- break;
- case MMC_GET_CSD :
- break;
- case MMC_GET_CID :
- break;
- case MMC_GET_OCR :
- break;
- case MMC_GET_SDSTAT :
- break;
- }
- }
- else{
- return RES_PARERR;
- }
- return RES_PARERR;
- }
復(fù)制代碼
MSD0_GetCardInfo()函數(shù)也在SPI_MSD0_Driver.c文件中實(shí)現(xiàn),其中SD0_CardInfo為PMSD_CARDINFO類型的全局變量,它在SPI_MSD0_Driver.h文件中被定義。
8、到此diskio.c這個(gè)文件中的所有函數(shù)就已經(jīng)實(shí)現(xiàn),下一步就是實(shí)現(xiàn)SPI_MSD0_Driver.c文件中的相關(guān)函數(shù),SPI_MSD0_Driver.c文件可以在網(wǎng)上下載,參考的程序比較多,本工程使用的這個(gè)文件也是在網(wǎng)上下載并進(jìn)行一定的修改過的。本文件中函數(shù)的實(shí)現(xiàn)方式可以參考源代碼。
五、文件系統(tǒng)測試
1、測試寫文件
測試代碼如下:
- //寫文件測試
- printf("write file test......");
- res = f_open(&fdst, "0:/test.txt", FA_CREATE_ALWAYS | FA_WRITE);
- if(res != FR_OK){
- printf("open file error : %d",res);
- }else{
- res = f_write(&fdst, textFileBuffer, sizeof(textFileBuffer), &bw); /* Write it to the dst file */
- if(res == FR_OK){
- printf("write data ok! %d",bw);
- }else{
- printf("write data error : %d",res);
- }
- /*close file */
- f_close(&fdst);
- }
復(fù)制代碼
注意:成功打開文件后一定要調(diào)用f_close()函數(shù),否則數(shù)據(jù)無法寫入SD卡中。
2、測試讀文件
- //讀文件測試
- printf("read file test......");
- res = f_open(&fsrc, "0:/test.txt", FA_OPEN_EXISTING | FA_READ);
- if(res != FR_OK){
- printf("open file error : %d",res);
- }else{
- res = f_read(&fsrc, buffer, sizeof(textFileBuffer), &br); /* Read a chunk of src file */
- if(res==FR_OK){
- printf("read data num : %d",br);
- printf("%s",buffer);
- }else{
- printf("read file error : %d",res);
- }
- /*close file */
- f_close(&fsrc);
- }
復(fù)制代碼
3、測試結(jié)果
測試結(jié)果如圖2所示。
圖2
六、中文長文件名支持
1、要支持長文件名需要在ffconf.h文件中修改兩個(gè)宏定義。如下為我們修改后的宏定義。
#define _CODE_PAGE 936
#define _USE_LFN 1 /* 0 to 3 */
2、添加支持中文編碼的文件
重新編譯會(huì)發(fā)現(xiàn)有如圖3的錯(cuò)誤。原因是要支持中文文件名需要包含另外一個(gè)文件cc936.c,該文件在FATFS文件系統(tǒng)源碼的.srcoption目錄下,將它添加到工程文件目錄FATFS中。如圖4是我們添加文件后的工程文件結(jié)構(gòu),再次編譯就通過了。如圖5所示。我們發(fā)現(xiàn)增加這個(gè)文件后代碼量增加了很多,主要原因是這個(gè)文件是我們支持中文所需要的中文編碼文件。
圖3
圖4
圖5
3、再次下載到板子中運(yùn)行,發(fā)現(xiàn)中文的長文件名顯示正常了。如圖6所示。
4、若不需要支持中文長文件名而只支持英文長文件名則可以將宏定義做如下修改:
#define _CODE_PAGE 437
#define _USE_LFN 1 /* 0 to 3 */
同時(shí)將ccsbcs.c添加到工程目錄中,這樣就可以減小很多大代碼量。將程序下載板子后再次運(yùn)行結(jié)果如圖7所示,可以看到可以支持英文的長文件名。
七、源文件下載
STM32_FATFS_SPI.rar
技術(shù)專區(qū)
評論