硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1203|回复: 3
收起左侧

[FatFs] freeRTOS+LVGL+FatFs+SD卡+电阻屏,读取文件的时候概率出错。报FR_DISK_ERR

[复制链接]

3

主题

16

回帖

25

积分

新手上路

积分
25
发表于 2024-7-5 19:18:58 | 显示全部楼层 |阅读模式
如题,最近想做一个随身听。用的stm32F407。

跑在freeRTOS上,开了个Fatfs+SDIO读SD卡里的wav文件,然后加了一个电阻屏。驱动直接用的正点原子的。
我开了一个音频播放任务来给读SD卡文件发给DAC芯片,用的I2S+DMA双缓冲,如果我单独运行这个任务是没问题的,播放正常,
一旦我开启GUI任务(里面有lv_task_handler()和触屏扫描函数),播放不固定时间后会声音会卡主,像被阻塞了。一段时间后f_read函数报FR_DISK_ERR错误,紧接着进入hardfault中断。
我试着把lvgl关了只开触屏扫描函数,发现我一旦触摸屏幕后声音就开始卡顿,松开后播放正常。
我试着把GUI任务优先级调低,之后声音不会卡了,但是在播放期间触屏划线的时候发现画得出来的线断断续续。

[mw_shl_code=c,true]// 播放音频任务
void StartDataTask(void *argument)
{
  /* init code for USB_DEVICE */
        osDelay(1000);
        InitFatFas();
        scan_music_file();
        PlayDemo(1);
  /* USER CODE BEGIN StartDataTask */
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END StartDataTask */
}

// GUI任务
void StartLCDTask(void *argument)
{
  /* USER CODE BEGIN StartLCDTask */
        osDelay(1000);
        osStatus_t xReturn;
        delay_init();
       
        lcd_init();
        tp_dev.init();       
        /* LVGL初始化+UI显示 */
#if 1
        // 开互斥锁
        xReturn=osMutexAcquire(myMutex01Handle,portMAX_DELAY);
        lv_init();
        lv_port_disp_init();  // lvgl显示接口初始化,放在lv_init()的后面
        lv_port_indev_init(); // lvgl输入接口初始化,放在lv_init()的后面
//        lv_demo_keypad_encoder();
//        lv_mydemo_1();
        setup_ui(&guider_ui);
        events_init(&guider_ui);
        // 释放互斥锁
xReturn=osMutexRelease(myMutex01Handle);
#endif

  /* Infinite loop */
  for(;;)
  {
          
#if 1
        // 开互斥锁
        xReturn=osMutexAcquire(myMutex01Handle,portMAX_DELAY);
        tp_dev.scan(0);
        lv_task_handler();
          
        // 释放互斥锁
        xReturn=osMutexRelease(myMutex01Handle);
          
#endif
    osDelay(15);
          
  }
  /* USER CODE END StartLCDTask */
}[/mw_shl_code
回复

使用道具 举报

3

主题

16

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2024-7-6 00:39:07 | 显示全部楼层
更新:经过测试,发现触摸扫描函数并不会影响音频(之前出问题的原因是扫描过快,我适当加了一些延迟后就好了)。我把其他所有东西都删掉(包括触摸扫描函数)只留下lv_task_handler(),发现音频依旧会卡死。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2024-7-6 09:09:58 | 显示全部楼层
Icathia_7 发表于 2024-7-6 00:39
更新:经过测试,发现触摸扫描函数并不会影响音频(之前出问题的原因是扫描过快,我适当加了一些延迟后就好 ...

报FR_DISK_ERR错误

static const char * FR_Table[]=
{
    "FR_OK:成功",                                      /* (0) Succeeded */
    "FR_DISK_ERR:底层硬件错误",                      /* (1) A hard error occurred in the low level disk I/O layer */
    "FR_INT_ERR:断言失败",                              /* (2) Assertion failed */
    "FR_NOT_READY:物理驱动没有工作",                  /* (3) The physical drive cannot work */
    "FR_NO_FILE:文件不存在",                          /* (4) Could not find the file */
    "FR_NO_PATH:路径不存在",                          /* (5) Could not find the path */
    "FR_INVALID_NAME:无效文件名",                      /* (6) The path name format is invalid */
    "FR_DENIED:由于禁止访问或者目录已满访问被拒绝",  /* (7) Access denied due to prohibited access or directory full */
    "FR_EXIST:由于访问被禁止访问被拒绝",              /* (8) Access denied due to prohibited access */
    "FR_INVALID_OBJECT:文件或者目录对象无效",          /* (9) The file/directory object is invalid */
    "FR_WRITE_PROTECTED:物理驱动被写保护",              /* (10) The physical drive is write protected */
    "FR_INVALID_DRIVE:逻辑驱动号无效",                  /* (11) The logical drive number is invalid */
    "FR_NOT_ENABLED:卷中无工作区",                      /* (12) The volume has no work area */
    "FR_NO_FILESYSTEM:没有有效的FAT卷",              /* (13) There is no valid FAT volume */
    "FR_MKFS_ABORTED:由于参数错误f_mkfs()被终止",             /* (14) The f_mkfs() aborted due to any parameter error */
    "FR_TIMEOUT:在规定的时间内无法获得访问卷的许可",         /* (15) Could not get a grant to access the volume within defined period */
    "FR_LOCKED:由于文件共享策略操作被拒绝",                 /* (16) The operation is rejected according to the file sharing policy */
    "FR_NOT_ENOUGH_CORE:无法分配长文件名工作区",             /* (17) LFN working buffer could not be allocated */
    "FR_TOO_MANY_OPEN_FILES:当前打开的文件数大于_FS_SHARE", /* (18) Number of open files > _FS_SHARE */
    "FR_INVALID_PARAMETER:参数无效"                         /* (19) Given parameter is invalid */
};
回复

使用道具 举报

34

主题

206

回帖

308

积分

高级会员

积分
308
发表于 2024-7-6 09:18:13 | 显示全部楼层
试试调整DMA优先级呢
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 00:35 , Processed in 0.039524 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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