STM32
直播中

李秀兰

7年用户 1357经验值
私信 关注
[问答]

STM32CubeMX+FreeRTOS+SD+FATFS碰到DMA FIFO溢出问题怎么解决?

我最近在使用的原子哥的STM32F407的开发板,芯片是STM32F407ZET6,原先我使用CubeMX4.21和F4库 1.16.0 调试SD卡驱动,用CubeMX配置收发DMA传输,但是生成的sd_disk.c中SD_read,SD_write函数并没有调用BSP_SD_ReadBlocks_DMA,BSP_SD_WriteBlocks_DMA函数。生成代码可以读取SD卡的信息,fatfs也可以挂载,但是多次新建文件打开和关闭后,fatfs返回FR_DISK_ERR;可能是由于SD卡无响应后超时导致。
    然后我下载STM32CubeMX4.24和1.19.0库文件,配置好后,生成的sd_disk.c中SD_read,SD_write函数使用了BSP_SD_ReadBlocks_DMA,BSP_SD_WriteBlocks_DMA函数和信号量(队列),进行了线程保护,但是生成的代码并不能使用。读写函数都卡在了 event = osMessageGet(SDQueueID, SD_tiMEOUT);分析后发现程序中并没有释放信号量,于是我在sd_disk.c文件最后添加了

  • void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
  • {
  •   BSP_SD_ReadCpltCallback();
  • }

  • void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
  • {
  •   BSP_SD_WriteCpltCallback();
  • }

void DMA2_Stream6_IRQHandler(void)中断调用了HAL_SD_TxCpltCallback回调函数,但是HAL_SD_RxCpltCallback()回调函数并没有被调用。FatFs不能正常读写SD卡。
最后我在CubeMX中开启了SDIO global interrupt 中断后SD卡后,HAL_SD_RxCpltCallback()才被调用。现在Fatfs可以正常读写SD卡(8GB)了。
间隔200ms给Fatfs测试任务发送通知,Fatfs测试任务完成创建文件(文件名不重复),写入数据(8192字节),关闭文件的功能,25000次(大概3小时)都没有问题,但是任务的完成时间由原来的200ms间隔(每次给任务发送通知),逐渐增加到1.2秒(每次任务完成后,会通过串口打印将信息发给电脑,串口助手有时间戳)。这个原因我现在不清楚。
通过仿真发现在中断函数中一直进入FIFO Error错误。但是SD卡可以正常读写。我没有找到原因。

  • void HAL_DMA_IRQHandler(DMA_HandleTypeDef *hdma)
  • {
  •   /* FIFO Error Interrupt management ******************************************/
  •   if ((tmpisr   (DMA_FLAG_FEIF0_4 << hdma->StreamIndex)) != RESET)
  •   {
  •     if(__HAL_DMA_GET_IT_SOURCE(hdma, DMA_IT_FE) != RESET)
  •     {
  •       /* Clear the FIFO error flag */
  •      regs->IFCR = DMA_FLAG_FEIF0_4 << hdma->StreamIndex;

  •      /* Update error code */
  •      hdma->ErrorCode |= HAL_DMA_ERROR_FE;
  •     }
  •   }
  • }


回帖(1)

华强一条街

2024-5-9 16:52:54
在解决STM32CubeMX+FreeRTOS+SD+FATFS碰到DMA FIFO溢出问题时,可以尝试以下步骤:

1. 确保DMA配置正确:检查STM32CubeMX中的DMA配置,确保DMA通道、数据宽度、源地址增量、目标地址增量等参数设置正确。同时,确保DMA的优先级设置得当,以避免与其他DMA通道发生冲突。

2. 检查SD卡初始化和配置:确保SD卡初始化过程中的时钟、电源和接口设置正确。此外,检查SD卡的配置,如块大小、传输速度等,以确保与STM32F407ZET6兼容。

3. 使用BSP_SD_ReadBlocks_DMA和BSP_SD_WriteBlocks_DMA函数:在STM32CubeMX4.24和1.19.0库文件中,确保SD_read和SD_write函数调用了BSP_SD_ReadBlocks_DMA和BSP_SD_WriteBlocks_DMA函数。这将确保使用DMA进行数据传输。

4. 检查FATFS配置:确保FATFS的配置正确,如文件系统类型、缓冲区大小等。此外,检查FATFS的挂载和卸载过程,确保在文件操作完成后正确卸载FATFS。

5. 优化文件操作:在多次新建文件、打开和关闭文件时,可能导致SD卡无响应。尝试优化文件操作,减少文件操作的频率,或者在文件操作之间添加适当的延时。

6. 检查中断和回调函数:确保SD卡的中断和回调函数正确实现,以便在DMA传输过程中处理错误和状态更新。

7. 使用调试工具:使用STM32的调试工具(如ST-LINK)来监视DMA传输和SD卡操作。这有助于识别潜在的问题,如DMA溢出、SD卡错误等。

8. 更新软件和固件:确保使用的STM32CubeMX、FATFS和HAL库是最新版本,以获得最佳的性能和稳定性。

9. 考虑使用其他文件系统:如果问题仍然存在,可以考虑使用其他文件系统,如LittleFS或SPIFFS,这些文件系统可能更适合SD卡操作。

通过以上步骤,应该能够解决STM32CubeMX+FreeRTOS+SD+FATFS碰到的DMA FIFO溢出问题。如果问题仍然存在,建议查阅相关文档和论坛,寻求更专业的帮助。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分