stm32H7 hal库错误内容汇总:' c* V& X- ~' z; g! @9 Q& r( {
1. I2S
$ F& E4 d j7 J: N' W- X- HAL_StatusTypeDef HAL_I2S_Transmit_IT(I2S_HandleTypeDef *hi2s, uint16_t *pData, uint16_t Size)
/ F# }7 [; Y! X; j# Y8 M - 函数内部有一个判断. g% ?9 N9 v6 n$ w
- if (hi2s->State == HAL_I2S_STATE_READY) {: Z9 [/ L. Y# o7 v+ ~0 h4 o
- __HAL_UNLOCK(hi2s);6 l. f% _& D3 |4 Z* R
- return HAL_BUSY;5 O! M3 T! b3 a: {& C. N
- }
, [5 c }1 m% g, E& c6 o. C - 函数. d& V' w% c- P% u) L
- 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 - {, n7 B9 p9 G6 w
- if (hi2s->State == HAL_I2S_STATE_READY)/ ~& O! U* @; W1 v# M- V
- {: q# _" d* V; n: k
- __HAL_UNLOCK(hi2s);
- |" q$ S- ~+ L - return HAL_BUSY;" O- j2 Y; Z6 s7 @! g" Z& \
- }
, }3 V1 l9 _' y - 中同样有
复制代码 应该改为:
! {0 d' f( M% o0 m) G7 P- 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
- #define SPI_I2SCFGR_WSINV_Pos (12U)
+ ?! i* O/ }* W4 j8 f5 ?% y - #define SPI_I2SCFGR_WSINV_Msk (0x1U << SPI_I2SCFGR_WSINV_Pos) /*!< 0x00001000 */ z4 s _+ o; ~6 ^) |9 z
- #define SPI_I2SCFGR_WSINV SPI_I2SCFGR_WSINV_Msk /*!<Word select inversion */
- `7 d9 k7 U3 P! a( u - #define SPI_I2SCFGR_FIXCH_Pos (13U)
. q6 u( c# J7 s' `8 w( x$ f; P - #define SPI_I2SCFGR_FIXCH_Msk (0x1U << SPI_I2SCFGR_FIXCH_Pos) /*!< 0x00002000 */* Z0 i' u$ l0 Q' b
- #define SPI_I2SCFGR_FIXCH SPI_I2SCFGR_FIXCH_Msk /*!<Fixed channel length in SLAVE */: l$ _' D+ n% ^) o3 C
- #define SPI_I2SCFGR_DATFMT_Pos (12U)
& a. J, C3 W% V P - #define SPI_I2SCFGR_DATFMT_Msk (0x3U << SPI_I2SCFGR_DATFMT_Pos) /*!< 0x00003000 */' w& ^& W. \+ Y% g. S8 n
- #define SPI_I2SCFGR_DATFMT SPI_I2SCFGR_DATFMT_Msk /*!<Data format
复制代码 # o- c! r& u, `% ?3 e
* 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
! 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
- PCD_WriteEmptyTxFifo 函数
6 _4 @1 S( p2 F3 f8 O
3 Y, j; s: b o# @+ j( ]& [- J- static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t epnum)
. l" }4 s* \8 r) S& |4 n4 v - {
* ]/ U' k. e2 K - USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; % w! z' y; T" ~: q: |5 {
- USB_OTG_EPTypeDef *ep = NULL;
5 X( y" v; _( Q0 i2 H - int32_t len = 0U;/ \% J( F4 v& ?
- uint32_t len32b = 0U;4 T" B% X: E9 n: F8 \
- uint32_t fifoemptymsk = 0U;
9 L4 k. ?5 `( N$ ^8 v2 h+ b$ j
/ T) q- i+ _* W1 H" B1 Y+ Y( _- ep = &hpcd->IN_ep[epnum];
+ H5 i+ q$ z) U4 B2 }7 l* c4 P7 O. L - len = ep->xfer_len - ep->xfer_count;7 m" k" U+ B5 a$ {" j+ R
# J: I8 w1 n" Y- if (len > ep->maxpacket)7 {# j) P- i: j! _
- {/ Q) z a# ?" I. c
- len = ep->maxpacket;) w4 H& S5 C( w8 E" l
- }
% \3 }( e' c* V! c7 m
! ]3 }: h: u$ T/ |- 6 j& y6 Z' e1 } Y: k9 x
- len32b = (len + 3) / 4;; k4 X) y% _ z! z O
' D- Q3 Z1 _9 A) y4 b2 s' J7 n- while ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) > len32b &&3 _ T B% Q. i
- ep->xfer_count < ep->xfer_len &&5 v* {8 R3 J6 v7 \. |
- ep->xfer_len != 0)
- W; l$ S% K6 S - {
) N( W3 v7 M: _7 V - /* Write the FIFO */
' z* o( ]9 t) O# ` - len = ep->xfer_len - ep->xfer_count;1 B J, h7 a' C; f5 o& L
- , C: X9 R& ~* D2 z- ^% v: S
- if (len > ep->maxpacket)
; w3 B$ a& A' h( M3 k3 _7 n - {
. X; n4 C6 r7 O2 \, m* s2 V) s - len = ep->maxpacket;
7 r3 U8 H }" {. ~, s% }' u - }3 J$ y A, U8 \3 q
- len32b = (len + 3) / 4;
# S: _/ g" y, }$ h- _& y - ' A8 g3 p+ Z7 k: |. A+ N+ u9 }5 b
- USB_WritePacket(USBx, ep->xfer_buff, epnum, len, hpcd->Init.dma_enable);
: r# `$ Z: U: ]& j* v* L
, Y) P- S% f8 ?1 j( z' n- ep->xfer_buff += len;2 [0 b* u3 w; `0 `; @
- ep->xfer_count += len;0 Z1 k$ Q+ Y2 e1 G! h+ \
- }
0 R9 r& B6 R9 G& L
6 b3 q& \/ Y; b+ f, x- if(len <= 0); u) \+ t' k& O/ i
- {
. i! g; R; @- c+ U8 p3 B - fifoemptymsk = 0x1 << epnum;
# T6 P- ~3 Y. X - USBx_DEVICE->DIEPEMPMSK &= ~fifoemptymsk;9 `, b% C$ V K5 o8 M0 q# r
- " x M8 u$ C* E, s
- }2 W% g! n6 t- _+ Z( j
6 b; P) B& g$ m! y- return HAL_OK;
/ T+ g: R. b: v- u, Z4 Q3 } - }
复制代码 5 @! q) t5 v) V2 B; X9 `
需要更改为0 j L1 f/ `0 F; U z0 I1 k2 f
- while ( (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV) >= len32b &&( ~! d+ l: w8 Y& u1 O7 R, {% d
- ep->xfer_count < ep->xfer_len &&
- Z9 t5 Z8 h. S* o8 ` - 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
|