如何处理运行时SD卡的移除和添加?

问题描述 投票:0回答:2

我在STM32F7板上使用带有SDMMC接口的SD卡。我正在关注这个视频,项目进展顺利。 https://www.youtube.com/watch?v=0NbBem8U80Y

FATFS SDFatFs;  
FIL MyFile;    
FRESULT res;                                          
uint32_t byteswritten;                 
uint8_t wtext[] = "This is test of Fatfs with STM32F7-Disco DMA&RTOS\n"; 


int main(void)
{

 HAL_Init();


 SystemClock_Config();

 MX_GPIO_Init();
 MX_DMA_Init();
 MX_SDMMC2_SD_Init();

 MX_FATFS_Init();
 /* Call init function for freertos objects (in freertos.c) */
 MX_FREERTOS_Init();

 /* Start scheduler */
 osKernelStart();

 /* We should never get here as control is now taken by the scheduler */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
  }
 /* USER CODE END 3 */
}

void StartDefaultTask(void const * argument)
{
 /* init code for FATFS */
 if(f_mount(&SDFatFs, (TCHAR const*)SDPath, 0) != FR_OK) 
  { 
     Error_Handler(); 
   } 
   else 
  { 
    if(f_open(&MyFile, "sd_test.txt", FA_CREATE_ALWAYS | FA_WRITE) != FR_OK) 
     { 
      Error_Handler(); 

    } 
    else 
    { 
      res = f_write(&MyFile, wtext, sizeof(wtext)-1, (void *)&byteswritten); 
     char buf[]="Hello World"; 
      res = f_write(&MyFile,buf, sizeof(buf)-1, (void *)&byteswritten); 
    char buf1[]="I am GEHAD"; 
      res = f_write(&MyFile,buf1, sizeof(buf1)-1, (void *)&byteswritten); 

      if((byteswritten == 0) || (res != FR_OK)) 
      { 
        Error_Handler(); 
      } 
      else 
      { 
        f_close(&MyFile); 

      } 
  } 
  } 


 /* USER CODE BEGIN StartDefaultTask */
 /* Infinite loop */
 for(;;)
{


    if(f_open(&MyFile, "sd_test2.txt", FA_OPEN_APPEND | FA_WRITE) != FR_OK) 
    { 
      Error_Handler(); 

    } 
    else 
    { 
      res = f_write(&MyFile, wtext, sizeof(wtext)-1, (void *)&byteswritten); 
    char buf[]="Hello World"; 
      res = f_write(&MyFile,buf, sizeof(buf)-1, (void *)&byteswritten); 
    char buf1[]="I am gehad"; 
      res = f_write(&MyFile,buf1, sizeof(buf1)-1, (void *)&byteswritten); 

      if((byteswritten == 0) || (res != FR_OK)) 
      { 
        Error_Handler(); 
      } 
      else 
      { 
        f_close(&MyFile); 

      } 
  } 

        osDelay(1);
}



 /* USER CODE END StartDefaultTask */
 }

我不希望在程序运行并可能写入数据时能够安全地取出 SD 卡并重新插入它。我可以安全地取出卡,但在同一运行期间重新连接它时它不起作用。

arm sd-card keil stm32f7 stm32cubemx
2个回答
1
投票

如果您想取出卡,则应在每次写入完成后取出卡。这是通过按照

elm-chan
f_mount
调用 f_mount(0, "", 0); 来完成的。

请注意,您每次都必须安装驱动器,因为它不再可访问。

更好的解决方案是让用户通过按下按钮请求安全删除,然后您的程序有时间安全地完成正在执行的操作并卸载驱动器。然后,它可以通过点亮灯来进行确认,然后用户取出卡。该程序需要检查卡当前是否已安装,如果未安装,则在尝试从卡中写入或读取内容之前。

我会猜测

MX_SDMMC2_SD_Init
的内容,因为您没有在此处包含此代码,但您可能需要在每次删除或尝试访问该卡时调用此函数(及其对应的
deinit
函数)。


0
投票

您可以使用输入信号 u_derect 并在输入更改时注册回调函数。

为 sdcard 状态更改创建一个 IPC 变量,您可以在 rtos 任务中使用该 IPC 变量来检查 sdcard 状态。

© www.soinside.com 2019 - 2024. All rights reserved.