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

STM32F429使用DMA往TF卡写数据,出现DMA的FIFO ERROR中断

[复制链接]
kang1012-114779 提问时间:2017-11-1 13:38 /
公司项目使用TF卡存数据,接口为SDIO,使用DMA的方式写数据,每2s写组数据,每次大概有150kbyte,长期跑一晚上,写入tf卡中的文件会有部分文件损坏,需要插到电脑上,使用chkdsk恢复,原因不明,后单步调试,发现每次DMA写数据都出现DMA的FIFO ERROR,不知道是否有关系,不知论坛上高手大神是否也碰到此问题。有何解决方案。
收藏 1 评论3 发布时间:2017-11-1 13:38

举报

3个回答
wolfgang2015 回答时间:2018-1-10 16:56:09
DMA溢出了?
是不是FIFO不够大
2s, DMA能传输不少东西了。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

ldskendy 回答时间:2018-1-10 18:17:22
DMA的FIFO错误就不清楚了,如果是SDIO的FIFO错误我可能知道一些问题。下面是我当时做TF数据传输的笔记,使用有的HAL库版本是F7 DPF2。9。0的,
V1.01  20171227
1.通过Show Caller Code功能查找在开DMA传输SD数据时,偶发进入HardFault_Handler中断的异常,发现以下情况:
  a.HAL_NVIC_EnableIRQ(SDMMC1_IRQn)开中断后,SDMMC产生的中断调用库函数HAL_SD_IRQHandler。
  b.HAL_SD_IRQHandler函数会判断SDMMC_IT_RXFIFOHF标志位,如有效则执行SD_Read_IT(hsd)。
  c.当传输数据开始时,SDMMC_FIFO数据大于8个时,且有其它错误中断产生时,如超时,进入SDMMC1_IRQn。
  d.进入中断后,执行SD_Read_IT(hsd),其中的tmp = (uint32_t*)hsd->pRxBuffPtr;(因为代码没有使用IT方式读取数据,所以该指针没有初始化)
  e.hsd->pRxBuffPtr在之前并没有初始化,在调试时发现值为0,在读取数据时就会改写地址为0数据,最终会出现HardFault_Handler。
  f.调试发现,操作过程中会出现两次TIMEOUT中断,随后HFIFO置位,下个超时中断进来后会进入HFIFO处理流程,SD_Read_IT
  g.自编写SD的中断函数,不对FIFOHF进行判断,出现错误时,只清标志位,关中断,然后退出

2.HAL2.9.0库的SD中断函数有BUG,
  BUG1:没用使用中断读数据时,当FIFO至少有8个字节时,触发SD_Read_IT(),其中的tmp = (uint32_t*)hsd->pRxBuffPtr的指针没初始化,为0
  BUG2:开启DMA后,当执行DMA中断会不明原因出现DTIMEOUT标志置位,将执行if((hsd->Context & SD_CONTEXT_DMA) != RESET)
  if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK)会对hsd->hdmarx = NULL;造后续DMA无法正常使用,从面导致FIFO数据无法及时读出,
  最终导致FIFO数据超出8个,置位,导致BUG1产生。

评分

参与人数 1蝴蝶豆 +5 收起 理由
zero99 + 5

查看全部评分

juky2008 回答时间:2018-2-18 19:53:18
我也碰到DMA FIFO溢出的问题,楼主解决了吗?

所属标签

相似问题

官网相关资源

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