STM32L4A6ZGT6,固件包 STM32Cube_FW_L4_V1.17.1,硬件 NUCLEO-L4A6ZG。
我正在调试 SDMMC 外设配合 DMA 驱动 FatFS 文件系统,遇到卡死故障。
有没有办法手动升级 FatFS 源码,且每次重新生成 CubeMX 工程时不会被覆盖删除?
在 CubeMX 的 FATFS 高级设置中勾选使用 DMA 模板后读写卡死;取消该选项、采用轮询模式时 SD 卡读写完全正常。
开启 DMA 后程序卡死栈:
SD_write() sd_diskio.c 351行
disk_write() diskio.c 104行
f_mkfs() ff.c 5661行
test() test.c 23行
main() main.c 103行
卡死代码片段:
if(BSP_SD_WriteBlocks_DMA((uint32_t*)buff, (uint32_t)(sector), count) == MSD_OK)
{
/* 等待写完成或超时 */
timeout = HAL_GetTick();
while((WriteStatus == 0) && ((HAL_GetTick() - timeout) < SD_TIMEOUT))
{
}
/* 超时则返回错误 */
if (WriteStatus == 0)
{
res = RES_ERROR;
}
}
逻辑是等待全局标记WriteStatus被BSP_SD_WriteCpltCallback置 1,但该回调函数始终不会被触发:
void BSP_SD_WriteCpltCallback(void)
{
WriteStatus = 1;
}
卡死时读取 SDMMC 句柄hsd1寄存器关键值:
MASK二进制 11010,仅开启:DCRCFAILIE、DTIMEOUTIE、TXUNDERRIE;未开启 DATAENDIE
STA 状态寄存器:TXACT、TXFIFOE、TXFIFOHE、TXDAVL 置位,说明发送流程卡住,FIFO 空但传输未结束
DLEN/DCOUNT = 0x200,DCOUNT 未减少,无任何数据真正完成 DMA 传输
请问是什么导致该故障?
|
|