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

【经验分享】STM32H7 HAL库错误内容!!!

[复制链接]
STMCU小助手 发布时间:2021-12-22 14:33
stm32H7 hal库错误内容汇总:
2 H# [' m* y" F, A  t1. I2S
( w$ V* G" m- W# L5 c& L% K
  1. HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
    , S; Z, o/ C, ~' J
  2. 函数内部有一个判断
    ) _! j) `9 V+ W0 a
  3. if (hi2s->State == HAL_I2S_STATE_READY)  {, {3 Q) d& l( H! {1 G
  4.     __HAL_UNLOCK(hi2s);+ R% O0 F- L! U9 f2 p2 d- n' J0 ]
  5.     return  HAL_BUSY;( w0 n4 R" u% G5 o3 F! q+ F) z
  6.   }
    # r5 h# U$ @( ^
  7. 函数
    : q  ~$ Z% |- x. q% [; y
  8.    HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, uint16_t Size)
    ! x. X) j) C( G  C
  9. {9 i9 j& s4 l9 x% u  X" x. {7 \
  10.   if (hi2s->State == HAL_I2S_STATE_READY)4 G0 _/ t/ B, z* D% C
  11.   {
    8 K) a- u. u! f9 h
  12.     __HAL_UNLOCK(hi2s);( x4 V. u! u) U! b9 \; w5 _
  13.     return  HAL_BUSY;) g1 \: V/ ^- l* l! F3 g
  14.   }, Q; k, T6 @$ P7 O, S
  15.   中同样有
复制代码
应该改为:3 E: i& N9 Q8 R4 S# Q7 w. E6 Y2 I- w
  1. if (hi2s->State != HAL_I2S_STATE_READY)
复制代码
0 Z/ H+ O0 ~' X. ]8 d
2.寄存器定义
3 y% r* a, t7 w我用的HAL库版本为V1.2.0;
0 x8 x! u$ R. F& a' X, J8 ?其中Device中的STM32H743XX.h中寄存器定义错误。% R# |' U" l! ~% F' y( M- G
  1. #define SPI_I2SCFGR_WSINV_Pos       (12U)                                      
    - P" H0 I. H; }  }' l# D6 Q) j6 S
  2. #define SPI_I2SCFGR_WSINV_Msk       (0x1U << SPI_I2SCFGR_WSINV_Pos)            /*!< 0x00001000 */  p; C$ l- q  w% t
  3. #define SPI_I2SCFGR_WSINV           SPI_I2SCFGR_WSINV_Msk                      /*!<Word select inversion                             */
    6 b1 W' O% {' W  K2 i* H
  4. #define SPI_I2SCFGR_FIXCH_Pos       (13U)                                      
    : X6 k/ Y5 d% e2 A" f* K
  5. #define SPI_I2SCFGR_FIXCH_Msk       (0x1U << SPI_I2SCFGR_FIXCH_Pos)            /*!< 0x00002000 */
    8 ?4 b% b4 ?0 ?4 B+ i, m% a/ K# \
  6. #define SPI_I2SCFGR_FIXCH           SPI_I2SCFGR_FIXCH_Msk                      /*!<Fixed channel length in SLAVE                     */0 x0 U5 y4 _' J* {/ K* h9 K! X
  7. #define SPI_I2SCFGR_DATFMT_Pos      (12U)                                      9 a3 q8 R& X, l( N# k# u+ l6 A
  8. #define SPI_I2SCFGR_DATFMT_Msk      (0x3U << SPI_I2SCFGR_DATFMT_Pos)           /*!< 0x00003000 */" O% L$ y: p7 J9 ^1 r0 U/ u+ I: [9 ~
  9. #define SPI_I2SCFGR_DATFMT          SPI_I2SCFGR_DATFMT_Msk                     /*!<Data format   
复制代码
8 m4 V' l5 `; ?
20200303181433808.png
4 Z2 Q% [8 o) D% Y) G" T6 k
8 ]& r7 ^( v) ?3 D: Q- Y, O

( j$ s9 }" T. W跟寄存器定义不同。  |; ^3 M& F' P. p" {

: r' T4 m' _5 E' c! Z; Q: i+ q6 b所以最好使用新的固件库,但项目之前用的旧固件库,并且没有用到I2s。6 `* A6 I* @% p- E
1 Z) Q' F' }/ m; ~$ o3 T. u
还是关于I2S的坑,这次使用的HAL库版本是在官网下载的最新版本7 @* M4 s" a% ]$ T; E/ M7 n
FW_H7_V1.5.0.在使用全双工I2S时,需要包含
( |0 R. e$ J* Y  r' [/ n* Istm32h7xx_hal_i2s_ex.h 头文件' n, f3 V# o  N
但是
+ a( W5 c* Q0 ^& a/ S
20200413000719519.png
1 g( O( H7 e* ?7 i9 J: [

- x( S2 D) A& Y$ n- _! w# f+ T; q! b图中宏定义根本找不到 ,自己添加宏定义后一堆错误 我也是服了。: _# S( V$ \+ |7 q% w
有了SAI就对I2S这么不上心吗?/ m, j  m1 d, k9 L
3.USB device卡死在HAL_PCD_IRQHandler中导致主程序无法运行
7 L5 l) q# D4 m, I  u7 ^3 F4 [但并未出现错误
1 h1 f1 G2 Z+ ~$ a( |# `调试发现
9 }, l, S1 s1 @# J/ I程序一直进USB_OTG_DIEPINT_TXFE 即TX FIFO 为空中断
- S, w# {; j0 `6 {/ X既然如TX FIFO 后 正常逻辑需要往TX FIFO 中填充数据 测试发现并没有,
* u2 E' p- G. V  A8 z- K; h7 w发现 (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) 刚好等于len32b导致条件不满足
' G4 j/ Y! W3 d+ U" C又一直进FIFO为空中断 一直在中断中运行 形成死机现象1 e( C9 w8 o. e2 A/ y+ T
对比 HAL库1.5.0发现此处已更改为>=
6 E* P8 }: B7 d2 r( J! B更改后不会死机 但是 USB连接不上时仍需重启
7 k2 z  T: @/ d- {0 W( Z4 H$ v  l4 b库文件原代码 此BUG在F4驱动库中也存在 已更改: Y) A( z8 I9 z8 N
  1. PCD_WriteEmptyTxFifo 函数$ P3 H% u, f* O1 h0 A

  2. 4 ?* q" Q' F( \- e, G
  3. static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)
    + @1 y3 i. y5 J8 q
  4. {2 e) X6 `# q6 j1 c2 q) Q
  5.   USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;  " G! d  [0 E) x* |9 i4 i* q
  6.   USB_OTG_EPTypeDef *ep = NULL;
    7 S1 h: R6 j9 A$ D  L, n! M5 Z
  7.   int32_t len = 0U;
      e* z6 W! q6 o) L$ q$ x
  8.   uint32_t len32b = 0U;
    ) F# o! M' x! K* e4 h! V$ @* @4 L7 ^$ ^
  9.   uint32_t fifoemptymsk = 0U;
    0 R& j8 V) W9 H' a5 a  L- ?
  10. ! ^5 R! Y0 e4 @  q, P: E3 J8 l
  11.   ep = &hpcd->IN_ep[epnum];
    + F4 {5 Z2 g3 M! B0 T* x! e
  12.   len = ep->xfer_len - ep->xfer_count;
    . i( t, H! O& s7 C$ ^' ~) r7 g+ c
  13. ( k8 |8 L" ^% d; d* ]9 Y- j! F
  14.   if (len > ep->maxpacket)
    " r, J2 \1 w6 @& V' p
  15.   {/ Q7 M3 D9 r2 R
  16.     len = ep->maxpacket;" h) d$ ~7 C6 o% R0 Q
  17.   }
    + P' T% j- r% M

  18. 4 Z6 {; E( z' E8 Q) V9 l

  19. % z0 B6 o% \9 B( x& K0 j
  20.   len32b = (len + 3) / 4;2 S! m6 j) M- e
  21. : l/ E. O  Z9 ^: z# x, G4 x4 D& M2 o8 p
  22.   while  ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b &&
    $ H. o: a, {1 r# _7 p6 Y; ^
  23.           ep->xfer_count < ep->xfer_len &&7 [" M0 e$ h) ]5 e
  24.             ep->xfer_len != 0)% N4 c7 n# z8 t7 S. O
  25.   {
    0 x% l8 `6 l# k. Y% i; N) t9 b
  26.     /* Write the FIFO */4 k, `1 A2 P8 u& d9 K
  27.     len = ep->xfer_len - ep->xfer_count;
    ' W* i' {0 J; g

  28. - o6 R2 O! h& P/ T) B( M
  29.     if (len > ep->maxpacket)
    . L5 q; U0 z: L4 K6 ^6 V; E1 Y+ P5 i" \
  30.     {5 h$ A% O+ d+ c3 p' p0 `% m
  31.       len = ep->maxpacket;
    ' k$ g+ b3 F4 [
  32.     }
    - G  U- ~+ l9 H' j/ S4 y. d
  33.     len32b = (len + 3) / 4;2 k% y0 U3 o8 ^0 G3 f9 C
  34. + r6 p2 I$ D. ?. }7 J, r1 W
  35.     USB_WritePacket(USBx, ep->xfer_buff, epnum, len, hpcd->Init.dma_enable);
    * e" ~) L  c; Y5 b0 A2 w

  36. ' Y4 C. [& |, J, x/ ^: z& e! t
  37.     ep->xfer_buff  += len;3 J$ ^  P2 Z- H
  38.     ep->xfer_count += len;
      A+ p8 U  p7 Z7 }# \' x1 o
  39.   }5 v) w: p' B7 u8 b9 {

  40.   E* z* P4 [' t- W
  41.   if(len <= 0)* o# `: E! B4 `2 G8 ?$ R
  42.   {: u" C6 s; T6 b; o
  43.     fifoemptymsk = 0x1 << epnum;$ ^$ M4 [3 _. Z/ l+ D0 x
  44.     USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;7 ?. Q: e, X2 g4 F- @* M
  45. 9 w1 ?! U7 ]: @& g/ P! ]
  46.   }
    5 _' I" V, g; `, [( B

  47. ) y8 L3 e/ x% [; J. U8 u
  48.   return HAL_OK;  
    + B$ g) W7 P+ {  U
  49. }
复制代码
0 N7 u+ n, x0 K& m; X3 I" k# \1 E4 p
需要更改为
- j, _. ^  J$ p
  1.           while  ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b &&  F  ~( G. S' H% L: l$ @
  2.                           ep->xfer_count < ep->xfer_len &&5 V: I- s; d6 t9 e& r4 y8 q3 r
  3.                                 ep->xfer_len != 0)
复制代码
不然会一直进中断但又出不来1 R$ S2 H/ K: W, S; T

2 \* ]. c/ v3 L, p总结: 能用最新的HAL库就用最新的吧 可以避免很多坑; R7 A. a" Z) T$ w' L
实在不行可以结合寄存器版本的函数来写,直接写寄存器还是比较靠谱,但是要参照HAL的流程5 A" O( t; S; T4 ?0 f2 g

: [1 P' z3 J! o! {! M1 Q% s6 y5 {# H  ?( c

+ P" R& @: |9 M9 |, e1 U6 s& |  L9 T2 P' R3 F4 |# A! h3 X3 Z" W
收藏 评论0 发布时间:2021-12-22 14:33

举报

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