|
问题及解决方法 当STM32使用HAL库进行开发时,偶尔会遇到串口收发数据量大时,会出现问题。比如同时串口同时收发,一段时间后就只能发送,接收不工作。或是只接收,但数据量大时也不工作。下面对这些问题和其解决办法进行整理。 ; m" _; o8 _, }' _: U! _, ~" s
问题1:串口溢出当数据量过大且传输频率快时,串口可能会因为溢出,而不进入串口中断。 7 Y3 j" S0 g. q2 N( ]
解决方法使能RXNE中断和ORE中断: - if(HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE)!-HAL_OK): Y. w \+ I8 J; V+ h
- {
8 g! x6 h1 O3 |4 S+ D/ O - __HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);" u+ ^) J, H: K1 O- b2 I: t Z
- }
复制代码 . _6 v, ^9 B, _' D6 j
在usart.c中加入串口错误中断回调函数的定义 - /* 中断错误处理函数,在此处理overrun错误 */
; j) V8 j6 T4 G - void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
/ b% l; ?% }+ i - {
$ v) i% X1 n( |) ^4 \0 {# _ - uint8_t i = 0;
* K3 g/ l2 H' z4 B- U1 N+ _
& P7 d! Q9 L9 Q- c( O8 q; c; d' Y- if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET)
8 t f" a$ I# ]) M1 u( g( w9 I - {
5 L! b+ T% h( ~3 C: v - __HAL_UART_CLEAR_OREFLAG(huart);7 t+ G; q8 ~5 n
- HAL_UART_Receive_IT(huart,(u8 *)&i,1);
7 I P' ]. u. d - }5 p4 h& c3 v* y$ t. ]1 [1 W# a
- }
复制代码3 J! D- `! n/ W( h8 ?+ q4 i7 E
问题2:串口同时收发,一段时间后串口接收不工作 明明STM32的串口通信是全双工的,但使用HAL库的STM32串口收发时发现,数据量大时,同时收发会出现问题。- z; [4 g) \; |7 L9 M, K4 \
问题的原因锁定在, STM32 HAL库在处理接收的时候会锁一下串口一会,导致变成某个短时间的“半双工”,这个时候如果同时收发就会出现问题。 在HAL_UART_Receive_IT函数中,开始处进行了上锁 6 h$ N$ q0 U8 \8 ~# j
2 t2 d+ u2 g8 _, G4 v- R虽然最后在UART_Start_Receive_IT中进行了解锁,
$ V5 P# g( E$ l6 u0 K
8 s) ~" }$ o0 o/ A: M
但有多种情况会导致不能解锁,从而影响到了串口接收。
( Q0 K6 W! E8 t' N" z" ?0 B在使用HAL_UART_Transmit时,可以看到,此函数的源码中,也有上锁和解锁,而且还是和UART_Start_Receive_IT控制的是一个锁!!!好好的全双工被HAL库搞成了半双工。
' t' C( T$ A6 D$ q 解决办法手动解锁 - return_state=HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE);
* V2 e/ \7 `2 f' N! |4 Z$ g - if(return_state!=HAL_OK)
_3 c7 T+ D" W3 } - {, D5 p4 i) Q) U1 s; @6 U
- //解除忙状态(由ORE导致,清零ORE位), i6 y% p2 ~% X7 `
- if(return_state == HAL_BUSY)
" H, U1 _# H+ @ - {
6 O" v' ~9 [# p+ K) ~ - //清除ORE错误. O+ \; o* W8 M. Y8 X
- // __HAL_UART_CLEAR_OREFLAG(&huart1);//清楚ORE标志位5 W! |" H) W7 F# G+ _% z0 Y
- // huart1.RxState=HAL_UART_STATE_READY;8 F# @# k0 R( w7 W/ t& i+ [
- huart1.Lock=HAL_UNLOCKED;6 B# u0 ^5 \) f. X1 V0 K: {
- //重新开始接收. a; i x2 F! j" z. f* E- t
- return_state=HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE);6 {3 u0 L7 b& U
- }
- [& g8 g( x# T( O8 d+ [! S - }
复制代码 ( { O7 O- M% C4 u+ r. }
转载自: 物联网知识 如有侵权请联系删除 2 @& E8 T) G# D4 E5 z7 p
|