|
问题及解决方法 当STM32使用HAL库进行开发时,偶尔会遇到串口收发数据量大时,会出现问题。比如同时串口同时收发,一段时间后就只能发送,接收不工作。或是只接收,但数据量大时也不工作。下面对这些问题和其解决办法进行整理。
6 L. [9 W1 h. h0 ~; G* Q' N 问题1:串口溢出当数据量过大且传输频率快时,串口可能会因为溢出,而不进入串口中断。
* C! i% C% Z& Y+ E% {' o 解决方法使能RXNE中断和ORE中断: - if(HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE)!-HAL_OK)8 k) ~+ B6 `% R) K3 b
- {
6 g" Y. _! P d9 z; N) I - __HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);+ c* B! M& \/ m& G+ l, u" @
- }
复制代码
' ]; F( x S* J1 L* n在usart.c中加入串口错误中断回调函数的定义 - /* 中断错误处理函数,在此处理overrun错误 */
& n5 b l6 q% A% G7 q - void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
- [+ Z ~" s* M; U - {8 e* @3 t$ b' R% K
- uint8_t i = 0;- }! B4 l% d, q r2 i0 ?) L
/ b+ X1 u7 S: u: O# ]- if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET) 0 c" L7 j( e5 i1 _+ b. |5 e
- {
" S1 M4 ] d" n' b+ H# z) V. q - __HAL_UART_CLEAR_OREFLAG(huart);2 O- b3 \" Y. f$ g5 q7 F0 p% D- P
- HAL_UART_Receive_IT(huart,(u8 *)&i,1);
\; {/ ~5 ~3 |) T6 S! C7 G - }/ h0 l( r5 t, }
- }
复制代码4 i( X2 R. ?! ^4 A
问题2:串口同时收发,一段时间后串口接收不工作 明明STM32的串口通信是全双工的,但使用HAL库的STM32串口收发时发现,数据量大时,同时收发会出现问题。* H7 m3 L' C6 X% b' ?, Z4 s# Y2 j
问题的原因锁定在, STM32 HAL库在处理接收的时候会锁一下串口一会,导致变成某个短时间的“半双工”,这个时候如果同时收发就会出现问题。 在HAL_UART_Receive_IT函数中,开始处进行了上锁 - q7 W% n- Y+ E( q
& U. R3 v% C" {+ f3 B8 \
虽然最后在UART_Start_Receive_IT中进行了解锁,
, a1 p0 C A, ?0 \
9 B( F6 r' ~5 u+ F0 c* K% c V8 K6 ~& e但有多种情况会导致不能解锁,从而影响到了串口接收。
6 h% ^; G3 x; Z6 S在使用HAL_UART_Transmit时,可以看到,此函数的源码中,也有上锁和解锁,而且还是和UART_Start_Receive_IT控制的是一个锁!!!好好的全双工被HAL库搞成了半双工。
3 B4 ?" X! l: ?' G 解决办法手动解锁 - return_state=HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE);
9 g. A# u, h* l4 o+ Q! }! k - if(return_state!=HAL_OK)% w& _$ d2 s9 S$ v
- {
2 y& M, W, Z5 ]/ `' Z - //解除忙状态(由ORE导致,清零ORE位)- A- e3 r& r1 p
- if(return_state == HAL_BUSY)! @2 W. }. j0 R2 u, F
- {& k9 s/ z( R& i. ^5 {
- //清除ORE错误
. h& |" F# ^* E" M, } - // __HAL_UART_CLEAR_OREFLAG(&huart1);//清楚ORE标志位
! J! |/ |( ] v; i) U3 j" p7 J - // huart1.RxState=HAL_UART_STATE_READY;
* b/ b+ c$ T f$ [ - huart1.Lock=HAL_UNLOCKED;
1 ~, W, E* f u8 }2 P - //重新开始接收
% p' s6 w# o. l7 ^* B! j4 s: z- e+ D - return_state=HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE);
5 r% u2 Q% { ^3 l+ L - }$ X( b; |2 f* U. u* a( c
- }
复制代码
f4 p# n1 C% N& v7 ^5 P转载自: 物联网知识 如有侵权请联系删除 / y) z# L( O) z0 W3 u9 B2 y( F. L
|