天天看点

stm32cubemx+freertos+fatfs+sd调试心得

      stm32cubemx是当下比较流行的开发工具,可以大大提升我们的移植效率,从而提升开发的效率,但是在某些方面还是有些小坑需要我们注意。以下是用Cube,来进行sd卡读写实验的一些心得。

       在这里cube的画面配置环节就不描述了,直接描述所碰问题:文件系统无法挂载或文件无法读写,而且调式的时候光标移到读取时会跑飞等一些列问题。其实针对于这一问题主要是处理SD的信息接受与发送的中断调用有问题,我们可以进入SD的中断函数中进行分析,该函数在stm32f4xx_it.c文件中,如下图所示:

stm32cubemx+freertos+fatfs+sd调试心得

然后我们再进入HAL_SD_IRQHandler(&hsd)函数中,会发现当SD卡发送和接收信息调用的函数如下图所示:

stm32cubemx+freertos+fatfs+sd调试心得

根据这一段程序我们可以很清楚地发现用于SD读的函数为HAL_SD_RxCpltCallback(hsd),写的函数为HAL_SD_TxCpltCallback(hsd)。再看看HAL_SD_RxCpltCallback(hsd)和HAL_SD_TxCpltCallback(hsd)分别对应的定义为__weak void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)

__weak void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)

即发生读写中断的时候什么,无任何操作。而在自动生成的项目中关于sd卡的读写中断函数在sd_diskio.c文件中,如下图所示:

stm32cubemx+freertos+fatfs+sd调试心得
stm32cubemx+freertos+fatfs+sd调试心得

那么原因就一目了然了,当sd卡发生读写中断的时候,程序根本就没有在void BSP_SD_WriteCpltCallback(void)和

void BSP_SD_ReadCpltCallback(void)这两个函数中进行sd卡的读写中断处理,即中断根本就没有用,所以无法挂载,无法读写的问题就会出现。解决方法如下:添加以下代码如下图所示:

stm32cubemx+freertos+fatfs+sd调试心得

到了此处不要高兴太早哦,还有坑,此时sd卡已经可以挂载文件系统了,但是文件依然无法读写,调式时发现依然存在读写错误。那么可能大家会怀疑还是中断处理有问题,当时我也是这么想的,可是当我做完不带freertos的sd卡实验后,我就不这么想了,在不带操作系统,所有的fatfs的API函数可以很好的执行。证明了错误不在中断上,而是我们的操作系统没有运用好,主要原因如图所下:

stm32cubemx+freertos+fatfs+sd调试心得

就是这么一句不起眼程序,可能导致你项目中的各种奇怪问题,这一句话是Cube软件自动生成的,大家可能觉得这个没什么问题,其实我忽略了一点问题,就是文件系统比较复杂,所以在线程中调用的时候需要较大的栈空间,所以我将128改为1024之后所有的问题就都解决了。经过以上两步,你就可以在你创建的线程中愉快地用FATFS文件系统对sd卡进行操作了。

继续阅读