找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2700|回复: 3
收起左侧

移植UCOSIII和FATS到IAR工程,芯片STM32F407,最终可以在串口打印写入SD卡文件

[复制链接]
ID:443686 发表于 2018-12-10 22:22 | 显示全部楼层 |阅读模式
步骤:(1)从ST官网下载stm32F4例程(自带有USOIII3.04)。           (3)根据芯片手册修改部分底层BSP。
            (4)添加任务,配置任务参数(优先级、堆栈等)。
             (5)书写主函数。
             (6)编译,串口调试。
0.png

单片机源程序如下:
  1. #include"myfatapp.h"

  2. /****************************************************************************
  3. * Function Name  : FATFS_GetFree
  4. * Description    : 读取总磁盘大小和空闲磁盘大小
  5. * Input          : drv:磁盘编号
  6. *                * total:保存读取到的总磁盘大小
  7. *                * free:保存读取到的空闲磁盘大小
  8. * Output         : None
  9. * Return         : res:读取状态。0:成功;其他则是其他相应的错误信息。
  10. ****************************************************************************/

  11. uint8_t FATFS_GetFree(uint8_t *drv, uint32_t *total, uint32_t *free)
  12. {
  13.         FATFS *fs1;
  14.         u8 res;
  15.     DWORD fre_clust=0, fre_sect=0, tot_sect=0;

  16.     /* 得到磁盘信息及空闲簇数量 */
  17.     res = f_getfree((const TCHAR*)drv, &fre_clust, &fs1);

  18.     if(res == 0)  //表示读取成功
  19.         {                                                                                          
  20.             tot_sect = (fs1->n_fatent-2) * fs1->csize;        //得到总扇区数
  21.             fre_sect = fre_clust * fs1->csize;                        //得到空闲扇区数
  22.                            
  23. #if _MAX_SS!=512                        //扇区大小不是512字节,则转换为512字节
  24.                 tot_sect *= fs1->ssize/512;
  25.                 fre_sect *= fs1->ssize/512;
  26. #endif         

  27.                 *total = tot_sect >> 1;        //单位为KB
  28.                 *free = fre_sect >> 1;        //单位为KB
  29.         }

  30.         return res;        
  31. }

  32. /****************************************************************************
  33. * Function Name  : FATFS_ScanFiles
  34. * Description    : 读取指定文件下所有文件的名字和后缀
  35. * Input          : dir:扫描的文件路径
  36. *                * file:用来存放所有文件的名字和后缀的地址
  37. * Output         : None
  38. * Return         : res:返回读取的状态
  39. ****************************************************************************/

  40. uint8_t FATFS_ScanFiles(uint8_t *dir, FileNameTypeDef *file)
  41. {
  42.         FRESULT res;
  43.         FILINFO  fileInfo;
  44.         DIR dirs;
  45.         char *fn, i = 0;

  46. #if _USE_LFN
  47.     static char lfn[_MAX_LFN + 1];   /* Buffer to store the LFN */
  48.     fileInfo.lfname = lfn;
  49.     fileInfo.lfsize = sizeof(lfn);
  50. #endif
  51.         /* 打开文件夹 */
  52.         res = f_opendir(&dirs, (const TCHAR*)dir);
  53.         
  54.         if (res == FR_OK)    //成功打开文件夹
  55.         {   
  56.                 while (f_readdir(&dirs, &fileInfo) == FR_OK)   //按照顺序读文件夹
  57.                 {         
  58.                         if(!fileInfo.fname[0])           //如果文件名为0,结束
  59.                         {
  60.                                 break;     
  61.                         }         
  62.                         
  63.                         /* 判断文件属性 */                                                               
  64.                         if((fileInfo.fattrib == AM_ARC)|(fileInfo.fattrib == AM_DIR))
  65.                         {

  66. #if _USE_LFN        //为长字符串名准备
  67.                     fn = *fileInfo.lfname ? fileInfo.lfname : fileInfo.fname;
  68. #else
  69.                             fn = fileInfo.fname;
  70. #endif

  71.                                 /* 读取名字 */
  72.                                 i = 0;
  73.                                while((*fn != '.') && (*fn != '\0')) //有一个成立就跳出循环
  74.                                 {
  75.                                         file->name[i] = *fn;
  76.                                         i++;
  77.                                         fn++;        
  78.                                 }

  79.                                 /* 读取后缀 */
  80.                                 i = 0;
  81.                                 while(*fn != '\0')
  82.                                 {
  83.                                         file->type[i] = *fn;
  84.                                         i++;
  85.                                         fn++;
  86.                                 }
  87.                                 file++;
  88.                         }//end of 文件属性判断呢
  89.                 } //end of while (f_readdir(&dirs, &fileInfo) == FR_OK)//按照顺序读文件夹
  90.         }
  91.         return res;
  92. }
复制代码

所有资料51hei提供下载:
FATS.rar (3.08 MB, 下载次数: 63)
回复

使用道具 举报

ID:355227 发表于 2019-4-8 22:36 | 显示全部楼层
很棒的范例 谢谢
回复

使用道具 举报

ID:229137 发表于 2022-7-5 09:58 | 显示全部楼层
正在寻找,fats版本是0.8的
回复

使用道具 举报

ID:340817 发表于 2023-3-23 18:59 | 显示全部楼层
很棒的范例 谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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