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

STM32F767Zi HAL库SDMMC使用DMA方式写入数据异常

[复制链接]
caojin85cn 提问时间:2018-2-20 21:38 /
本帖最后由 caojin85cn 于 2018-2-20 21:46 编辑

环境:WIN7 64bit + MDK5.20
硬件:stm32F7 Nucleo (F767Zi)
STM32F7xx_DFP  版本2.9.0(目前最新的)

SDMMC配置参数
  1. SDHandle_SDMMC.Instance = SDMMC2;
  2. SDHandle_SDMMC.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
  3. SDHandle_SDMMC.Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE;
  4. SDHandle_SDMMC.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
  5. SDHandle_SDMMC.Init.BusWide = SDMMC_BUS_WIDE_1B;
  6. SDHandle_SDMMC.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_ENABLE;
  7. SDHandle_SDMMC.Init.ClockDiv = 10; //4Mhz
复制代码
SDMMC中断
  1. HAL_NVIC_SetPriority(SDMMC2_IRQn, 3, 1);
  2. HAL_NVIC_EnableIRQ(SDMMC2_IRQn);
复制代码

DMA中断
  1. HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 5, 0);
  2. HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn);
复制代码

目前的问题是
使用HAL库提供的函数:HAL_SD_WriteBlocks_DMA
直接写一个块或者多个块,函数返回值正常,也可以进入DMA传输完成中断,DMA也未报错
但是后续在读取数据时发现之前写入的数据全部都是0

而如果调用非DMA方式写入函数:HAL_SD_WriteBlocks 做同样的写入操作,则结果正常,后续读取数据也是和写入的一致

简单来说,就是通过DMA方式写入SD卡的数据全都是0

还求各位给点意见,可能是什么地方的问题?如何定位?
最近发现2.9.0版本的HAL库在SDMMC方面有一些Bug,会不会导致这个结果?

补充:DMA的读取结果是正常的

收藏 评论7 发布时间:2018-2-20 21:38

举报

7个回答
caojin85cn 回答时间:2018-2-20 21:42:35
DMA配置参数
  1. hdma_sdmmc.Instance = DMA2_Stream5;
  2. hdma_sdmmc.Init.Channel = DMA_CHANNEL_11;
  3. hdma_sdmmc.Init.Direction = DMA_MEMORY_TO_PERIPH;
  4. hdma_sdmmc.Init.PeriphInc = DMA_PINC_DISABLE;
  5. hdma_sdmmc.Init.MemInc = DMA_MINC_ENABLE;
  6. hdma_sdmmc.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
  7. hdma_sdmmc.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
  8. hdma_sdmmc.Init.Mode = DMA_SxCR_PFCTRL;
  9. hdma_sdmmc.Init.Priority = DMA_PRIORITY_VERY_HIGH;
  10. hdma_sdmmc.Init.FIFOMode = DMA_FIFOMODE_ENABLE;
  11. hdma_sdmmc.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
  12. hdma_sdmmc.Init.MemBurst = DMA_MBURST_INC4;
  13. hdma_sdmmc.Init.PeriphBurst = DMA_PBURST_INC4;
复制代码


caojin85cn 回答时间:2018-2-20 21:43:42
本帖最后由 caojin85cn 于 2018-2-20 21:45 编辑

SD卡是Lexar 16G Class6 这个问题应该和SD卡无关,试过sony和kingston一样的结果
SDMMC1和SDMMC2都试过,结果一样
DMA2 Channel4 Stream3 Stream6
DMA2 Channel11 Stream0 Stream5
都试过,也是一样的结果
caojin85cn 回答时间:2018-2-21 12:27:03
已解决,Cache数据一致性问题

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2 结帖奖励

查看全部评分

hlb007 回答时间:2018-3-6 17:21:41
老哥,你这个问题已经解决了吗?这边倒不是发现数据异常就是把BSP_SD_ReadBlocks换成了BSP_SD_ReadBlocks_DMA之后然后顺便把while(BSP_SD_GetCardState()!= MSD_OK)注释了,f_open就返回说没有文件系统了,有点费解
hlb007 回答时间:2018-3-6 17:22:50
  1. DRESULT SD_read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
  2. {
  3.   DRESULT res = RES_ERROR;
  4.   uint32_t timeout = 100000;

  5.   if((unsigned int)buff % 4)
  6.   {
  7.           buff = buff;
  8.   }

  9.   if(BSP_SD_ReadBlocks_DMA((uint32_t*)buff,
  10.                        (uint32_t) (sector),
  11.                        count) == MSD_OK)
  12.   {
  13. //    while(BSP_SD_GetCardState()!= MSD_OK)
  14. //    {
  15. //      if (timeout-- == 0)
  16. //      {
  17. //        return RES_ERROR;
  18. //      }
  19. //    }
  20.     res = RES_OK;
  21.   }
  22.   
  23.   return res;
  24. }
复制代码

caojin85cn 回答时间:2018-6-28 17:37:33
hlb007 发表于 2018-3-6 17:21
老哥,你这个问题已经解决了吗?这边倒不是发现数据异常就是把BSP_SD_ReadBlocks换成了BSP_SD_ReadBlocks_DMA ...

我这个只是测一下SD卡读写的,并没有使用文件系统
我的问题是Cache一致性导致的,做一下Cache同步就可以了
你这个看起来是文件系统相关的,需要具体看一下文件系统对DMA读写的要求了
luo_18 回答时间:2018-9-6 19:42:12
caojin85cn 发表于 2018-6-28 17:37
我这个只是测一下SD卡读写的,并没有使用文件系统
我的问题是Cache一致性导致的,做一下Cache同步就可以 ...

请问下,楼主这个 cache是怎么一回事,怎么做同步呢,我的好像也是读写错误,需要加入延时才能成功。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版