stm32H7 hal库错误内容汇总:
2 H# [' m* y" F, A t1. I2S
( w$ V* G" m- W# L5 c& L% K- HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
, S; Z, o/ C, ~' J - 函数内部有一个判断
) _! j) `9 V+ W0 a - if (hi2s->State == HAL_I2S_STATE_READY) {, {3 Q) d& l( H! {1 G
- __HAL_UNLOCK(hi2s);+ R% O0 F- L! U9 f2 p2 d- n' J0 ]
- return HAL_BUSY;( w0 n4 R" u% G5 o3 F! q+ F) z
- }
# r5 h# U$ @( ^ - 函数
: q ~$ Z% |- x. q% [; y - 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 i9 j& s4 l9 x% u X" x. {7 \
- if (hi2s->State == HAL_I2S_STATE_READY)4 G0 _/ t/ B, z* D% C
- {
8 K) a- u. u! f9 h - __HAL_UNLOCK(hi2s);( x4 V. u! u) U! b9 \; w5 _
- return HAL_BUSY;) g1 \: V/ ^- l* l! F3 g
- }, Q; k, T6 @$ P7 O, S
- 中同样有
复制代码 应该改为:3 E: i& N9 Q8 R4 S# Q7 w. E6 Y2 I- w
- 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
- #define SPI_I2SCFGR_WSINV_Pos (12U)
- P" H0 I. H; } }' l# D6 Q) j6 S - #define SPI_I2SCFGR_WSINV_Msk (0x1U << SPI_I2SCFGR_WSINV_Pos) /*!< 0x00001000 */ p; C$ l- q w% t
- #define SPI_I2SCFGR_WSINV SPI_I2SCFGR_WSINV_Msk /*!<Word select inversion */
6 b1 W' O% {' W K2 i* H - #define SPI_I2SCFGR_FIXCH_Pos (13U)
: X6 k/ Y5 d% e2 A" f* K - #define SPI_I2SCFGR_FIXCH_Msk (0x1U << SPI_I2SCFGR_FIXCH_Pos) /*!< 0x00002000 */
8 ?4 b% b4 ?0 ?4 B+ i, m% a/ K# \ - #define SPI_I2SCFGR_FIXCH SPI_I2SCFGR_FIXCH_Msk /*!<Fixed channel length in SLAVE */0 x0 U5 y4 _' J* {/ K* h9 K! X
- #define SPI_I2SCFGR_DATFMT_Pos (12U) 9 a3 q8 R& X, l( N# k# u+ l6 A
- #define SPI_I2SCFGR_DATFMT_Msk (0x3U << SPI_I2SCFGR_DATFMT_Pos) /*!< 0x00003000 */" O% L$ y: p7 J9 ^1 r0 U/ u+ I: [9 ~
- #define SPI_I2SCFGR_DATFMT SPI_I2SCFGR_DATFMT_Msk /*!<Data format
复制代码 8 m4 V' l5 `; ?
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/ S1 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
- PCD_WriteEmptyTxFifo 函数$ P3 H% u, f* O1 h0 A
4 ?* q" Q' F( \- e, G- static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)
+ @1 y3 i. y5 J8 q - {2 e) X6 `# q6 j1 c2 q) Q
- USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; " G! d [0 E) x* |9 i4 i* q
- USB_OTG_EPTypeDef *ep = NULL;
7 S1 h: R6 j9 A$ D L, n! M5 Z - int32_t len = 0U;
e* z6 W! q6 o) L$ q$ x - uint32_t len32b = 0U;
) F# o! M' x! K* e4 h! V$ @* @4 L7 ^$ ^ - uint32_t fifoemptymsk = 0U;
0 R& j8 V) W9 H' a5 a L- ? - ! ^5 R! Y0 e4 @ q, P: E3 J8 l
- ep = &hpcd->IN_ep[epnum];
+ F4 {5 Z2 g3 M! B0 T* x! e - len = ep->xfer_len - ep->xfer_count;
. i( t, H! O& s7 C$ ^' ~) r7 g+ c - ( k8 |8 L" ^% d; d* ]9 Y- j! F
- if (len > ep->maxpacket)
" r, J2 \1 w6 @& V' p - {/ Q7 M3 D9 r2 R
- len = ep->maxpacket;" h) d$ ~7 C6 o% R0 Q
- }
+ P' T% j- r% M
4 Z6 {; E( z' E8 Q) V9 l
% z0 B6 o% \9 B( x& K0 j- len32b = (len + 3) / 4;2 S! m6 j) M- e
- : l/ E. O Z9 ^: z# x, G4 x4 D& M2 o8 p
- while ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b &&
$ H. o: a, {1 r# _7 p6 Y; ^ - ep->xfer_count < ep->xfer_len &&7 [" M0 e$ h) ]5 e
- ep->xfer_len != 0)% N4 c7 n# z8 t7 S. O
- {
0 x% l8 `6 l# k. Y% i; N) t9 b - /* Write the FIFO */4 k, `1 A2 P8 u& d9 K
- len = ep->xfer_len - ep->xfer_count;
' W* i' {0 J; g
- o6 R2 O! h& P/ T) B( M- if (len > ep->maxpacket)
. L5 q; U0 z: L4 K6 ^6 V; E1 Y+ P5 i" \ - {5 h$ A% O+ d+ c3 p' p0 `% m
- len = ep->maxpacket;
' k$ g+ b3 F4 [ - }
- G U- ~+ l9 H' j/ S4 y. d - len32b = (len + 3) / 4;2 k% y0 U3 o8 ^0 G3 f9 C
- + r6 p2 I$ D. ?. }7 J, r1 W
- USB_WritePacket(USBx, ep->xfer_buff, epnum, len, hpcd->Init.dma_enable);
* e" ~) L c; Y5 b0 A2 w
' Y4 C. [& |, J, x/ ^: z& e! t- ep->xfer_buff += len;3 J$ ^ P2 Z- H
- ep->xfer_count += len;
A+ p8 U p7 Z7 }# \' x1 o - }5 v) w: p' B7 u8 b9 {
E* z* P4 [' t- W- if(len <= 0)* o# `: E! B4 `2 G8 ?$ R
- {: u" C6 s; T6 b; o
- fifoemptymsk = 0x1 << epnum;$ ^$ M4 [3 _. Z/ l+ D0 x
- USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;7 ?. Q: e, X2 g4 F- @* M
- 9 w1 ?! U7 ]: @& g/ P! ]
- }
5 _' I" V, g; `, [( B
) y8 L3 e/ x% [; J. U8 u- return HAL_OK;
+ B$ g) W7 P+ { U - }
复制代码 0 N7 u+ n, x0 K& m; X3 I" k# \1 E4 p
需要更改为
- j, _. ^ J$ p- while ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b && F ~( G. S' H% L: l$ @
- ep->xfer_count < ep->xfer_len &&5 V: I- s; d6 t9 e& r4 y8 q3 r
- 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
|