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

在使用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扩展软件包
关注我们
st-img 微信公众号
st-img 手机版