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;
}
}
大哥的代码每次插拔挂载都能成功,难道我撸代码后插拔的姿势不对吗?严肃的问题请大神指点下。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>