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

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

[复制链接]
STMCU小助手 发布时间:2021-12-22 14:33
stm32H7 hal库错误内容汇总:
  r" V; |: z- u# V0 K! @1. I2S
1 i# a! E. c& E1 @
  1. HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
    $ c/ \2 v2 h# @1 ^6 ]3 ^
  2. 函数内部有一个判断5 H4 k( \3 z+ b' y2 x
  3. if (hi2s->State == HAL_I2S_STATE_READY)  {
    7 S# n+ y: N/ f+ S. v4 t
  4.     __HAL_UNLOCK(hi2s);
    2 Z) F# s3 }# L
  5.     return  HAL_BUSY;: U2 Y: B' O1 n. L) N' [, ]4 X
  6.   }
    ! M: u0 D1 A' P/ F0 ]
  7. 函数2 d8 E. h0 ]+ c7 E
  8.    HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, uint16_t Size)  J; m% J* W1 _1 A( `6 i+ }
  9. {8 m' B7 I* i7 z7 {8 `
  10.   if (hi2s->State == HAL_I2S_STATE_READY)
      f0 K- L& l3 n
  11.   {% @  j3 R3 U  l
  12.     __HAL_UNLOCK(hi2s);
    8 A, g$ e3 w4 d+ o* z0 j7 k
  13.     return  HAL_BUSY;; X5 s- Y4 v  U% _  O+ w
  14.   }
    ' n5 ?1 Q  |# F- k2 h' a
  15.   中同样有
复制代码
应该改为:& w3 C/ n/ a% l8 X
  1. if (hi2s->State != HAL_I2S_STATE_READY)
复制代码

/ c, E" A3 h5 u) t: c  `" p2.寄存器定义
# L6 e! n7 O+ q. h我用的HAL库版本为V1.2.0;
2 B8 [. |& T4 b& N" I# }  c8 `其中Device中的STM32H743XX.h中寄存器定义错误。" Z! o' Y) H0 |
  1. #define SPI_I2SCFGR_WSINV_Pos       (12U)                                      
    5 p2 y4 t8 l- h) j$ }$ `+ m9 Z7 N
  2. #define SPI_I2SCFGR_WSINV_Msk       (0x1U << SPI_I2SCFGR_WSINV_Pos)            /*!< 0x00001000 */# x* ?8 B( i' d) g
  3. #define SPI_I2SCFGR_WSINV           SPI_I2SCFGR_WSINV_Msk                      /*!<Word select inversion                             */# t1 X1 p9 z8 J, q
  4. #define SPI_I2SCFGR_FIXCH_Pos       (13U)                                      
    + P/ j5 J, z* l
  5. #define SPI_I2SCFGR_FIXCH_Msk       (0x1U << SPI_I2SCFGR_FIXCH_Pos)            /*!< 0x00002000 */0 G3 a) g8 ^! r2 x
  6. #define SPI_I2SCFGR_FIXCH           SPI_I2SCFGR_FIXCH_Msk                      /*!<Fixed channel length in SLAVE                     */
    ! a" @% I% t0 v# `
  7. #define SPI_I2SCFGR_DATFMT_Pos      (12U)                                      
    % n  d) j) D" J& `+ P
  8. #define SPI_I2SCFGR_DATFMT_Msk      (0x3U << SPI_I2SCFGR_DATFMT_Pos)           /*!< 0x00003000 */
    ( u$ Y. E  W2 w# k
  9. #define SPI_I2SCFGR_DATFMT          SPI_I2SCFGR_DATFMT_Msk                     /*!<Data format   
复制代码
8 G+ y( v* }, J# v# g) u1 D
20200303181433808.png
5 K$ E+ _1 H/ @6 a9 W

/ g* [9 j) A, n# j# R
4 Z% m+ M* e7 Y( _6 X2 Y跟寄存器定义不同。* C( ~$ ~9 U0 q4 F

/ b+ j, S) Y! y/ _% f4 `" f( g所以最好使用新的固件库,但项目之前用的旧固件库,并且没有用到I2s。1 X+ }# x; Q5 g

$ H  f% J4 A) q/ D" c还是关于I2S的坑,这次使用的HAL库版本是在官网下载的最新版本. ?6 s$ D3 o5 Z. C8 A
FW_H7_V1.5.0.在使用全双工I2S时,需要包含6 @9 U5 E% b* ]5 c- t- J8 M
stm32h7xx_hal_i2s_ex.h 头文件0 _  @+ z, ~9 P; r
但是
/ j4 B3 a" u! i  C! c
20200413000719519.png
6 T7 ?1 L& V6 c! k( y- C/ I
! m6 ^3 Z( L2 {3 U2 ^" a
图中宏定义根本找不到 ,自己添加宏定义后一堆错误 我也是服了。& U) p6 r+ |+ R
有了SAI就对I2S这么不上心吗?
, v$ {  O4 j& r# ?! `( ^2 O3.USB device卡死在HAL_PCD_IRQHandler中导致主程序无法运行$ `8 d' C2 ?: H
但并未出现错误* J  J) N: S, L3 M2 V9 [1 E- z
调试发现4 l* {' C- N+ ^2 D
程序一直进USB_OTG_DIEPINT_TXFE 即TX FIFO 为空中断* F9 d3 M& |: T  |' S2 A& ?
既然如TX FIFO 后 正常逻辑需要往TX FIFO 中填充数据 测试发现并没有,
0 F& N: P9 P+ |发现 (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) 刚好等于len32b导致条件不满足
9 y% r  b) O/ Z  s6 w2 s& R又一直进FIFO为空中断 一直在中断中运行 形成死机现象
  d& V' U# P) I9 r: g对比 HAL库1.5.0发现此处已更改为>=  ^/ r# C$ O. q
更改后不会死机 但是 USB连接不上时仍需重启
- }2 d2 N, }$ l! j6 ~库文件原代码 此BUG在F4驱动库中也存在 已更改
- _  e3 Z& ^5 x$ V+ A) K2 ~; Z
  1. PCD_WriteEmptyTxFifo 函数
    $ C( X" h# ~8 `9 e4 _" H9 T/ ]
  2. 0 S/ A, O9 p# g0 A4 B, E4 |+ [# J. p. X
  3. static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)
    9 |9 }- U! j6 {6 {' U5 z; Z
  4. {* T. j8 v3 {7 w& `  J. ?+ g
  5.   USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;  , w% m/ k. U, M9 |8 k6 P8 Y
  6.   USB_OTG_EPTypeDef *ep = NULL;1 }3 V1 ?/ t6 i; }( {, ?
  7.   int32_t len = 0U;3 D" [* F' o/ F/ f6 x8 N
  8.   uint32_t len32b = 0U;
    2 t- {' t2 d' ~& p& n
  9.   uint32_t fifoemptymsk = 0U;3 h2 E7 N- R7 D1 V# b* t  H* C

  10. 4 g( P! e4 T# M
  11.   ep = &hpcd->IN_ep[epnum];
    - Y. O4 M2 k# b* H) Q, U# g
  12.   len = ep->xfer_len - ep->xfer_count;
    4 o2 @9 o( `( E& G5 ^  h, q( [$ O

  13. 7 O9 G* F1 h& Z0 @
  14.   if (len > ep->maxpacket), k7 p0 v& [* l* o6 V6 h  `" [
  15.   {4 \0 V; y5 r3 C  X/ K4 f
  16.     len = ep->maxpacket;( o+ p* l1 v8 W: d' j
  17.   }
    % q3 F' X& E" U9 M

  18. 2 y- `/ C+ P& }

  19. 1 M/ ~. y: G* g7 ^2 @5 m
  20.   len32b = (len + 3) / 4;" z+ @9 I* Q' {" B5 u* u) U  `% C$ x
  21. % V8 f, q5 D" V2 b# }
  22.   while  ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b &&
    ( r3 g# l, M9 {8 |7 g/ a3 |
  23.           ep->xfer_count < ep->xfer_len &&
    % O& e# L& M- Y) A
  24.             ep->xfer_len != 0)
    ! h! }( n6 J+ s. h! g
  25.   {
    1 o! e2 O3 b4 c! M, N1 e2 r5 |
  26.     /* Write the FIFO */# c% k7 p: v7 e/ f9 n; V
  27.     len = ep->xfer_len - ep->xfer_count;
    2 C5 `3 Z9 Y* @) X- M
  28. 8 q* }( Z: [1 p; |
  29.     if (len > ep->maxpacket)2 ~/ D. i2 X4 l8 M$ V4 x% i
  30.     {
    + L& r+ {: E! j2 ~; M& i- d- _8 R
  31.       len = ep->maxpacket;9 P, M+ s( ?! y8 Q6 J& d! h: \3 _7 Z
  32.     }
    & T; _6 f: t' S. T8 R4 w; J; \
  33.     len32b = (len + 3) / 4;3 v% s8 ~- W5 D, r
  34. 2 y0 u" G4 ^6 l
  35.     USB_WritePacket(USBx, ep->xfer_buff, epnum, len, hpcd->Init.dma_enable);
    2 O6 c- G" g9 f9 i  U: a( p# y+ |

  36. 5 Y: u3 p8 h9 K% B! Q5 V8 p2 t9 p
  37.     ep->xfer_buff  += len;5 C! g: \0 O5 D) F& ]4 r" E
  38.     ep->xfer_count += len;
    - k1 A7 U* O4 q+ t
  39.   }/ b$ ?% \' ^9 ~& I

  40. ; K6 Q0 ?9 O" a; k) ?% j2 U& f
  41.   if(len <= 0)
    9 R' A# D' i- k6 @# b5 }; S
  42.   {
    . {) k  o% H( p+ l
  43.     fifoemptymsk = 0x1 << epnum;
    2 F* g/ U9 H9 ?- @: n
  44.     USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;! J. g0 z/ q6 q) p: P' N3 I2 ~
  45. # Y8 I+ e$ w$ ~# W% A+ f
  46.   }
    0 N3 y( P, m5 f. }! s

  47. % `' Q' Y, q& ^1 Y, ]  ^% g
  48.   return HAL_OK;  6 M4 F1 l; J$ R  V
  49. }
复制代码

. G' s) r! ]2 n( B) |3 G. U& O需要更改为
6 {, D+ W3 R$ J6 j) D7 \( t# s
  1.           while  ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b &&
    : d: P$ h' [; ^, o7 H
  2.                           ep->xfer_count < ep->xfer_len &&
    8 E/ ]% m" N/ o/ a( r0 j
  3.                                 ep->xfer_len != 0)
复制代码
不然会一直进中断但又出不来2 h2 N# {8 q  C5 ?

* J6 p: j3 C8 c* Q& h- w- @7 D总结: 能用最新的HAL库就用最新的吧 可以避免很多坑
2 U6 c! d8 {& U! R  [+ o+ Y6 U实在不行可以结合寄存器版本的函数来写,直接写寄存器还是比较靠谱,但是要参照HAL的流程
! G1 f7 H2 o7 e( }! t, p( C1 [& {6 x  |- T7 T
! O( w( M% e, t' f' N. Z! x8 `5 `5 i
2 C5 t0 P3 O7 T5 H- F  i: `. G
8 X9 W% ?2 ]" i8 C' a( c$ x& E
收藏 评论0 发布时间:2021-12-22 14:33

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版