OpenEdv-开源电子网

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

CubeMX生成SD卡的fatfs应用,拔下sd卡再次插入不能挂载,怎么解决?

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-3-27
在线时间
4 小时
发表于 2018-11-5 16:15:48 | 显示全部楼层 |阅读模式
1金钱
    CubeMX生成SD卡的fatfs应用,拔下sd卡再次插入不能挂载,怎么解决?
    各位大神紧急求助,我使用CubeMX生成SD卡的fatfs应用主函数代码如下:

int main(void)
{
  /* USER CODE BEGIN 1 */
        #define MP3_PATH        "0:/1"
        FRESULT result;
        uint32_t bw;
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
       
  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SDIO_SD_Init();
  MX_FATFS_Init();
  MX_USART1_UART_Init();
  MX_SPI1_Init();
  MX_I2C2_Init();
  MX_ETH_Init();
  /* USER CODE BEGIN 2 */
       
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
                HAL_GPIO_TogglePin(STATUS_GPIO_Port,STATUS_Pin);
                if (!HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin))
                {
                        if (f_mount(&fs, "0:", 1) != FR_OK)
                        {
                                printf("文件系统挂载失败!\r\n");
                        }
                        else
                        {
                                #ifdef debug
                                printf("挂载了文件\r\n");
                                #endif
                        }
                        sprintf(path, "%s", MP3_PATH);
                        result = f_opendir(&DirInf, path);         /* path可以带盘符,最后一个字符不能是/ */
                        if (result != FR_OK)
                        {
                                printf("f_opendir Error\r\n");
                        }
                        else
                        {
                                printf("f_opendir OK   \r\n");
                        }
                        /* 打开MUSIC目录下的mp3 文件 */
                        sprintf(FileName, "%s/%s", MP3_PATH, "026Drive By.mp3");
                        result = f_open(&file, FileName,  FA_READ);
                        if (result !=  FR_OK)
                        {                               
                                printf("f_open Error\r\n");
                        }
                        else
                        {
                                printf("f_open OK   \r\n");
                        }
                        result = f_read(&file, &buff[0], 1, &bw); //预读
                        if (result !=  FR_OK)
                        {                               
                                printf("f_read Error\r\n");
                        }
                        else
                        {
                                printf("f_read OK   \r\n");
                        }
                }
                HAL_Delay(5000);
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

插入SD卡时上电运行可以正常挂载/打开/读写文件,但是把下SD卡后就不能挂载/打开/读写文件了。请大神帮忙看看。
我抄袭大哥的代码(原子哥)按照上述流程编写的代码拔出SD卡后再次插入就能挂载,大哥代码用的是标准库,CubeMX生成的是代码是HAL库,这两个库有什么不同吗?还是我哪里没注意到?抄袭大哥的代码如下:

#define MP3_PATH        "0:/1"

int main(void)
{        
        u8 key;                 
        u32 sd_size;
        u8 t=0,kkey=0;       
        u8 *buf;
       
        FRESULT result;
        char path[64];
        char FileName[80];
        uint8_t buff[2][6];

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);  //初始化延时函数
        uart_init(115200);                //初始化串口波特率为115200
        LED_Init();                                        //初始化LED  

        KEY_Init();                                        //按键初始化  

        while(SD_Init())//检测不到SD卡
        {
                printf("SD Card Error!\r\n");
                delay_ms(500);                                       
                printf("Please Check! \r\n");
                delay_ms(500);
                LED0=!LED0;//DS0闪烁
        }
        delay_ms(5000);               
        while(1)
        {
                kkey=KEY_Scan(0);
                if(4==kkey)
                {
                        /* 打开歌曲目录 */
                        result=f_mount(&fs,"0:",1);                                         //挂载SD卡
                        if (result != FR_OK)
                        {
                                printf("f_mount Error\r\n");
                        }
                        else
                        {
                                printf("f_mount OK   \r\n");
                        }
                        sprintf(path, "%s", MP3_PATH);
                        result = f_opendir(&dir, path);         /* path可以带盘符,最后一个字符不能是/ */
                        if (result != FR_OK)
                        {
                                printf("f_opendir Error\r\n");
                        }
                        else
                        {
                                printf("f_opendir OK   \r\n");
                        }
                        /* 打开MUSIC目录下的mp3 文件 */
                        sprintf(FileName, "%s/%s", MP3_PATH, "026Drive By.mp3");
                        result = f_open(&file, FileName,  FA_READ);
                        if (result !=  FR_OK)
                        {                               
                                printf("f_open Error\r\n");
                        }
                        else
                        {
                                printf("f_open OK   \r\n");
                        }
                        result = f_read(&file, &buff[0], 1, &bw); //预读
                        if (result !=  FR_OK)
                        {                               
                                printf("f_read Error\r\n");
                        }
                        else
                        {
                                printf("f_read OK   \r\n");
                        }
                }
//                printf("%d\r\n",kkey);
                t++;
                delay_ms(100);                                           
                LED0=!LED0;
        }
}

大哥的代码每次插拔挂载都能成功,难道我撸代码后插拔的姿势不对吗?严肃的问题请大神指点下。

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-11-6 02:21:45 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 14:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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