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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版