你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在使用cube产生FreeRTOS和FatFS时,有关FatFS的两个bug

[复制链接]
uwyciw100 发布时间:2017-12-22 09:22
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文件里面,有如下代码
  1. void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
  2. {
  3.   BSP_SD_ReadCpltCallback();
  4. }
复制代码
以上是使用中发现的两个问题。




评分

参与人数 2 ST金币 +12 收起 理由
mahiraga-184929 + 2 赞一个!
g921002 + 10 很给力!

查看全部评分

收藏 1 评论7 发布时间:2017-12-22 09:22

举报

7个回答
uwyciw100 回答时间:2017-12-22 13:34:45
adlu 发表于 2017-12-22 11:50
高手!赞×32!

我之前使用Cube生成SDIO和FATFS的代码时,发现配置SDIO使用DMA后,FATFS的SD_Read/Write驱 ...

现在可以生成带DMA的函数了。
adlu 回答时间:2017-12-22 11:50:50
本帖最后由 adlu 于 2017-12-22 11:54 编辑

高手!赞×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。不知道现在修正没有。
juky2008 回答时间:2018-2-21 17:11:29
本帖最后由 juky2008 于 2018-2-21 17:42 编辑

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引起的。
  1. void DMA2_Stream6_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN DMA2_Stream6_IRQn 0 */

  4.   /* USER CODE END DMA2_Stream6_IRQn 0 */
  5.   HAL_DMA_IRQHandler(&hdma_sdio_tx);
  6.   /* USER CODE BEGIN DMA2_Stream6_IRQn 1 */

  7.   /* USER CODE END DMA2_Stream6_IRQn 1 */
  8. }
复制代码
如果不使用DMA读写SD卡,那么用查询方法的读写函数时要关闭中断,而非【临界保护(关闭系统默认的优先级5以上的中断源)】,否则SD卡操作时间久后,SD卡将会没有响应。现在读写没有问题后,随后的问题是执行时间将显著增加(读写多个Block,中断关闭的时间有点久啊),系统的实时性大打折扣。

可能是我工程配置或者程序有问题才出现,大家有这个现象吗?

小黑111 回答时间:2018-3-19 19:28:05
cubemx在stm32cubef7版本V1.9.0版本修复了关于sd卡的bug,stm32cubef4版本应该也已经修复
uwyciw100 回答时间:2018-3-20 08:41:55
小黑111 发表于 2018-3-19 19:28
cubemx在stm32cubef7版本V1.9.0版本修复了关于sd卡的bug,stm32cubef4版本应该也已经修复 ...

多谢提醒,一会试试看。
butterflyspring 回答时间:2018-3-23 16:32:21
谢谢各位,我们复现一下,如是,我们会上报上去,谢谢!
秒速5Hz 回答时间:2018-4-26 10:18:07
确实存在此问题,在F4V1.21.0版本中也存在,不会自动调用BSP_SD_ReadCpltCallback和BSP_SD_WriteCpltCallback两个函数

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版