我在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 卡并重新插入它。我可以安全地取出卡,但在同一运行期间重新连接它时它不起作用。
如果您想取出卡,则应在每次写入完成后取出卡。这是通过按照
elm-chan用
f_mount
调用 f_mount(0, "", 0);
来完成的。
请注意,您每次都必须安装驱动器,因为它不再可访问。
更好的解决方案是让用户通过按下按钮请求安全删除,然后您的程序有时间安全地完成正在执行的操作并卸载驱动器。然后,它可以通过点亮灯来进行确认,然后用户取出卡。该程序需要检查卡当前是否已安装,如果未安装,则在尝试从卡中写入或读取内容之前。
我会猜测
MX_SDMMC2_SD_Init
的内容,因为您没有在此处包含此代码,但您可能需要在每次删除或尝试访问该卡时调用此函数(及其对应的 deinit
函数)。
您可以使用输入信号 u_derect 并在输入更改时注册回调函数。
为 sdcard 状态更改创建一个 IPC 变量,您可以在 rtos 任务中使用该 IPC 变量来检查 sdcard 状态。