stm32H7 hal库错误内容汇总:
r" V; |: z- u# V0 K! @1. I2S
1 i# a! E. c& E1 @- HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
$ c/ \2 v2 h# @1 ^6 ]3 ^ - 函数内部有一个判断5 H4 k( \3 z+ b' y2 x
- if (hi2s->State == HAL_I2S_STATE_READY) {
7 S# n+ y: N/ f+ S. v4 t - __HAL_UNLOCK(hi2s);
2 Z) F# s3 }# L - return HAL_BUSY;: U2 Y: B' O1 n. L) N' [, ]4 X
- }
! M: u0 D1 A' P/ F0 ] - 函数2 d8 E. h0 ]+ c7 E
- 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+ }
- {8 m' B7 I* i7 z7 {8 `
- if (hi2s->State == HAL_I2S_STATE_READY)
f0 K- L& l3 n - {% @ j3 R3 U l
- __HAL_UNLOCK(hi2s);
8 A, g$ e3 w4 d+ o* z0 j7 k - return HAL_BUSY;; X5 s- Y4 v U% _ O+ w
- }
' n5 ?1 Q |# F- k2 h' a - 中同样有
复制代码 应该改为:& w3 C/ n/ a% l8 X
- 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 |
- #define SPI_I2SCFGR_WSINV_Pos (12U)
5 p2 y4 t8 l- h) j$ }$ `+ m9 Z7 N - #define SPI_I2SCFGR_WSINV_Msk (0x1U << SPI_I2SCFGR_WSINV_Pos) /*!< 0x00001000 */# x* ?8 B( i' d) g
- #define SPI_I2SCFGR_WSINV SPI_I2SCFGR_WSINV_Msk /*!<Word select inversion */# t1 X1 p9 z8 J, q
- #define SPI_I2SCFGR_FIXCH_Pos (13U)
+ P/ j5 J, z* l - #define SPI_I2SCFGR_FIXCH_Msk (0x1U << SPI_I2SCFGR_FIXCH_Pos) /*!< 0x00002000 */0 G3 a) g8 ^! r2 x
- #define SPI_I2SCFGR_FIXCH SPI_I2SCFGR_FIXCH_Msk /*!<Fixed channel length in SLAVE */
! a" @% I% t0 v# ` - #define SPI_I2SCFGR_DATFMT_Pos (12U)
% n d) j) D" J& `+ P - #define SPI_I2SCFGR_DATFMT_Msk (0x3U << SPI_I2SCFGR_DATFMT_Pos) /*!< 0x00003000 */
( u$ Y. E W2 w# k - #define SPI_I2SCFGR_DATFMT SPI_I2SCFGR_DATFMT_Msk /*!<Data format
复制代码 8 G+ y( v* }, J# v# g) u1 D
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! c6 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- PCD_WriteEmptyTxFifo 函数
$ C( X" h# ~8 `9 e4 _" H9 T/ ] - 0 S/ A, O9 p# g0 A4 B, E4 |+ [# J. p. X
- static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)
9 |9 }- U! j6 {6 {' U5 z; Z - {* T. j8 v3 {7 w& ` J. ?+ g
- USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; , w% m/ k. U, M9 |8 k6 P8 Y
- USB_OTG_EPTypeDef *ep = NULL;1 }3 V1 ?/ t6 i; }( {, ?
- int32_t len = 0U;3 D" [* F' o/ F/ f6 x8 N
- uint32_t len32b = 0U;
2 t- {' t2 d' ~& p& n - uint32_t fifoemptymsk = 0U;3 h2 E7 N- R7 D1 V# b* t H* C
4 g( P! e4 T# M- ep = &hpcd->IN_ep[epnum];
- Y. O4 M2 k# b* H) Q, U# g - len = ep->xfer_len - ep->xfer_count;
4 o2 @9 o( `( E& G5 ^ h, q( [$ O
7 O9 G* F1 h& Z0 @- if (len > ep->maxpacket), k7 p0 v& [* l* o6 V6 h `" [
- {4 \0 V; y5 r3 C X/ K4 f
- len = ep->maxpacket;( o+ p* l1 v8 W: d' j
- }
% q3 F' X& E" U9 M
2 y- `/ C+ P& }
1 M/ ~. y: G* g7 ^2 @5 m- len32b = (len + 3) / 4;" z+ @9 I* Q' {" B5 u* u) U `% C$ x
- % V8 f, q5 D" V2 b# }
- while ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b &&
( r3 g# l, M9 {8 |7 g/ a3 | - ep->xfer_count < ep->xfer_len &&
% O& e# L& M- Y) A - ep->xfer_len != 0)
! h! }( n6 J+ s. h! g - {
1 o! e2 O3 b4 c! M, N1 e2 r5 | - /* Write the FIFO */# c% k7 p: v7 e/ f9 n; V
- len = ep->xfer_len - ep->xfer_count;
2 C5 `3 Z9 Y* @) X- M - 8 q* }( Z: [1 p; |
- if (len > ep->maxpacket)2 ~/ D. i2 X4 l8 M$ V4 x% i
- {
+ L& r+ {: E! j2 ~; M& i- d- _8 R - len = ep->maxpacket;9 P, M+ s( ?! y8 Q6 J& d! h: \3 _7 Z
- }
& T; _6 f: t' S. T8 R4 w; J; \ - len32b = (len + 3) / 4;3 v% s8 ~- W5 D, r
- 2 y0 u" G4 ^6 l
- USB_WritePacket(USBx, ep->xfer_buff, epnum, len, hpcd->Init.dma_enable);
2 O6 c- G" g9 f9 i U: a( p# y+ |
5 Y: u3 p8 h9 K% B! Q5 V8 p2 t9 p- ep->xfer_buff += len;5 C! g: \0 O5 D) F& ]4 r" E
- ep->xfer_count += len;
- k1 A7 U* O4 q+ t - }/ b$ ?% \' ^9 ~& I
; K6 Q0 ?9 O" a; k) ?% j2 U& f- if(len <= 0)
9 R' A# D' i- k6 @# b5 }; S - {
. {) k o% H( p+ l - fifoemptymsk = 0x1 << epnum;
2 F* g/ U9 H9 ?- @: n - USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;! J. g0 z/ q6 q) p: P' N3 I2 ~
- # Y8 I+ e$ w$ ~# W% A+ f
- }
0 N3 y( P, m5 f. }! s
% `' Q' Y, q& ^1 Y, ] ^% g- return HAL_OK; 6 M4 F1 l; J$ R V
- }
复制代码
. G' s) r! ]2 n( B) |3 G. U& O需要更改为
6 {, D+ W3 R$ J6 j) D7 \( t# s- while ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b &&
: d: P$ h' [; ^, o7 H - ep->xfer_count < ep->xfer_len &&
8 E/ ]% m" N/ o/ a( r0 j - 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
|