0

我一直在尝试将我的所有代码从 STM32 Arduino 库转移到 ST Hal 库,但我遇到了 SD 卡的问题。我使用的 SDHC sd 卡有两个分区(一个用于恢复出厂设置,另一个用于正常设置)它们在我的 PC 上显示为驱动器 D 和 E。

因此,在为我的 STM32F1 芯片设置 FATFS 时,使用 SD 总线一位模式时一切正常。使用标准代码,我可以写入出厂重置分区:

  FRESULT res = f_open(&SDFile, (const TCHAR *)"Test2.txt", FA_CREATE_ALWAYS | FA_WRITE);
  if(res == FR_OK){
    HAL_GPIO_WritePin(DASH_LED_1_GPIO_Port, DASH_LED_1_Pin, GPIO_PIN_SET);
    res = f_putc('S', &SDFile);
    if(res != -1){
      HAL_GPIO_WritePin(DASH_LED_2_GPIO_Port, DASH_LED_2_Pin, GPIO_PIN_SET);
    }
    res = f_write(&SDFile, (const void*)buffer, sizeof(buffer), &byteswritten );
    if(res == FR_OK){
      HAL_GPIO_WritePin(DASH_LED_3_GPIO_Port, DASH_LED_3_Pin, GPIO_PIN_SET);

    }
    f_close(&SDFile);
  }

初始化代码并安装驱动器时,一切似乎都很好,即使我想安装第二个分区(我不确定这是否是我对代码所做的),调试器中的返回都是 FR_OK:

uint8_t retSD;    /* Return value for SD */
char SDPath[4];   /* SD logical drive path */
char OtherPath[4];
FATFS SDFatFS;    /* File system object for SD logical drive */
FIL SDFile;       /* File object for SD */

/* USER CODE BEGIN Variables */
PARTITION VolToPart[2] = {
  {0,0},
  {0,1}
};
/* USER CODE END Variables */    

void MX_FATFS_Init(void) 
{
  /*## FatFS: Link the SD driver ###########################*/
  retSD = FATFS_LinkDriver(&SD_Driver, SDPath);

  /* USER CODE BEGIN Init */
  FRESULT res = f_mount(&SDFatFS, SDPath, 0 );
  if(res != FR_OK){
    Error_Handler();
  }
  res = f_mount(&SDFatFS, OtherPath, 0);
  if(res != FR_OK){
    Error_Handler();
  }

  /* additional user code for init */     
  /* USER CODE END Init */
}

我承认,即使我进行了研究,我发现安装和随后的 VolToPart 数组显然需要有点模糊。

在挂载两次调试代码后(参见上面的代码),我使用驱动器标识符测试了代码(我打开了_FS_RPATH,我认为它没有效果,但只是为了确定)我可以将 Hello World 写入 0 :Test2.txt 但得到 1:Test2.txt 的无效驱动器错误。

我希望能够在驱动器之间切换,但我觉得我错过了一些我需要启动或做的事情。目前我不确定 FatFs 是否可以看到 SDCard 分区,我只是没有对其进行初始化,或者它是否是 SD 卡看不到的完全独立的驱动器。我希望有人能够帮助我,如果您需要更多信息,请告诉我。

编辑:经过一段时间的调试,我发现了一些东西:SDPath 在链接驱动程序中被定义为“0:/”,所以这个驱动器工作是有道理的。其他路径未定义(据我所知,只是获取默认值“0:/”,这意味着我正在执行相同的安装两次。当我尝试添加单独的驱动程序并初始化那个时,它仍然是一个无效的磁盘错误。

extern Diskio_drvTypeDef  SD_Driver;
extern Diskio_drvTypeDef  Other_Driver;
const Diskio_drvTypeDef  SD_Driver =
{
  SD_initialize,
  SD_status,
  SD_read, 
#if  _USE_WRITE == 1
  SD_write,
#endif /* _USE_WRITE == 1 */

#if  _USE_IOCTL == 1
  SD_ioctl,
#endif /* _USE_IOCTL == 1 */
};

const Diskio_drvTypeDef  Other_Driver =
{
  SD_initialize,
  SD_status,
  SD_read, 
#if  _USE_WRITE == 1
  SD_write,
#endif /* _USE_WRITE == 1 */

#if  _USE_IOCTL == 1
  SD_ioctl,
#endif /* _USE_IOCTL == 1 */
};

然后我运行了两次链接驱动程序,并在第二次安装时收到了 FR_INVALID_DRIVE 消息。我用相同的 FATFS 对象和不同的对象都试过了。

uint8_t retSD;    /* Return value for SD */
char SDPath[4];   /* SD logical drive path */
char OtherPath[4];
FATFS SDFatFS;    /* File system object for SD logical drive */
FATFS OtherFatFS;
FIL SDFile;       /* File object for SD */

/* USER CODE BEGIN VolToPart */
/* Volume - Partition resolution table should be user defined in case of Multiple partition */
/* When multi-partition feature is enabled (1), each logical drive number is bound to arbitrary physical drive and partition
listed in the VolToPart[] */
PARTITION VolToPart[] = {
  {0,0},
  {1,0}
};
/* USER CODE END VolToPart */  

/* USER CODE BEGIN Variables */
/* USER CODE END Variables */    

void MX_FATFS_Init(void) 
{
  /*## FatFS: Link the SD driver ###########################*/
  retSD = FATFS_LinkDriver(&SD_Driver, SDPath);
  retSD = FATFS_LinkDriver(&Other_Driver, OtherPath);
  /* USER CODE BEGIN Init */
  FRESULT res = f_mount(&SDFatFS, SDPath, 1 );
  if(res != FR_OK){
    Error_Handler();
  }
  res = f_mount(&SDFatFS, OtherPath, 1);
  if(res != FR_OK){
    Error_Handler();
  }
4

0 回答 0