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

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

[复制链接]
STMCU小助手 发布时间:2021-12-22 14:33
stm32H7 hal库错误内容汇总:0 t; \6 s! M) _- M7 c
1. I2S: K& V6 [7 H# L) a6 m; r
  1. HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
    & v: O% J0 P/ r' L  C
  2. 函数内部有一个判断% p' D* H9 m$ b) s$ A& a
  3. if (hi2s->State == HAL_I2S_STATE_READY)  {, q" v" S$ ]$ f7 L1 E( ?5 v
  4.     __HAL_UNLOCK(hi2s);' K/ ^" y. k4 Q0 D' I) Q& V: F" P
  5.     return  HAL_BUSY;/ z+ S3 a5 @( N* }/ V
  6.   }
    ) Y9 k! F) \3 J! i
  7. 函数8 d6 Q/ K  p1 v: E( G! J
  8.    HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, uint16_t Size)
    ( h2 q( v/ J+ l5 R$ P0 @9 Z/ I4 h
  9. {
    / u8 t8 s$ d+ q, a
  10.   if (hi2s->State == HAL_I2S_STATE_READY); v/ l' G) q7 M0 H' l  j
  11.   {
    2 C. ^) a( D. D3 W) X2 E" p$ o
  12.     __HAL_UNLOCK(hi2s);! `: W! q& O" g, b( h
  13.     return  HAL_BUSY;
    9 }1 n% k* q/ i8 n# S
  14.   }  ]  J: u( o4 @
  15.   中同样有
复制代码
应该改为:
/ G& z4 w2 {' N4 I& n
  1. if (hi2s->State != HAL_I2S_STATE_READY)
复制代码
  t, f  z, Q8 b
2.寄存器定义- Q* e5 [- R9 z! P+ g$ |% d! l
我用的HAL库版本为V1.2.0;+ E% k; n6 [+ E
其中Device中的STM32H743XX.h中寄存器定义错误。
- O& T- q4 i# L: _
  1. #define SPI_I2SCFGR_WSINV_Pos       (12U)                                      % M. e+ {' m+ y0 ~( c
  2. #define SPI_I2SCFGR_WSINV_Msk       (0x1U << SPI_I2SCFGR_WSINV_Pos)            /*!< 0x00001000 */0 v9 r3 P; g9 U- X' `, s$ P, r
  3. #define SPI_I2SCFGR_WSINV           SPI_I2SCFGR_WSINV_Msk                      /*!<Word select inversion                             */
    1 q8 ^  I( `' m% n- R
  4. #define SPI_I2SCFGR_FIXCH_Pos       (13U)                                      
    3 @, ^1 T$ W' r3 [) t0 O
  5. #define SPI_I2SCFGR_FIXCH_Msk       (0x1U << SPI_I2SCFGR_FIXCH_Pos)            /*!< 0x00002000 */5 T; t( p6 q! ?/ O9 n$ a
  6. #define SPI_I2SCFGR_FIXCH           SPI_I2SCFGR_FIXCH_Msk                      /*!<Fixed channel length in SLAVE                     */8 ~- H% Y  p0 X
  7. #define SPI_I2SCFGR_DATFMT_Pos      (12U)                                      8 _0 f' s# ^2 h# `0 q
  8. #define SPI_I2SCFGR_DATFMT_Msk      (0x3U << SPI_I2SCFGR_DATFMT_Pos)           /*!< 0x00003000 */. P- u2 W) i; ?: \5 O
  9. #define SPI_I2SCFGR_DATFMT          SPI_I2SCFGR_DATFMT_Msk                     /*!<Data format   
复制代码

" u" b. M- O; Q# U! E
20200303181433808.png
$ b. s9 e5 k, U- ]: r. |
$ v  \- l% s+ V1 P) t
$ ^$ P6 d7 L( q$ G( b
跟寄存器定义不同。4 W) e% g$ k! C: s( w, a. I6 q% A: f

$ S* q$ s7 ?! H2 D所以最好使用新的固件库,但项目之前用的旧固件库,并且没有用到I2s。: ^0 A! w+ J- V$ M" ~
9 j4 o$ Q  v6 O6 G7 Z: V" |
还是关于I2S的坑,这次使用的HAL库版本是在官网下载的最新版本! V- n6 N; x5 O/ \9 t
FW_H7_V1.5.0.在使用全双工I2S时,需要包含
' ~* S  Q9 n$ p' Rstm32h7xx_hal_i2s_ex.h 头文件
5 s/ _7 a' R2 X% g但是
4 x* F& U3 j% m1 r0 G- F
20200413000719519.png
, |+ c! Y4 e5 U' C, }
* y, D3 r! s: \2 K* ]0 o9 M7 c+ n( @( {* q& A
图中宏定义根本找不到 ,自己添加宏定义后一堆错误 我也是服了。% S5 }1 {0 o0 D8 ~. q: y
有了SAI就对I2S这么不上心吗?* \: u) q( A  j+ ]1 M: W) K" o
3.USB device卡死在HAL_PCD_IRQHandler中导致主程序无法运行
% P& Y, |: I: u8 [但并未出现错误
9 \9 B3 D7 C/ N0 l8 ~; H8 B: P$ @0 E调试发现* V  R1 J3 A4 L
程序一直进USB_OTG_DIEPINT_TXFE 即TX FIFO 为空中断
* N+ X+ N' D3 w3 h, K既然如TX FIFO 后 正常逻辑需要往TX FIFO 中填充数据 测试发现并没有,
  H- _7 t9 `# b* r; A- b* }- i7 @发现 (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) 刚好等于len32b导致条件不满足- M  R% ?1 f& h& [& Y6 d
又一直进FIFO为空中断 一直在中断中运行 形成死机现象
. ]% Z5 h' K% c对比 HAL库1.5.0发现此处已更改为>=: m$ M! V2 l7 f$ e6 S7 z  o9 ?
更改后不会死机 但是 USB连接不上时仍需重启
" B1 k: D+ i" N+ T% K( o' N, Y库文件原代码 此BUG在F4驱动库中也存在 已更改
) p$ r1 V: q. k1 f1 }
  1. PCD_WriteEmptyTxFifo 函数
    1 q0 F1 R, `* G$ q( z
  2. ' B! [: @6 e' ^  [( d6 s# D
  3. static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)% c* y& ^4 A' Q- x, s
  4. {
    3 {5 G" o* E. D
  5.   USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;  5 }3 o9 j9 m2 [3 g* ~  q
  6.   USB_OTG_EPTypeDef *ep = NULL;
    6 D$ R2 B  x9 I4 Q1 p. k
  7.   int32_t len = 0U;0 R8 f" ?, b$ Z) T
  8.   uint32_t len32b = 0U;
    ' a* H2 o, p4 t- P2 g) D  b1 P
  9.   uint32_t fifoemptymsk = 0U;
    % `3 o6 X4 s0 m8 {
  10. 4 A1 O/ h$ v* J- F& u
  11.   ep = &hpcd->IN_ep[epnum];1 j# a" z) v+ ^' B4 f8 o4 \
  12.   len = ep->xfer_len - ep->xfer_count;
    9 A/ h: {. n8 \9 Z9 |# e/ {# U

  13. . B, q% E* G( Z  X. b6 z7 J
  14.   if (len > ep->maxpacket)- }7 H3 f  [& J9 ?$ p
  15.   {
    4 U4 I3 v: h$ N8 ^6 [$ u* G
  16.     len = ep->maxpacket;' U" p  ^% A2 D8 Y
  17.   }
    # o0 {& f% ?4 W5 C% s' @; P

  18.   H/ r" A: v! ^8 b; w( H% Q

  19. + ~! X0 @9 j; q' L$ \
  20.   len32b = (len + 3) / 4;
    7 Z& Q( I8 a  l
  21. # X5 \$ H" b' Z$ z
  22.   while  ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b &&6 z8 X( R  [& ~& e+ J; E0 |
  23.           ep->xfer_count < ep->xfer_len &&
    + b/ f! O* d2 T' e  R3 S
  24.             ep->xfer_len != 0)
    + w4 H- ?5 F9 f! L( _8 s
  25.   {
    5 Q+ u& D. p( J' z' @3 ^  I7 D& x7 X
  26.     /* Write the FIFO */
    . f2 a7 h6 O/ m6 f4 }
  27.     len = ep->xfer_len - ep->xfer_count;8 {+ v$ f2 I' R" O9 E  B! S

  28. " C- R3 ]9 ?8 e7 T% O. N
  29.     if (len > ep->maxpacket)# X7 @5 n; Z4 @$ i5 S8 ]/ s
  30.     {
    3 Y' J, p* [( x
  31.       len = ep->maxpacket;
    , a, d  P4 c' K2 R* Z1 V- u
  32.     }
    8 C" }+ x3 _# v: J1 ?# h
  33.     len32b = (len + 3) / 4;
    ; A4 H7 o- H6 g" M
  34. # C1 A! X) Y' n& p1 p/ x  r) c
  35.     USB_WritePacket(USBx, ep->xfer_buff, epnum, len, hpcd->Init.dma_enable); . m9 k+ K1 K4 q

  36. % k: n+ r0 M- ]0 U3 `' {
  37.     ep->xfer_buff  += len;
    # r" _( u2 t% j- ^
  38.     ep->xfer_count += len;: Q% D3 x3 Z5 w8 z9 k
  39.   }
    / e/ Q$ ?9 j% f9 C5 a

  40. 6 m7 M0 N! k  T% q3 v: |
  41.   if(len <= 0)
    4 u' S- i: q8 o8 {2 _
  42.   {: s6 R: ^+ X9 E# w
  43.     fifoemptymsk = 0x1 << epnum;
    5 R3 M9 C( L4 ^! R) C9 k4 d
  44.     USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;
    * b9 t: l" l$ C9 ]
  45. & `8 L2 Z) a" P$ }. I2 ^
  46.   }+ U# t0 G6 U& d9 J1 B3 _1 G% W
  47. ; k9 h- |+ u! s
  48.   return HAL_OK;  
    # M. C, F3 E1 S: r
  49. }
复制代码
6 F: J% F. G/ X# w2 y4 h$ y
需要更改为
! h' X# S  W: C7 y0 A1 Y9 T0 U
  1.           while  ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b &&
    5 N, [; \! g4 z. C1 q
  2.                           ep->xfer_count < ep->xfer_len &&4 }8 P7 D- V5 [$ V) `3 f2 v+ J
  3.                                 ep->xfer_len != 0)
复制代码
不然会一直进中断但又出不来$ q: B1 h; D! J9 w, M2 D3 L" {$ M

6 d' [5 r+ J0 O1 L总结: 能用最新的HAL库就用最新的吧 可以避免很多坑
8 r8 ?; i6 l& o3 I/ y( k; x实在不行可以结合寄存器版本的函数来写,直接写寄存器还是比较靠谱,但是要参照HAL的流程
3 y1 w( O# c' i( p
2 b. k3 \) c! c( R3 q/ }: U: e) a( h! h$ e' H& \6 h+ k+ ]$ o
: O. j' P: b9 z
# Z) x) i' g6 ?* e) Q, i
赞 收藏 评论0 发布时间:2021-12-22 14:33

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版