我一直在尝试将我的所有代码从 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();
}