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

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

[复制链接]
STMCU小助手 发布时间:2021-12-22 14:33
stm32H7 hal库错误内容汇总:' c* V& X- ~' z; g! @9 Q& r( {
1. I2S
$ F& E4 d  j7 J: N' W- X
  1. HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
    / F# }7 [; Y! X; j# Y8 M
  2. 函数内部有一个判断. g% ?9 N9 v6 n$ w
  3. if (hi2s->State == HAL_I2S_STATE_READY)  {: Z9 [/ L. Y# o7 v+ ~0 h4 o
  4.     __HAL_UNLOCK(hi2s);6 l. f% _& D3 |4 Z* R
  5.     return  HAL_BUSY;5 O! M3 T! b3 a: {& C. N
  6.   }
    , [5 c  }1 m% g, E& c6 o. C
  7. 函数. d& V' w% c- P% u) L
  8.    HAL_StatusTypeDef HAL_I2SEx_TransmitReceive_IT(I2S_HandleTypeDef *hi2s, uint16_t *pTxData, uint16_t *pRxData, uint16_t Size)
    - N6 H. x# B  f5 d% n, W& g  h: W9 h
  9. {, n7 B9 p9 G6 w
  10.   if (hi2s->State == HAL_I2S_STATE_READY)/ ~& O! U* @; W1 v# M- V
  11.   {: q# _" d* V; n: k
  12.     __HAL_UNLOCK(hi2s);
    - |" q$ S- ~+ L
  13.     return  HAL_BUSY;" O- j2 Y; Z6 s7 @! g" Z& \
  14.   }
    , }3 V1 l9 _' y
  15.   中同样有
复制代码
应该改为:
! {0 d' f( M% o0 m) G7 P
  1. if (hi2s->State != HAL_I2S_STATE_READY)
复制代码

  q+ H9 O7 ~* m% }- }% }! \2.寄存器定义
: Y$ b' L- W. t7 b5 y& H8 c我用的HAL库版本为V1.2.0;1 \; A6 O$ P4 e$ n1 U
其中Device中的STM32H743XX.h中寄存器定义错误。* x" P, L& r- v% Q
  1. #define SPI_I2SCFGR_WSINV_Pos       (12U)                                      
    + ?! i* O/ }* W4 j8 f5 ?% y
  2. #define SPI_I2SCFGR_WSINV_Msk       (0x1U << SPI_I2SCFGR_WSINV_Pos)            /*!< 0x00001000 */  z4 s  _+ o; ~6 ^) |9 z
  3. #define SPI_I2SCFGR_WSINV           SPI_I2SCFGR_WSINV_Msk                      /*!<Word select inversion                             */
    - `7 d9 k7 U3 P! a( u
  4. #define SPI_I2SCFGR_FIXCH_Pos       (13U)                                      
    . q6 u( c# J7 s' `8 w( x$ f; P
  5. #define SPI_I2SCFGR_FIXCH_Msk       (0x1U << SPI_I2SCFGR_FIXCH_Pos)            /*!< 0x00002000 */* Z0 i' u$ l0 Q' b
  6. #define SPI_I2SCFGR_FIXCH           SPI_I2SCFGR_FIXCH_Msk                      /*!<Fixed channel length in SLAVE                     */: l$ _' D+ n% ^) o3 C
  7. #define SPI_I2SCFGR_DATFMT_Pos      (12U)                                      
    & a. J, C3 W% V  P
  8. #define SPI_I2SCFGR_DATFMT_Msk      (0x3U << SPI_I2SCFGR_DATFMT_Pos)           /*!< 0x00003000 */' w& ^& W. \+ Y% g. S8 n
  9. #define SPI_I2SCFGR_DATFMT          SPI_I2SCFGR_DATFMT_Msk                     /*!<Data format   
复制代码
# o- c! r& u, `% ?3 e
20200303181433808.png

* h& A- Z2 f7 W' }5 X7 R" |
) `, d4 F2 M  a2 n4 d) l2 E3 q: D
( h) R* ^; d" N+ k4 X+ u跟寄存器定义不同。
# {+ x) |$ {9 @% P8 ~8 I
- V( O8 w' J" w. ~! {所以最好使用新的固件库,但项目之前用的旧固件库,并且没有用到I2s。
8 f3 h. P4 i5 l+ ?4 }, i0 q! D9 d1 E% J- C" P. n/ `/ Y7 P9 q
还是关于I2S的坑,这次使用的HAL库版本是在官网下载的最新版本$ Y) V, ^2 |( O- ?8 k0 E
FW_H7_V1.5.0.在使用全双工I2S时,需要包含
3 X; t7 c# t: {  X; Pstm32h7xx_hal_i2s_ex.h 头文件, Z$ }5 |' e4 v
但是
  r+ y' }. k! J8 d
20200413000719519.png

! g8 U9 b6 W, o; @3 ^3 r" @+ j9 w$ @7 U) F& H. w! E3 N: D+ Q
图中宏定义根本找不到 ,自己添加宏定义后一堆错误 我也是服了。
+ a- i4 a$ l! V5 \7 w3 [5 |0 V% P有了SAI就对I2S这么不上心吗?
4 J# ~  p8 v, X# h. P- ^3.USB device卡死在HAL_PCD_IRQHandler中导致主程序无法运行- Q  b  e  x8 q3 J" Y
但并未出现错误
; l* v& f7 l! [  j2 @调试发现: Z9 R; K8 t# u' N; E
程序一直进USB_OTG_DIEPINT_TXFE 即TX FIFO 为空中断
0 n) U1 g! K# P  n; G  L既然如TX FIFO 后 正常逻辑需要往TX FIFO 中填充数据 测试发现并没有,, o; t" S; W% a" _
发现 (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) 刚好等于len32b导致条件不满足7 ^- b5 p$ v6 z; p$ M" I# Z
又一直进FIFO为空中断 一直在中断中运行 形成死机现象
% X2 {; J# a+ ?# }9 @, k对比 HAL库1.5.0发现此处已更改为>=
. U8 D5 n" X. I* j* q更改后不会死机 但是 USB连接不上时仍需重启0 a4 H5 e. Z- v0 d9 {4 v$ G" P) S; f* k
库文件原代码 此BUG在F4驱动库中也存在 已更改0 ~0 r! O( d6 X9 H) S
  1. PCD_WriteEmptyTxFifo 函数
    6 _4 @1 S( p2 F3 f8 O

  2. 3 Y, j; s: b  o# @+ j( ]& [- J
  3. static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)
    . l" }4 s* \8 r) S& |4 n4 v
  4. {
    * ]/ U' k. e2 K
  5.   USB_OTG_GlobalTypeDef *USBx = hpcd->Instance;  % w! z' y; T" ~: q: |5 {
  6.   USB_OTG_EPTypeDef *ep = NULL;
    5 X( y" v; _( Q0 i2 H
  7.   int32_t len = 0U;/ \% J( F4 v& ?
  8.   uint32_t len32b = 0U;4 T" B% X: E9 n: F8 \
  9.   uint32_t fifoemptymsk = 0U;
    9 L4 k. ?5 `( N$ ^8 v2 h+ b$ j

  10. / T) q- i+ _* W1 H" B1 Y+ Y( _
  11.   ep = &hpcd->IN_ep[epnum];
    + H5 i+ q$ z) U4 B2 }7 l* c4 P7 O. L
  12.   len = ep->xfer_len - ep->xfer_count;7 m" k" U+ B5 a$ {" j+ R

  13. # J: I8 w1 n" Y
  14.   if (len > ep->maxpacket)7 {# j) P- i: j! _
  15.   {/ Q) z  a# ?" I. c
  16.     len = ep->maxpacket;) w4 H& S5 C( w8 E" l
  17.   }
    % \3 }( e' c* V! c7 m

  18. ! ]3 }: h: u$ T/ |
  19. 6 j& y6 Z' e1 }  Y: k9 x
  20.   len32b = (len + 3) / 4;; k4 X) y% _  z! z  O

  21. ' D- Q3 Z1 _9 A) y4 b2 s' J7 n
  22.   while  ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b &&3 _  T  B% Q. i
  23.           ep->xfer_count < ep->xfer_len &&5 v* {8 R3 J6 v7 \. |
  24.             ep->xfer_len != 0)
    - W; l$ S% K6 S
  25.   {
    ) N( W3 v7 M: _7 V
  26.     /* Write the FIFO */
    ' z* o( ]9 t) O# `
  27.     len = ep->xfer_len - ep->xfer_count;1 B  J, h7 a' C; f5 o& L
  28. , C: X9 R& ~* D2 z- ^% v: S
  29.     if (len > ep->maxpacket)
    ; w3 B$ a& A' h( M3 k3 _7 n
  30.     {
    . X; n4 C6 r7 O2 \, m* s2 V) s
  31.       len = ep->maxpacket;
    7 r3 U8 H  }" {. ~, s% }' u
  32.     }3 J$ y  A, U8 \3 q
  33.     len32b = (len + 3) / 4;
    # S: _/ g" y, }$ h- _& y
  34. ' A8 g3 p+ Z7 k: |. A+ N+ u9 }5 b
  35.     USB_WritePacket(USBx, ep->xfer_buff, epnum, len, hpcd->Init.dma_enable);
    : r# `$ Z: U: ]& j* v* L

  36. , Y) P- S% f8 ?1 j( z' n
  37.     ep->xfer_buff  += len;2 [0 b* u3 w; `0 `; @
  38.     ep->xfer_count += len;0 Z1 k$ Q+ Y2 e1 G! h+ \
  39.   }
    0 R9 r& B6 R9 G& L

  40. 6 b3 q& \/ Y; b+ f, x
  41.   if(len <= 0); u) \+ t' k& O/ i
  42.   {
    . i! g; R; @- c+ U8 p3 B
  43.     fifoemptymsk = 0x1 << epnum;
    # T6 P- ~3 Y. X
  44.     USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;9 `, b% C$ V  K5 o8 M0 q# r
  45. " x  M8 u$ C* E, s
  46.   }2 W% g! n6 t- _+ Z( j

  47. 6 b; P) B& g$ m! y
  48.   return HAL_OK;  
    / T+ g: R. b: v- u, Z4 Q3 }
  49. }
复制代码
5 @! q) t5 v) V2 B; X9 `
需要更改为0 j  L1 f/ `0 F; U  z0 I1 k2 f
  1.           while  ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b &&( ~! d+ l: w8 Y& u1 O7 R, {% d
  2.                           ep->xfer_count < ep->xfer_len &&
    - Z9 t5 Z8 h. S* o8 `
  3.                                 ep->xfer_len != 0)
复制代码
不然会一直进中断但又出不来2 C" J5 a1 b% G. A$ \2 f4 O

; m" O. I: c, @8 L6 x总结: 能用最新的HAL库就用最新的吧 可以避免很多坑
) s( G% S5 C1 ~5 P实在不行可以结合寄存器版本的函数来写,直接写寄存器还是比较靠谱,但是要参照HAL的流程
2 R+ y8 v& ?0 a8 \& \" ~3 A  b/ e6 O. V, T: Y/ t( ^3 I

: _# b6 p" i% Z! }7 m5 r/ m- S, q- U0 E, x- O/ C: Z& |3 [  m
: G8 J: T% o3 V' Z3 Y
收藏 评论0 发布时间:2021-12-22 14:33

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版