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

2019-07-20 05:18发布

    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("文件系统挂载失败! ");
                        }
                        else
                        {
                                #ifdef debug
                                printf("挂载了文件 ");
                                #endif
                        }
                        sprintf(path, "%s", MP3_PATH);
                        result = f_opendir(&DirInf, path);         /* path可以带盘符,最后一个字符不能是/ */
                        if (result != FR_OK)
                        {
                                printf("f_opendir Error ");
                        }
                        else
                        {
                                printf("f_opendir OK    ");
                        }
                        /* 打开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 ");
                        }
                        else
                        {
                                printf("f_open OK    ");
                        }
                        result = f_read(&file, &buff[0], 1, &bw); //预读
                        if (result !=  FR_OK)
                        {                               
                                printf("f_read Error ");
                        }
                        else
                        {
                                printf("f_read OK    ");
                        }
                }
                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! ");
                delay_ms(500);                                       
                printf("Please Check! ");
                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 ");
                        }
                        else
                        {
                                printf("f_mount OK    ");
                        }
                        sprintf(path, "%s", MP3_PATH);
                        result = f_opendir(&dir, path);         /* path可以带盘符,最后一个字符不能是/ */
                        if (result != FR_OK)
                        {
                                printf("f_opendir Error ");
                        }
                        else
                        {
                                printf("f_opendir OK    ");
                        }
                        /* 打开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 ");
                        }
                        else
                        {
                                printf("f_open OK    ");
                        }
                        result = f_read(&file, &buff[0], 1, &bw); //预读
                        if (result !=  FR_OK)
                        {                               
                                printf("f_read Error ");
                        }
                        else
                        {
                                printf("f_read OK    ");
                        }
                }
//                printf("%d ",kkey);
                t++;
                delay_ms(100);                                           
                LED0=!LED0;
        }
}

大哥的代码每次插拔挂载都能成功,难道我撸代码后插拔的姿势不对吗?严肃的问题请大神指点下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。