新手上路
- 积分
- 40
- 金钱
- 40
- 注册时间
- 2019-9-12
- 在线时间
- 17 小时
|
1金钱
以下截取自HAL_SD_WriteBlocks
#ifdef SDIO_STA_STBITERR
while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND | SDIO_FLAG_STBITERR))
#else /* SDIO_STA_STBITERR not defined */
while(!__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DATAEND))
#endif /* SDIO_STA_STBITERR */
{
if(__HAL_SD_GET_FLAG(hsd, SDIO_FLAG_TXFIFOHE))
{
/* Write data to SDIO Tx FIFO */
for(count = 0U; count < 8U; count++)
{
SDIO_WriteFIFO(hsd->Instance, (tempbuff + count));
}
tempbuff += 8U;
}
if((Timeout == 0U)||((HAL_GetTick()-tickstart) >= Timeout))
{
/* Clear all the static flags */
__HAL_SD_CLEAR_FLAG(hsd, SDIO_STATIC_FLAGS);
hsd->ErrorCode |= errorstate;
hsd->State = HAL_SD_STATE_READY;
return HAL_TIMEOUT;
}
}
不知道怎么搞的,这里的sdio的STA寄存器更新超级慢(这个过程中STA的值为0x105000),导致写入fifo 17次,共17*256个字节,远大于512字节,最后导致堆栈溢出(总共就512字节的buffer,用完了还继续往后读取),之后进入hardfault后再读取STA,显示就正常了(0x500).
我不知道是不是我的sd卡有问题,感觉不像。测试的是F4的HAL库。
还有我必须吐槽STM32的SDIO,DMA感觉像是摆设,硬件流控制无法适用DMA,DMA动不动就FIFO溢出,我简直要吐血,后面使用官方的BSP库倒是能够读取了,但是写入却出现这种玩意。
感觉自己好菜啊,求救。。。
|
最佳答案
查看完整内容[请看2#楼]
谢谢,弄好了,是因为我没有进行4k对齐我的内存buffer,还说别人有问题,挺惭愧。弄好后的速度是10M/s的写入和20M/s的读取,还是很爽的。
|