GD32F303VCT6
GD32303CEVAL官方例程SD卡驱动无法再Freertos中正常使用
问题:SD卡相关驱动在进入Freertos前可以正常块读写,函数sd_block_write/sd_block_read返回SD_OK,在Freertos任务中无法正常读写,具体表现为返回SD_CMD_RESP_TIMEOUT
在单步调试中发现是一下代码片段导致返回SD_CMD_RESP_TIMEOUT
align = blocksize & (blocksize - 1);
if((blocksize > 0) && (blocksize <= 2048) && (0 == align)){
datablksize = sd_datablocksize_get(blocksize);
/* send CMD16(SET_BLOCKLEN) to set the block length */
sdio_command_response_config(SD_CMD_SET_BLOCKLEN, (uint32_t)blocksize, SDIO_RESPONSETYPE_SHORT);
sdio_wait_type_set(SDIO_WAITTYPE_NO);
sdio_csm_enable();
/* check if some error occurs */
status = r1_error_check(SD_CMD_SET_BLOCKLEN);
if(SD_OK != status){
return status;
}
}else{
status = SD_PARAMETER_INVALID;
return status;
}
以上片段摘自sdcard.c的sd_block_write函数中
在裸机中正常读写的代码如下
```c
int main()
{
char str[50] = "";
nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
nvic_irq_enable(SDIO_IRQn, 0, 0);
gpio_config();
uart_config();
tim7_init();
gd_eval_lcd_init();
sd_config();
sd_error_enum sd_error;
sd_error=sd_block_write(buff_write, 100*512, 512);
printf("%d ",(int)sd_error);
sd_error=sd_block_read(buff_read, 100*512, 512);
printf("%d ",(int)sd_error);
FreeRtos_Init();
while (1)
{
}
}
在FreeRtos_init中会启动rtos
RTOS中读写失败代码如下
```c
void StartDefault_task(void *pvParameters)
{
lcd_line_info info = {0};
uint32_t index = 0;
int time = 0;
sd_error_enum sd_error;
KeyInit();
xTimerStart(hkeyTimer,0);
for (;;)
{
portENTER_CRITICAL();
sd_error=sd_block_write(buff_write, 100*512, 512);
portEXIT_CRITICAL();
printf("%d ",(int)sd_error);
vTaskDelay(2000);
portENTER_CRITICAL();
sd_error=sd_block_read(buff_read, 100*512, 512);
portEXIT_CRITICAL();
printf("%d ",(int)sd_error);
vTaskDelay(2000);
}
}
现象如下
29是SD_OK,19是SD_CMD_RESP_TIMEOUT
可以看到进系统前返回SD_OK,而在任务中读取返回SD_CMD_RESP_TIMEOUT
可以帮我看看是什么原因吗,谢谢