我是靠谱客的博主 魁梧大叔,最近开发中收集的这篇文章主要介绍移植fatfs文件系统成功 3,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

移植fatfs文件系统成功 3
 

分类: 嵌入式

2011-07-03 20:49:02

 

工程代码:  3_fatfs.rar   

参考资料: http://blog.ednchina.com/nthq2004/307859/message.aspx智林STM32开发板上移植FatFs移植
           http://blog.ednchina.com/jjldc/190753/message.aspx 九九 FatFs文件系统移植


     经过半天的学习,终于将 fatfs 移植到了stm32上,我这次移植的fatfs是最新版本 ff8b在这个网站下载      。

     移植过程介绍下:
       
其中的 diskio.c 是我自己新建的。从 前几个版本 如 ff7c 中复制过来的。 diskio.c  实现的 低级io操作的, 我们移植,也就是针对这个 文件进行修改, 将 sd_spi.h 中实现的sd卡 初始化、 read write 函数功能  在 diskio.c  中实现

 
  1. /*-----------------------------------------------------------------------*/
  2. /* Low level disk I/O module skeleton for FatFs (C)ChaN, 2007 */
  3. /*-----------------------------------------------------------------------*/
  4. /* This is a stub disk I/O module that acts as front end of the existing */
  5. /* disk I/O modules and attach it to FatFs module with common interface. */
  6. /*-----------------------------------------------------------------------*/
  7.  
  8. #include "diskio.h"
  9. #include "..Usersd_spi.h"
  10.  
  11.  
  12.  
  13. /*-----------------------------------------------------------------------*/
  14. /* Inidialize a Drive */
  15.  
  16. DSTATUS disk_initialize (
  17.     BYTE drv                /* Physical drive nmuber (0..) */
  18. )
  19. {
  20.     u8 state;
  21.  
  22.     if(drv)
  23.     {
  24.         return STA_NOINIT; //仅支持磁盘0的操作
  25.     }
  26.  
  27.     state = SD_Init();
  28.     if(state == STA_NODISK)
  29.     {
  30.         return STA_NODISK;
  31.     }
  32.     else if(state != 0)
  33.     {
  34.         return STA_NOINIT; //其他错误:初始化失败
  35.     }
  36.     else
  37.     {
  38.         return 0; //初始化成功
  39.     }
  40. }
  41.  
  42.  
  43.  
  44. /*-----------------------------------------------------------------------*/
  45. /* Return Disk Status */
  46.  
  47. DSTATUS disk_status (
  48.     BYTE drv        /* Physical drive nmuber (0..) */
  49. )
  50. {
  51.     if(drv)
  52.     {
  53.         return STA_NOINIT; //仅支持磁盘0操作
  54.     }
  55.  
  56.     //检查SD卡是否插入
  57.   // if(!SD_DET())
  58.    // {
  59.   // return STA_NODISK;
  60.   // }
  61.     return 0;
  62. }
  63.  
  64.  
  65.  
  66. /*-----------------------------------------------------------------------*/
  67. /* Read Sector(s) */
  68.  
  69. DRESULT disk_read (
  70.     BYTE drv,        /* Physical drive nmuber (0..) */
  71.     BYTE *buff,        /* Data buffer to store read data */
  72.     DWORD sector,    /* Sector address (LBA) */
  73.     BYTE count        /* Number of sectors to read (1..255) */
  74. )
  75. {
  76.     u8 res=0;
  77.     if (drv || !count)
  78.     { 
  79.         return RES_PARERR; //仅支持单磁盘操作,count不能等于0,否则返回参数错误
  80.     }
  81.   // if(!SD_DET())
  82.   // {
  83.   // return RES_NOTRDY; //没有检测到SD卡,报NOT READY错误
  84.  // }
  85.  
  86.     
  87.     
  88.     if(count==1) //1个sector的读操作 
  89.     { 
  90.         res = SD_ReadSingleBlock(sector, buff); 
  91.     } 
  92.     else //多个sector的读操作 
  93.     { 
  94.         res = SD_ReadMultiBlock(sector, buff, count);
  95.     } 
  96.     /*
  97.     do 
  98.     { 
  99.         if(SD_ReadSingleBlock(sector, buff)!=0)
  100.         { 
  101.             res = 1; 
  102.             break; 
  103.         } 
  104.         buff+=512; 
  105.     }while(--count); 
  106.     */
  107.     //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值
  108.     if(res == 0x00)
  109.     {
  110.         return RES_OK;
  111.     }
  112.     else
  113.     {
  114.         return RES_ERROR;
  115.     }
  116. }
  117.  
  118.  
  119.  
  120. /*-----------------------------------------------------------------------*/
  121. /* Write Sector(s) */
  122.  
  123. #if _READONLY == 0
  124. DRESULT disk_write (
  125.     BYTE drv,            /* Physical drive nmuber (0..) */
  126.     const BYTE *buff,    /* Data to be written */
  127.     DWORD sector,        /* Sector address (LBA) */
  128.     BYTE count            /* Number of sectors to write (1..255) */
  129. )
  130. {
  131.     u8 res;
  132.  
  133.     if (drv || !count)
  134.     { 
  135.         return RES_PARERR; //仅支持单磁盘操作,count不能等于0,否则返回参数错误
  136.     }
  137.    // if(!SD_DET())
  138.   // {
  139.   // return RES_NOTRDY; //没有检测到SD卡,报NOT READY错误
  140.  // }
  141.  
  142.     // 读写操作
  143.     if(count == 1)
  144.     {
  145.         res = SD_WriteSingleBlock(sector, buff);
  146.     }
  147.     else
  148.     {
  149.         res = SD_WriteMultiBlock(sector, buff, count);
  150.     }
  151.     // 返回值转换
  152.     if(res == 0)
  153.     {
  154.         return RES_OK;
  155.     }
  156.     else
  157.     {
  158.         return RES_ERROR;
  159.     }
  160. }
  161. #endif /* _READONLY */
  162.  
  163.  
  164.  
  165. /*-----------------------------------------------------------------------*/
  166. /* Miscellaneous Functions */
  167.  
  168. DRESULT disk_ioctl (
  169.     BYTE drv,        /* Physical drive nmuber (0..) */
  170.     BYTE ctrl,        /* Control code */
  171.     void *buff        /* Buffer to send/receive control data */
  172. )
  173. {
  174.     DRESULT res;
  175.  
  176.  
  177.     if (drv)
  178.     { 
  179.         return RES_PARERR; //仅支持单磁盘操作,否则返回参数错误
  180.     }
  181.     
  182.     //FATFS目前版本仅需处理CTRL_SYNC,GET_SECTOR_COUNT,GET_BLOCK_SIZ三个命令
  183.     switch(ctrl)
  184.     {
  185.     case CTRL_SYNC:
  186.         SD_CS_ENABLE();
  187.         if(SD_WaitReady()==0)
  188.         {
  189.             res = RES_OK;
  190.         }
  191.         else
  192.         {
  193.             res = RES_ERROR;
  194.         }
  195.         SD_CS_DISABLE();
  196.         break;
  197.         
  198.     case GET_BLOCK_SIZE:
  199.         *(WORD*)buff = 512;
  200.         res = RES_OK;
  201.         break;
  202.  
  203.     case GET_SECTOR_COUNT:
  204.         *(DWORD*)buff = SD_GetCapacity();
  205.         res = RES_OK;
  206.         break;
  207.     default:
  208.         res = RES_PARERR;
  209.         break;
  210.     }
  211.  
  212.     return res;
  213. }
  214.  
  215.  
  216. /*-----------------------------------------------------------------------*/
  217. /* User defined function to give a current time to fatfs module */
  218. /* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */ 
  219. /* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */ 
  220. DWORD get_fattime (void)
  221. {
  222.   // struct tm t;
  223.   // DWORD date;
  224.   // t = Time_GetCalendarTime();
  225.   // t.tm_year -= 1980;        //年份改为1980年起
  226.   // t.tm_mon++;     //0-11月改为1-12月
  227.   // t.tm_sec /= 2;     //将秒数改为0-29
  228.     
  229.   // date = 0;
  230.   // date = (t.tm_year << 25)|(t.tm_mon<<21)|(t.tm_mday<<16)|
  231.   // (t.tm_hour<<11)|(t.tm_min<<5)|(t.tm_sec);
  232.  
  233.    // return date;
  234.    return 0;
  235. }
程序的测试代码:
    
  1. /* 
  2. *    Author :     余威先
  3. *    Date:         2011.6.19    
  4. * 开发板上:PD2 ~ LED2
  5. * PA8 ~ LED0
  6. * PA15 ~ KEY1
  7. * PA13 ~ KEY2
  8. * 修改Date: 2011.6.30 19:20
  9. * rcc时钟配置: SYSCLK = 16MHZ
  10. * AHB = 16MHZ
  11. *              APB1 = 8 MHZ // TIM2 TIM3 TIM4
  12. *                 APB2 = 16 MHZ //GPIO A B C D
  13. * 修改Date:2011.7.3 21:00
  14.     简单描述:
  15.      移植 fatfs 成功 ff8b
  16.      
  17. */
  18. #include "stm32f10x.h"
  19. #include "rcc.h"
  20. #include "systick.h"
  21. #include "led.h"
  22. #include "delay.h"
  23. //#include "key.h"
  24. #include "tim3.h"
  25. #include "usart1.h"
  26. #include "lcd.h"
  27. #include "rtc.h"
  28. #include "flash.h"
  29. #include "sd_spi.h"
  30. #include "..FATSff.h"
  31. #include "..FATSinteger.h"
  32. #include "..FATSffconf.h"
  33. #include "..FATSdiskio.h"
  34.  
  35. volatile u8 sec = 0; // 全局变量 秒 时 小时
  36. volatile u8 min = 0;
  37. volatile u8 hour = 0;
  38.  
  39. FATFS fs;
  40. FRESULT res;
  41. FIL file;
  42.  
  43. u8 send_buffer[512] = {97,6};
  44. u8 receiv_buffer[512] = {0,0};
  45. u32 capacity = 0;
  46. void write_file(void);
  47.  
  48. int main(void)
  49. {    
  50.     u16 i = 0;//
  51.  
  52.     RCC_Configuration(); //系统时钟配置
  53.     delay_init();     // 延时 初始化
  54.  
  55. //    RTC_Configuration(); //RTC系统 配置
  56. //    RTC_NVIC_Configuration(); //RTC中断配置
  57. //    RTC_Init();// RTC 时钟初始化
  58.  
  59.     SPI1_Configuration(); //SPI1 初始化
  60. //    SD_Init();             //SD卡 初始化
  61.  
  62.     LCD_Init();         //LCD 彩屏初始化
  63.  
  64.     write_cmd(0x2C); //LCD 写数据命令
  65.     DrawFull_single_colour(0xff, 0xff);    //显示 纯白色 
  66.  
  67.     capacity = SD_GetCapacity();    //获取 容量
  68.     LCD_show_number(48,128,capacity); //打印低16位
  69.     LCD_show_number(0,128,capacity>>16); //打印高16位
  70.  
  71.     LCD_PutString(0,0, "start to write file..");
  72.     write_file();
  73. #if 0
  74.     for(= 0; i < 256; i++) //发送数据填充
  75.         send_buffer[i] = i;    
  76.     
  77.     for(= 0; i < 256; i++) //发送数据填充
  78.         send_buffer[+ 256] = i;    
  79.  
  80.     SD_WriteSingleBlock(0, send_buffer); //写数据到 块 中
  81.     SD_ReadSingleBlock(0, receiv_buffer); //从 块 中 读数据
  82.  
  83.     for(= 0; i < 512; i++) // 显示从块中读取到的数据, 一个字节最大255
  84.     {
  85.         LCD_show_number(8,32,receiv_buffer[i]);
  86.         delay_s(1);
  87.     }
  88. #endif
  89.  
  90.     while(1) //无限循环, 中断中 显示 秒时钟
  91.     {
  92.         #if 0
  93.         LCD_show_number_2(40,16,hour);
  94.         LCD_show_number_2(64,16,min);
  95.         LCD_show_number_2(88,16,sec);    
  96.         #endif
  97.     }
  98.     return 0;
  99. }
  100.  
  101.  
  102. void write_file(void)
  103. {
  104.        UINT br;
  105.     u16 i;
  106.     s8 data[512];
  107.     for(i=0;i<10;i++)
  108.     {
  109.         data[i] = 'o';
  110.     }
  111.     for(i=10;i<20;i++)
  112.     {
  113.         data[i] = 'p';
  114.     }
  115.     for(i=20;i<30;i++)
  116.     {
  117.         data[i] = 'q';
  118.     }
  119.     data[30]='n';
  120.  
  121.     res = f_mount(0, &fs);
  122.     if(res != 0)
  123.         LCD_PutString(0,16, "f_mount failed.");
  124.     else
  125.         LCD_PutString(0,16, "f_mount successed.");
  126.  
  127.     res = f_open(&file, "test.txt", FA_CREATE_ALWAYS | FA_WRITE);
  128.     if(res != 0)
  129.         LCD_PutString(0,32, "f_open failed.");
  130.     else
  131.         LCD_PutString(0,32, "f_open successed."); 
  132.          
  133.     res = f_write(&file, data, 512, &br); 
  134.     if(res != 0)
  135.         LCD_PutString(0,48, "f_write failed.");
  136.     else
  137.         LCD_PutString(0,48, "f_write successed.");
  138.               
  139.     f_close(&file);
  140.         LCD_PutString(0,64, "f_close successed."); 
  141. }
  142.  
  143. void RTC_IRQHandler(void) //中断函数
  144. {
  145.     if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
  146.     {
  147.         RTC_ClearITPendingBit(RTC_IT_SEC);//清除 RTC秒中断标志
  148.         sec ++;// 定义的全局变量
  149.         if(sec ==60)
  150.         {
  151.             sec = 0;
  152.             min ++;
  153.             if(min == 60)
  154.             {
  155.                 min = 0;
  156.                 hour++;
  157.                 if(hour==12)
  158.                     hour = 0;
  159.             }
  160.         }    
  161.         RTC_WaitForLastTask();//等待就绪 
  162.     }    
  163. }
  164.  


SD卡写入后 的文件



在 winhex 下 显示

最后

以上就是魁梧大叔为你收集整理的移植fatfs文件系统成功 3的全部内容,希望文章能够帮你解决移植fatfs文件系统成功 3所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部