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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版