STM32F1 SDIO + FATFS问题频繁写入出错问题解决

        本在STM32F1上移植了FATFS系统,然后又将项目移植到GD32F1上去。发现在使用文件系统频繁写入时接口报错;

        报错“SD_TX_UNDERRUN”或者“SD_RX_OVERRUN”,初期通过f_open、f_lseek、f_write、f_close之间加上10ms延时是可以用的,但是还是不够稳定。我每次写入数据量大概在2K,连续需要写入次数大概是上千次。

        解决方案就需要在FATFS系统的驱动中加入临界保护。如以下写入案例:

DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
{
	DRESULT res = RES_OK;
	
	taskENTER_CRITICAL();    /* 临界保护开启 */
	
	if ((DWORD)buff & 3)
	{
		DRESULT res = RES_OK;
		DWORD scratch[BLOCK_SIZE / 4];

		while (count--)
		{
			memcpy( scratch,buff,BLOCK_SIZE);
			res = SD_write(lun,(void *)scratch, sector++, 1);
			
			if (res != RES_OK) 
			{
				break;
			}
			
			buff += BLOCK_SIZE;
		}
		
		return res;
	}	

	if(HAL_SD_WriteBlocks(&SD_Handle, (uint32_t*)buff, (uint64_t)(sector * BLOCK_SIZE), BLOCK_SIZE, count) != HAL_OK)
	{
		res = RES_ERROR;
	}
	
	taskEXIT_CRITICAL();    /* 临界保护关闭 */
	
	return res;
}

        同样的读取也需要加入临界断:

DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
{
	DRESULT res = RES_OK;
	
	taskENTER_CRITICAL();    /* 临界保护开启 */
	
	if ((DWORD)buff & 3)
	{
		DWORD scratch[BLOCK_SIZE / 4];
		
		while (count--) 
		{
			res = SD_read(lun,(void *)scratch, sector++, 1);
			
			if (res != RES_OK) 
			{
				break;
			}
			
			memcpy(buff, scratch, BLOCK_SIZE);
			buff += BLOCK_SIZE;
		}
		
		return res;
	}
	
	if(HAL_SD_ReadBlocks_DMA(&SD_Handle, (uint32_t*)buff, (uint64_t)(sector * BLOCK_SIZE), BLOCK_SIZE, count) != HAL_OK)
	{
		res = RES_ERROR;
	}

	if(res==RES_OK)
	{
		if(HAL_SD_CheckReadOperation(&SD_Handle, 0xFFFFFFFF) != HAL_OK)
		{
			res = RES_ERROR;
		}
	}
	
	taskEXIT_CRITICAL();    /* 临界保护关闭 */

	return res;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值