运行环境: STM32H723+TCP服务端+SDMMC+FATFS文件系统+其它 SD卡挂载卸载方式:MCU运行后通过网口发送命令到MCU对SD卡进行挂载和卸载 问题现象: 将SD卡移除后使用挂载命令出现失败(正常),插上SD卡后继续使用挂载命令还是挂载失败(不正常) 问题分析: 一旦挂载失败,后续无法继续挂载,可能和挂载失败的第一次有关,寻找第一次挂载出现了什么。 由于第一次挂载失败是因为没有插SD卡,这个时候必然会挂载失败。挂载SD卡属于FATFS文件系统的操作,但是在挂载时它会调用底层的驱动,用来初始化底层驱动SD卡的硬件外设及SD卡。 对比有SD卡正常挂载、无SD卡失败挂载、然后插上SD卡的失败挂载三种情况下的disk和hsd1全局变量的变化及差异。 正常挂载时,无问题 无卡挂载失败时,在执行errorstate = SD_PowerON(hsd)函数返回错误,后续代码全部跳出不执行,且hsd->ErrorCode被置为错误代码HAL_SD_ERROR_UNSUPPORTED_FEATURE,0x10000000。 失败后插卡重新挂载时,在执行if (HAL_SD_ConfigWideBusOperation(hsd, hsd->Init.BusWide) != HAL_OK)时出错,跳转进去进一步分析,发现: if (hsd->ErrorCode != HAL_SD_ERROR_NONE) { / Clear all the static flags / __HAL_SD_CLEAR_FLAG(hsd, SDMMC_STATIC_FLAGS); status = HAL_ERROR; } 该代码判断到了在无卡挂载时保存的错误代码,导致HAL_SD_ConfigWideBusOperation返回了HAL_ERROR错误,最终导致初始化报错,无法继续执行后续的初始化及文件系统挂载。 所以,在进行HAL_SD_Init前将hsd1.ErrorCode错误信息清除在进行后续的初始化操作即可。 hsd1.ErrorCode = 0; / HAL SD initialization / sd_state = HAL_SD_Init(&hsd1); 同时,发现在调用底层初始化时做了个判断,初始化过后不在进行初始化,这样就会出现一个问题,如果SD卡插拔了,下次挂载就要初始化SD卡,所以这个逻辑改为,初始化成功就置一initialized,否则清零initialized DSTATUS disk_initialize (BYTE pdrv ) / Physical drive nmuber to identify the drive / { DSTATUS stat = RES_OK; if(disk.is_initialized[pdrv] == 0) { disk.is_initialized[pdrv] = 1; stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]); } return stat; } 改为 DSTATUS disk_initialize (BYTE pdrv) / Physical drive nmuber to identify the drive / { DSTATUS stat = RES_OK; stat = disk.drv[pdrv]->disk_initialize(disk.lun[pdrv]); if(stat == 0) disk.is_initialized[pdrv] = 1; else disk.is_initialized[pdrv] = 0; return stat; } |
各位朋友,有没有STM32F0系列教程,最好是汇编语言的。
Stm32h745使用Jlink遇到的问题
STM32Cube 没有中文教程,在续会有吗,有没有这方面的计划吗
stm32编程语言
stm32cubemx软件问题
1.STMCWB 最新版本是否支持绝对值编码器?只能通过MCLIB库手动增加吗?2.基于ST FOC库的磁编码器(SPI出绝对角度信息)只跑速度环和电流环最简单
入手了一个NUCLEO-H7A3ZI-Q 求一个入门教程
一种基于STM32 指定串口 自定义printf 的方法
ARM汇编教程或者文档推荐
STM32H750自带的SPI BootLoader烧录疑问
有SD卡挂载成功时的disk和hsd1
无SD卡挂载失败时的disk和hsd1对比挂载成功时的变量
插卡后任然挂载失败的disk和hsd1对比挂载成功时的变量
其它挂载方面的问题暂时没有发现。