OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 110|回复: 1

FATFS功能中fopen函数运行异常

[复制链接]

9

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
570
金钱
570
注册时间
2016-3-1
在线时间
84 小时
发表于 2025-5-25 09:57:21 | 显示全部楼层 |阅读模式
50金钱
本帖最后由 feiyinglala 于 2025-5-25 10:01 编辑

背景:STM32F429,使用SDIO端口驱动SD卡问题和现象:
1.在main函数中SD卡初始化、往里边写TXT都是正常的
2.在我自己的数据记录函数初始化中,同样的语句,就运行不下去了,用仿真跟踪发现在f_open()函数跑飞的,仿真进去参数对比如下图

main-csv.png

主函数代码如下
  1. while(SD_Init())        //检测不到SD卡
  2.         {//SD_Init 中后续若需要,添加DMA代码
  3.     printf("SD Card Error!\r\n");
  4.         }
  5.         show_sdcard_info();        //打印SD卡相关信息

  6.         usmart_dev.init(84);                //初始化USMART【FAT用】初始化串口控制器84MHz
  7.         exfuns_init();                                                        //【要】为fatfs相关变量申请内存(为每个磁盘、FILE/FTEMP/FATBUF各申请一块内存)
  8.           f_mount(fs[0],"0:",1);                                         //【要】挂载SD卡                         来自ff.c
  9.          FAT_res=f_mount(fs[1],"1:",1);                         //挂载FLASH.                 来自ff.c
  10.         if(FAT_res==0X0D)//FLASH磁盘,FAT文件系统错误,重新格式化FLASH
  11.         {
  12.                 FAT_res=f_mkfs("1:",1,4096);//格式化FLASH,1,盘符;1,不需要引导区,8个扇区为1个簇
  13.                 if(FAT_res==0)
  14.                 {
  15.                         f_setlabel((const TCHAR *)"1:ALIENTEK");        //设置Flash磁盘的名字为:ALIENTEK
  16. }else
  17.                 Delay_ms(1000);
  18.         }                                                                                                            
  19. <blockquote>res=f_open(&fil,"0:/message20250524.txt",FA_CREATE_ALWAYS|FA_WRITE);
复制代码
数据记录函数初始化
  1. // 初始化SD卡日志系统
  2. void SDLogger_Init(void) {
  3.     FRESULT res;
  4.         FIL fil_CSV;
  5.     char filename[32];
  6.     uint32_t counter = 0;
  7.    
  8.         res=f_open(&fil_CSV,"0:/message20250526.txt",FA_CREATE_ALWAYS|FA_WRITE);
  9.         f_write(&fil_CSV,"Hello Fatfs!Welcome to your UAV trip! CSV\r\n",41,&bw);        //文件指针、写入数据指针、字符数、
  10.         f_close(&fil_CSV);
  11.         }
复制代码



fopen函数代码如下
  1. FRESULT f_open (
  2.         FIL* fp,                        /* Pointer to the blank file object */
  3.         const TCHAR* path,        /* Pointer to the file name */
  4.         BYTE mode                        /* Access mode and file open mode flags */
  5. )
  6. {
  7.         FRESULT res;
  8.         DIR dj;
  9.         BYTE *dir;
  10.         DEF_NAMEBUF;


  11.         if (!fp) return FR_INVALID_OBJECT;
  12.         fp->fs = 0;                        /* Clear file object */

  13.         /* Get logical drive number */
  14. #if !_FS_READONLY
  15.         mode &= FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW;
  16.         res = find_volume(&dj.fs, &path, (BYTE)(mode & ~FA_READ));
  17. #else
  18.         mode &= FA_READ;
  19.         res = find_volume(&dj.fs, &path, 0);
  20. #endif
  21.         if (res == FR_OK) {
  22.                 INIT_BUF(dj);
  23.                 res = follow_path(&dj, path);        /* Follow the file path */
  24.                 dir = dj.dir;
  25. #if !_FS_READONLY        /* R/W configuration */
  26.                 if (res == FR_OK) {
  27.                         if (!dir)        /* Default directory itself */
  28.                                 res = FR_INVALID_NAME;
  29. #if _FS_LOCK
  30.                         else
  31.                                 res = chk_lock(&dj, (mode & ~FA_READ) ? 1 : 0);
  32. #endif
  33.                 }
  34.                 /* Create or Open a file */
  35.                 if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) {
  36.                         DWORD dw, cl;

  37.                         if (res != FR_OK) {                                        /* No file, create new */
  38.                                 if (res == FR_NO_FILE)                        /* There is no file to open, create a new entry */
  39. #if _FS_LOCK
  40.                                         res = enq_lock() ? dir_register(&dj) : FR_TOO_MANY_OPEN_FILES;
  41. #else
  42.                                         res = dir_register(&dj);
  43. #endif
  44.                                 mode |= FA_CREATE_ALWAYS;                /* File is created */
  45.                                 dir = dj.dir;                                        /* New entry */
  46.                         }
  47.                         else {                                                                /* Any object is already existing */
  48.                                 if (dir[DIR_Attr] & (AM_RDO | AM_DIR)) {        /* Cannot overwrite it (R/O or DIR) */
  49.                                         res = FR_DENIED;
  50.                                 } else {
  51.                                         if (mode & FA_CREATE_NEW)        /* Cannot create as new file */
  52.                                                 res = FR_EXIST;
  53.                                 }
  54.                         }
  55.                         if (res == FR_OK && (mode & FA_CREATE_ALWAYS)) {        /* Truncate it if overwrite mode */
  56.                                 dw = get_fattime();                                /* Created time */
  57.                                 ST_DWORD(dir+DIR_CrtTime, dw);
  58.                                 dir[DIR_Attr] = 0;                                /* Reset attribute */
  59.                                 ST_DWORD(dir+DIR_FileSize, 0);        /* size = 0 */
  60.                                 cl = ld_clust(dj.fs, dir);                /* Get start cluster */
  61.                                 st_clust(dir, 0);                                /* cluster = 0 */
  62.                                 dj.fs->wflag = 1;
  63.                                 if (cl) {                                                /* Remove the cluster chain if exist */
  64.                                         dw = dj.fs->winsect;
  65.                                         res = remove_chain(dj.fs, cl);
  66.                                         if (res == FR_OK) {
  67.                                                 dj.fs->last_clust = cl - 1;        /* Reuse the cluster hole */
  68.                                                 res = move_window(dj.fs, dw);
  69.                                         }
  70.                                 }
  71.                         }
  72.                 }
  73.                 else {        /* Open an existing file */
  74.                         if (res == FR_OK) {                                        /* Follow succeeded */
  75.                                 if (dir[DIR_Attr] & AM_DIR) {        /* It is a directory */
  76.                                         res = FR_NO_FILE;
  77.                                 } else {
  78.                                         if ((mode & FA_WRITE) && (dir[DIR_Attr] & AM_RDO)) /* R/O violation */
  79.                                                 res = FR_DENIED;
  80.                                 }
  81.                         }
  82.                 }
  83.                 if (res == FR_OK) {
  84.                         if (mode & FA_CREATE_ALWAYS)                /* Set file change flag if created or overwritten */
  85.                                 mode |= FA__WRITTEN;
  86.                         fp->dir_sect = dj.fs->winsect;                /* Pointer to the directory entry */
  87.                         fp->dir_ptr = dir;
  88. #if _FS_LOCK
  89.                         fp->lockid = inc_lock(&dj, (mode & ~FA_READ) ? 1 : 0);
  90.                         if (!fp->lockid) res = FR_INT_ERR;
  91. #endif
  92.                 }

  93. #else                                /* R/O configuration */
  94.                 if (res == FR_OK) {                                        /* Follow succeeded */
  95.                         dir = dj.dir;
  96.                         if (!dir) {                                                /* Current directory itself */
  97.                                 res = FR_INVALID_NAME;
  98.                         } else {
  99.                                 if (dir[DIR_Attr] & AM_DIR)        /* It is a directory */
  100.                                         res = FR_NO_FILE;
  101.                         }
  102.                 }
  103. #endif
  104.                 FREE_BUF();

  105.                 if (res == FR_OK) {
  106.                         fp->flag = mode;                                        /* File access mode */
  107.                         fp->err = 0;                                                /* Clear error flag */
  108.                         fp->sclust = ld_clust(dj.fs, dir);        /* File start cluster */
  109.                         fp->fsize = LD_DWORD(dir+DIR_FileSize);        /* File size */
  110.                         fp->fptr = 0;                                                /* File pointer */
  111.                         fp->dsect = 0;
  112. #if _USE_FASTSEEK
  113.                         fp->cltbl = 0;                                                /* Normal seek mode */
  114. #endif
  115.                         fp->fs = dj.fs;                                                 /* Validate file object */
  116.                         fp->id = fp->fs->id;
  117.                 }
  118.         }

  119.         LEAVE_FF(dj.fs, res);
  120. }
复制代码




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
570
金钱
570
注册时间
2016-3-1
在线时间
84 小时
 楼主| 发表于 2025-5-25 10:04:28 | 显示全部楼层
我应该重点排查哪块,仿真跟踪了半天,还是没抓住重点
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-2 20:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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