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

HAL库的BUG(F4、F7)_SDIO(SDMMC)

[复制链接]
ldskendy 发布时间:2018-1-10 18:31
这次公布一个HAL库的BUG,关于F4、F7的,版本是目前最新的CUBEF41.18.0和F7的DFP包里的,版本号是2.9.0,应该对应目前最新的CUBEF7库。
- a7 u+ h" p% {- M! @这个BUG是在DFPF7 2.9.0版本发现的。查看了其他系统的HAL代码几乎一致,因此也应该存在BUG。3 Y1 U  y7 h9 i' w' q0 h

0 i0 Q! T- e, F& M希望给使用SDIO、SDMMC功能有异常的网友有所帮助。
4 @/ O7 o9 \4 y3 q5 V" b% ^6 ^: W& b
环境:WIN7 64bit + MDK5.22- o% z3 C3 {0 N2 _7 E) E* L+ x
硬件:stm32F7 DISCO (F746)' Q! l3 G" L- n2 n1 F
使用HAL库对TF进行读取操作,0 n% b3 m0 C( q8 m+ s
方式MA- K6 `  Y6 {  v! e# k
中断函数:直接调用HAL库的处理函数。& J. u' w. t; _/ S( _6 ]
3 [! X& _4 D& V  h  j) n& h
  BUG1:没用使用中断读数据时,当FIFO至少有8个字节时,触发SD_Read_IT(),其中的tmp = (uint32_t*)hsd->pRxBuffPtr的指针没初始化,为0
  ~" K7 c" G9 o
  BUG2:开启DMA后,当执行DMA中断会不明原因出现DTIMEOUT标志置位,将执行if((hsd->Context & SD_CONTEXT_DMA) != RESET)
% b+ R5 G$ Q: m9 h3 ~& N: ~7 E; E' x
  if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK)会对hsd->hdmarx = NULL;造后续DMA无法正常使用,从面导致FIFO数据无法及时读出,

1 F7 I  u, }5 \8 S" C, m
  最终导致FIFO数据超出8个,置位,导致BUG1产生。

8 c. B+ w, m0 p5 E6 H
0 L9 h) Y1 o2 f9 M1 H0 X( O* p1 ]具体发现问题过程如下:
8 ^  _( p: b; G
( A1 A& M+ P" i8 X2 e' q  X( Y
V1.01  20171227
; f) ?" D# e% Y* F
1.通过Show Caller Code功能查找在开DMA传输SD数据时,偶发进入HardFault_Handler中断的异常,发现以下情况:
. j. R% V. U% H# ~& k% s
  a.HAL_NVIC_EnableIRQ(SDMMC1_IRQn)开中断后,SDMMC产生的中断调用库函数HAL_SD_IRQHandler。

8 E# W1 ?$ i  o/ R; @- O
  b.HAL_SD_IRQHandler函数会判断SDMMC_IT_RXFIFOHF标志位,如有效则执行SD_Read_IT(hsd)。
' |7 B5 G: {  D! W# _) Y
  c.当传输数据开始时,SDMMC_FIFO数据大于8个时,且有其它错误中断产生时,如超时,进入SDMMC1_IRQn。

6 @& q# n/ z5 {7 w& o9 s4 `* _
  d.进入中断后,执行SD_Read_IT(hsd),其中的tmp = (uint32_t*)hsd->pRxBuffPtr;(因为代码没有使用IT方式读取数据,所以该指针没有初始化)

* S( \  K9 V. U7 g3 Z" k$ ]( P
  e.hsd->pRxBuffPtr在之前并没有初始化,在调试时发现值为0,在读取数据时就会改写地址为0数据,最终会出现HardFault_Handler。

5 r# u4 x( R* g& f0 K+ A
  f.调试发现,操作过程中会出现两次TIMEOUT中断,随后HFIFO置位,下个超时中断进来后会进入HFIFO处理流程,SD_Read_IT
5 D3 `9 b. @2 z# M
  g.自编写SD的中断函数,不对FIFOHF进行判断,出现错误时,只清标志位,关中断,然后退出

; @6 M4 V( F$ S3 l
2.HAL2.9.0库的SD中断函数有BUG,
, i( @! ~& r& @- r5 A: w! h
  BUG1:没用使用中断读数据时,当FIFO至少有8个字节时,触发SD_Read_IT(),其中的tmp = (uint32_t*)hsd->pRxBuffPtr的指针没初始化,为0

9 g6 i4 d; V. B" X  U; c
  BUG2:开启DMA后,当执行DMA中断会不明原因出现DTIMEOUT标志置位,将执行if((hsd->Context & SD_CONTEXT_DMA) != RESET)

& Q2 `! a( d) Y# w
  if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK)会对hsd->hdmarx = NULL;造后续DMA无法正常使用,从面导致FIFO数据无法及时读出,

( s2 u- [# C4 D1 [# y* A; H9 a
  最终导致FIFO数据超出8个,置位,导致BUG1产生。
( U5 Y0 o& r/ O7 C" w
收藏 评论7 发布时间:2018-1-10 18:31

举报

7个回答
ldskendy 回答时间:2018-2-5 09:33:30
zero99 发表于 2018-2-1 09:29+ r$ x1 J2 C( J8 T0 \
来晚了,感谢支持,已汇总到1月技术原创
; @! }* P7 n) k  }; Y2 |7 ~https://www.stmcu.org.cn/module/forum/thread-614550-1-1.html ...

8 v# e5 M3 m/ |- r2 w! ]7 A谢谢支持,稍后再发一个FW_F7_V1.9.0的USB鼠标的小小BUG
creep 回答时间:2018-1-11 09:17:11
上次你发邮件反馈的bug有回复了没?
7 l" e2 ~; B! W0 p这个官方提供的SDIO驱动我也在用,不过只简单的用到了DMA中断读,写只是测试了下没发现问题。7 H9 }5 S4 ]; o, I$ ?# _. [
我测试比较简单都没注意到你说的这些bug。
ldskendy 回答时间:2018-1-11 21:39:51
creep 发表于 2018-1-11 09:17# q% w' Y# r0 y+ j
上次你发邮件反馈的bug有回复了没?
! H+ o) H1 _- S4 P4 D7 ]这个官方提供的SDIO驱动我也在用,不过只简单的用到了DMA中断读,写只 ...
; U8 A& W2 K0 ~; u' R& q
上次的回复了,确认了第一个是笔误,第二个是代码还有不完善的地方。
  d1 L2 f! B" ^+ f+ U) |这次的这个BUG,可能只对一些TF存在,我用的是1G的TF卡。8 E+ Q: H& {( c# [2 B
如果产生超时中断就会激这两个BUG,如果不产生超时中断就没事。
creep 回答时间:2018-1-11 22:28:46
ldskendy 发表于 2018-1-11 21:39
9 [( p% D, ~1 B/ V9 E7 x6 A  J上次的回复了,确认了第一个是笔误,第二个是代码还有不完善的地方。
" _0 t/ Z( t% H这次的这个BUG,可能只对一些TF存在 ...
+ S" [0 g6 w; c, z' H  D2 C
嗯,我测试的是闪迪的16G和Netac的8G的TF卡,目前还没有发现bug。
zero99 回答时间:2018-2-1 09:29:50
来晚了,感谢支持,已汇总到1月技术原创* ~6 D6 t# {9 X
https://www.stmcu.org.cn/module/forum/thread-614550-1-1.html
luo_18 回答时间:2018-9-6 22:17:29
我现在用的也是stmf7的 hal 库,读写mmc经常出错
北斗stone 回答时间:2018-9-13 19:17:47
最近也用到F7的HAL库,搞了半天发现连写都没法写了,16年那会我拿F4的时候试着还好好的...

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版