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

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库。( u/ h: f, q5 `6 n& {0 [! a" ^
这个BUG是在DFPF7 2.9.0版本发现的。查看了其他系统的HAL代码几乎一致,因此也应该存在BUG。1 D. Q8 }& u. `

/ {6 B3 g1 d. A  u5 v1 t希望给使用SDIO、SDMMC功能有异常的网友有所帮助。
3 H1 j6 N0 O; E+ u9 E, ~
, E$ U+ m4 V1 X0 I, b7 [! ^环境:WIN7 64bit + MDK5.22
6 |& o# L; k& O3 K* S9 q硬件:stm32F7 DISCO (F746)5 x5 _% W/ A4 }* W' Z, p
使用HAL库对TF进行读取操作,
+ N( ?: t/ j1 B% _$ t. P3 }; @/ d方式MA
) J2 X; l3 F/ s! x2 U" v0 W中断函数:直接调用HAL库的处理函数。
& J, ]2 {% O: j8 M  B- O. H. y$ l
" \2 N% ~# j/ K% |
  BUG1:没用使用中断读数据时,当FIFO至少有8个字节时,触发SD_Read_IT(),其中的tmp = (uint32_t*)hsd->pRxBuffPtr的指针没初始化,为0
+ N2 J% Y+ Z. ]1 H3 N! ^" x" K- ^
  BUG2:开启DMA后,当执行DMA中断会不明原因出现DTIMEOUT标志置位,将执行if((hsd->Context & SD_CONTEXT_DMA) != RESET)

  ~7 g- o$ {! z% P4 q
  if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK)会对hsd->hdmarx = NULL;造后续DMA无法正常使用,从面导致FIFO数据无法及时读出,

% c, E' ^1 ]9 |& F  q9 Y% E
  最终导致FIFO数据超出8个,置位,导致BUG1产生。
5 d2 ?0 r/ D" {/ U% q
6 t6 A6 T2 `9 {6 |: j
具体发现问题过程如下:
- w7 i( ^* x, l! h4 G1 n, M- n% J. D3 x: Y3 a* M- ?( w
V1.01  20171227

! Y6 N* m) v" F. q) V, u
1.通过Show Caller Code功能查找在开DMA传输SD数据时,偶发进入HardFault_Handler中断的异常,发现以下情况:
4 y" h% l/ S/ b  L! Y' z0 b
  a.HAL_NVIC_EnableIRQ(SDMMC1_IRQn)开中断后,SDMMC产生的中断调用库函数HAL_SD_IRQHandler。
3 A8 N3 K, ~- N* |% F7 u* C0 E
  b.HAL_SD_IRQHandler函数会判断SDMMC_IT_RXFIFOHF标志位,如有效则执行SD_Read_IT(hsd)。
: m) r( O9 \+ h
  c.当传输数据开始时,SDMMC_FIFO数据大于8个时,且有其它错误中断产生时,如超时,进入SDMMC1_IRQn。
. J+ k0 t7 J2 R! }/ g
  d.进入中断后,执行SD_Read_IT(hsd),其中的tmp = (uint32_t*)hsd->pRxBuffPtr;(因为代码没有使用IT方式读取数据,所以该指针没有初始化)

3 H* M1 i) @5 G" m0 z# \) K9 t
  e.hsd->pRxBuffPtr在之前并没有初始化,在调试时发现值为0,在读取数据时就会改写地址为0数据,最终会出现HardFault_Handler。
5 w9 D; ]! |0 q1 ~
  f.调试发现,操作过程中会出现两次TIMEOUT中断,随后HFIFO置位,下个超时中断进来后会进入HFIFO处理流程,SD_Read_IT
) \$ X  B7 ^. f" A* [! U
  g.自编写SD的中断函数,不对FIFOHF进行判断,出现错误时,只清标志位,关中断,然后退出

4 K9 }$ n7 E3 D# ~" r- Q# u
2.HAL2.9.0库的SD中断函数有BUG,
2 p2 q# Z0 I/ N
  BUG1:没用使用中断读数据时,当FIFO至少有8个字节时,触发SD_Read_IT(),其中的tmp = (uint32_t*)hsd->pRxBuffPtr的指针没初始化,为0

# ]4 `4 M' O* `) D* d' W% i
  BUG2:开启DMA后,当执行DMA中断会不明原因出现DTIMEOUT标志置位,将执行if((hsd->Context & SD_CONTEXT_DMA) != RESET)
" t! b9 S5 h3 X& f$ V
  if(HAL_DMA_Abort_IT(hsd->hdmarx) != HAL_OK)会对hsd->hdmarx = NULL;造后续DMA无法正常使用,从面导致FIFO数据无法及时读出,
# m" [8 \2 a2 x1 n0 t
  最终导致FIFO数据超出8个,置位,导致BUG1产生。

0 G7 K) m2 w( c( q% R9 b0 b* @2 |/ \( N
收藏 评论7 发布时间:2018-1-10 18:31

举报

7个回答
ldskendy 回答时间:2018-2-5 09:33:30
zero99 发表于 2018-2-1 09:29
0 V' B+ `* u  {( d1 S, X) [来晚了,感谢支持,已汇总到1月技术原创6 A( k3 Y* f' c$ G/ c
https://www.stmcu.org.cn/module/forum/thread-614550-1-1.html ...
* t* U2 D. B# T: B
谢谢支持,稍后再发一个FW_F7_V1.9.0的USB鼠标的小小BUG
creep 回答时间:2018-1-11 09:17:11
上次你发邮件反馈的bug有回复了没?
/ Q! I; b4 F  S, Y/ {7 N这个官方提供的SDIO驱动我也在用,不过只简单的用到了DMA中断读,写只是测试了下没发现问题。! K3 Y: l! W/ C( m) B* V8 J! ~; |
我测试比较简单都没注意到你说的这些bug。
ldskendy 回答时间:2018-1-11 21:39:51
creep 发表于 2018-1-11 09:179 i% {  D' Z* f: ^! J/ h- W' u8 x
上次你发邮件反馈的bug有回复了没?' M& q& ]# \/ p1 @% |) t6 V
这个官方提供的SDIO驱动我也在用,不过只简单的用到了DMA中断读,写只 ...
8 D1 M% t% g! x( J) e$ J2 S; L( l
上次的回复了,确认了第一个是笔误,第二个是代码还有不完善的地方。
9 N, @  N% [( G3 q- i- M这次的这个BUG,可能只对一些TF存在,我用的是1G的TF卡。7 }- P6 W4 P8 }8 J, t+ f' w- q
如果产生超时中断就会激这两个BUG,如果不产生超时中断就没事。
creep 回答时间:2018-1-11 22:28:46
ldskendy 发表于 2018-1-11 21:39
: R5 i4 ]: R0 o9 ^/ p6 b1 L上次的回复了,确认了第一个是笔误,第二个是代码还有不完善的地方。
3 u) R; @  D/ S1 m" B这次的这个BUG,可能只对一些TF存在 ...

2 X) g# X: _; w, n1 f4 F嗯,我测试的是闪迪的16G和Netac的8G的TF卡,目前还没有发现bug。
zero99 回答时间:2018-2-1 09:29:50
来晚了,感谢支持,已汇总到1月技术原创% O2 B) }. M8 g0 i0 b
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 手机版