找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3038|回复: 1
打印 上一主题 下一主题
收起左侧

STM32 fats0.13a SDIO移植成功代码

[复制链接]
跳转到指定楼层
楼主
ID:276663 发表于 2018-3-2 09:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
根据论坛的帖子http://www.51hei.com/bbs/dpj-88507-1.html
自己移植了最新版FATS  0.13a
测试成功,可以读写文件,追加文件。
部分代码如下
  1. void SD_ReadTest(void)
  2. {
  3.     unsigned int offset = 0;
  4.     disk_initialize(DEV_MMC);
  5.     res = f_mount(&fs,"1:",0);    // 挂载
  6.     res = f_open(&fsrc,"1:/KILLL.BAT",FA_OPEN_EXISTING | FA_READ); // 打开文件
  7.     if(res != FR_OK)
  8.     {
  9.         printf("%d ",res);
  10.         printf("open error\r\n");
  11.     }
  12.     else
  13.     {               
  14.         file_size = f_size(&fsrc);               
  15.         printf("filesize:%d\r\n",file_size);
  16.         do{
  17.             res = f_lseek(&fsrc,offset);   // 指针往后推128
  18.             res = f_read(&fsrc,buffer,sizeof(buffer),&br);   
  19.             if(res == FR_OK)
  20.             {                     
  21.                 USART1_SendBuf(buffer,br);
  22.                 printf("\r\n");        
  23.             }
  24.             else
  25.             {
  26.                 printf("read fils err\r\n");
  27.             }
  28.             offset += 128;            
  29.             file_size -= 128;
  30.         }while(file_size>128);
  31.         if(file_size>0)
  32.         {
  33.             res = f_read(&fsrc,buffer,file_size,&br);   
  34.             if(res == FR_OK)
  35.             {                     
  36.                 USART1_SendBuf(buffer,br);               
  37.                 printf("EndOfFile\r\n");        
  38.             }
  39.             else
  40.             {
  41.                 printf("read fils err\r\n");
  42.             }
  43.         }
  44.         f_close(&fsrc);// 关闭文件
  45.     }
  46.     f_mount(NULL,"1:",0); //卸载磁盘
  47. }   
复制代码
获取文件长度并串口输出文件内容,适用于读取bin文件做系统软件升级IAP.


  1. FRESULT open_append (
  2.     FIL* fp,            /* [OUT] File object to create */
  3.     const char* path    /* [IN]  File name to be opened */
  4. )
  5. {
  6.     FRESULT fr;

  7.     /* Opens an existing file. If not exist, creates a new file. */
  8.     fr = f_open(fp, path, FA_WRITE | FA_OPEN_ALWAYS);
  9.     if (fr == FR_OK) {
  10.         /* Seek to end of the file to append data */
  11.         fr = f_lseek(fp, f_size(fp));
  12.         if (fr != FR_OK)
  13.             f_close(fp);
  14.     }
  15.     return fr;
  16. }

  17. void SD_WriteTest(void)
  18. {
  19.     unsigned char write_f[20]={"ming write file test"};
  20.     disk_initialize(0);
  21.     res = f_mount(&fs,"1:",0);  
  22.     res = open_append(&fdst,"1:/testa.txt");
  23.    
  24.   //  res = f_open(&fdst, "1:/testa.txt", FA_CREATE_ALWAYS | FA_WRITE);   
  25.     if(res != FR_OK)
  26.     {
  27.         printf("open error\r\n");
  28.     }
  29.     else
  30.     {
  31.         f_printf(&fdst, "%d\n", runtime);  
  32.         //res = f_write(&fdst,write_f,sizeof(write_f),&bw);
  33.         //res = f_puts("hello",&fdst);
  34.         if(res <0)
  35.         {
  36.             printf("write err! %d\r\n",res);                       
  37.         }
  38.         else
  39.         {
  40.             printf("write ok! %d\r\n",res);   
  41.         }
  42.         f_close(&fdst);
  43.     }
  44.     f_mount(NULL,"1:",0);// 卸载
  45.     printf("write test passed! \r\n");
  46. }
复制代码
文件内容追加,适合保存日志log


  1. void ReadSDFile(void)
  2. {
  3. //  FIL file;
  4.   FILINFO finfo;
  5.   DIR dirs;
  6.   int i_name=0;
  7. //  char *fn;
  8.   f_mount(&fs,"1:",1);
  9.   res =  f_opendir(&dirs, "1:/");
  10.   if (res == FR_OK)
  11.   {
  12.     while (f_readdir(&dirs, &finfo) == FR_OK)
  13.         {
  14.           if (finfo.fattrib & AM_ARC)
  15.       {
  16.         if(!finfo.fname[0])        break;  //文件名不为空,如果为空,则表明该目录下面的文件已经读完了                           
  17.                 stringcopy(buff_filename[i_name], (BYTE*)finfo.fname);
  18.                 i_name++;
  19.         file_cnt = i_name;        
  20.           }
  21.         }
  22.     f_close(&fsrc);
  23.     i_name = 0;
  24.     do{        
  25.         //USART1_SendBuf(buff_filename[i_name],br);               
  26.         printf("%s\r\n",buff_filename[i_name]);           
  27.         i_name++;
  28.         file_cnt--;
  29.     }while(file_cnt);
  30.   }
  31.   f_mount(NULL,"1:",1);
  32. }
复制代码
获取文件列表。

STM32_SDIO_FAT13.zip (1.44 MB, 下载次数: 39)

如果需要解压密码,请双击压缩包或右键压缩包查看注释。

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:654855 发表于 2021-4-25 22:57 | 只看该作者
这个是单线的SDIO,且是MMC卡,如果是4线,8线SDIO,DMA操作,SD卡都需要自行修改
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表