f_read 返回FR_OK ,但是读取的数据长度一直是0的现象:打开的是一个较小文件(不足1k)是能正确获取文件大小信息,打开一个较大文件(1.87MB)时返回FR_OK,文件大小信息是0
原因:SDIO时钟频率过低
我使用的是stm32f407vet6 通过sdio方式和SD卡通信
问题发现解决过程:
1、在问题出现前stm32使用的系统时钟频率是168mhz,为使产品符合低功耗要求降低频率至50mhz运行后出现问题,遂猜测和问题原因可能和系统时钟频率有关
2、通过逻辑分析仪检测SDIO 的CLK脚发现 在系统时钟为50MHZ时CLK脚频率为7mhz左右,168mhz 时CLK脚频率为24mhz左右。7mhz 时 f_open无法正确获取文件大小信息, 24mhz 时 f_open正确获取文件大小信息(强烈建议逻辑分析仪的采样频率要保证是被检测频率的10倍才能保证采样结果不失真!)
3、通过cube了解到stm32f407vet6的sdio 的工作频率范围为187khz-24mhz
工作频率计算方法为SDIO_CK = SDIOCLK / [CLKDIV + 2],其中CLKDIV(分频值)我的代码中已经设置为0
50MHZ时时钟配置如下,此时SDIOCLK为14.285mhz, SDIOCLK / [CLKDIV + 2]=7mhz,印证逻辑分析仪的采样结果,由cube时钟树图知上述公式中SDIOCLK的值取决于PLL中的Q值

文章讲述了在STM32F407通过SDIO与SD卡通信时,遇到文件大小信息获取错误的问题,经分析发现是由于SDIO时钟频率过低导致的。解决办法是提高系统时钟频率,确保SDIO时钟在工作范围内,以满足低频通信的时序要求。
最低0.47元/天 解锁文章
2600





