|
cube版本V4.23.0 stm32cubef4版本V1.18.0 工程使用FreeRTOS、FatFS和SDIO。 产生代码后,发现两个问题。 一、sd_diskio.c中的SD_initialize函数没有对SDIO进行初始化。这个问题,在不加FreeRTOS的时候也发现过。在下面的链接中讨论过https://www.stmcu.org.cn/module/forum/thread-613591-1-1.html 二、中断回调函数名错误。 FreeRTOS、FatFS一起使用时,cube会自动产生一个消息队列。该队列用于SDIO的访问控制。所有的读写函数都要在访问前请求队列。而数据传输完成后,中断的回调函数会向队列发送一个信号。但在cube产生的代码中,回调函数名分别是BSP_SD_WriteCpltCallback 和BSP_SD_ReadCpltCallback。这两个函数在cube产生的工程中,不会被任何中断调用,所以导致和SDIO有关的读写函数永远等待不到队列中的信号量。stm32cubef4库中真正的回调函数名是HAL_SD_TxCpltCallback和HAL_SD_RxCpltCallback。修改后,程序可以正确运行。 在官方例程中使用的回调函数是BSP_SD_WriteCpltCallback和BSP_SD_ReadCpltCallback。查看代码发现例程中对回调函数做了一次额外的调用。如STM324x9I_EVAL的FatFs_uSD_RTOS例程中,在stm324x9i_eval_sd.c文件里面,有如下代码
|
| 参与人数 2 | ST金币 +12 | 收起 理由 |
|---|---|---|
|
|
+ 2 | 赞一个! |
|
|
+ 10 | 很给力! |
微信公众号
手机版
现在可以生成带DMA的函数了。
高手!赞×32!
我之前使用Cube生成SDIO和FATFS的代码时,发现配置SDIO使用DMA后,FATFS的SD_Read/Write驱动函数使用的仍然是普通函数BSP_SD_ReadBocks和BSP_SD_WriteBocks,需要自己手动改为DMA的函数BSP_SD_ReadBocks_DMA和BSP_SD_WriteBocks_DMA。不知道现在修正没有。
STM32CubeMX4.24 F4库1.19.0 楼主提到的第二个bug,在最新版中也存在的。我还发现两个bug:
一、无论你有没有配置DMA,SD_diskio.c 的SD_Write()和SD_Read() 都是使用DMA方式的函数,BSP_SD_WriteBlocks_DMA()和BSP_SD_ReadBlocks_DMA()
二、一直触发DMA 发送数据流的FIFO error 错误。但万幸的是,SD卡读写正常,我猜测可能是DPSM引起的。
可能是我工程配置或者程序有问题才出现,大家有这个现象吗?
多谢提醒,一会试试看。