|
问题及解决方法 当STM32使用HAL库进行开发时,偶尔会遇到串口收发数据量大时,会出现问题。比如同时串口同时收发,一段时间后就只能发送,接收不工作。或是只接收,但数据量大时也不工作。下面对这些问题和其解决办法进行整理。
9 r& s/ f0 F6 o* d4 U7 M8 E 问题1:串口溢出当数据量过大且传输频率快时,串口可能会因为溢出,而不进入串口中断。
q. G9 N c2 t 解决方法使能RXNE中断和ORE中断: - if(HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE)!-HAL_OK)9 Q: `5 ~8 X- |/ |
- {: [0 m! X$ X5 `5 s2 W! b
- __HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
) t$ @1 B& @7 F2 L- y - }
复制代码 $ _& }! h, q p' n9 t
在usart.c中加入串口错误中断回调函数的定义 - /* 中断错误处理函数,在此处理overrun错误 */6 u! l8 u2 f6 e1 w% Y# e$ w
- void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)- L, H7 {/ c) k$ g9 l1 k' M! k \2 X8 o
- {) C( q2 n1 A c+ X3 a
- uint8_t i = 0;
; Z, n6 r2 K7 M0 ~( B
2 l6 u) g, R6 L4 N3 g- if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET)
! S% @/ T8 ]7 F3 P6 e o - {
, I1 D2 [/ I o k) Z/ y. H0 H - __HAL_UART_CLEAR_OREFLAG(huart);. o# S# w' g* n' e8 t4 V6 x
- HAL_UART_Receive_IT(huart,(u8 *)&i,1); r5 m& Y W( B1 z) G
- }
) Q2 `* u/ N+ a f0 G- \ - }
复制代码
7 Y- Y) s7 M- S; ~
问题2:串口同时收发,一段时间后串口接收不工作 明明STM32的串口通信是全双工的,但使用HAL库的STM32串口收发时发现,数据量大时,同时收发会出现问题。
2 K" T! y7 D: a& |; S$ B5 g# N问题的原因锁定在, STM32 HAL库在处理接收的时候会锁一下串口一会,导致变成某个短时间的“半双工”,这个时候如果同时收发就会出现问题。 在HAL_UART_Receive_IT函数中,开始处进行了上锁 ) T5 q- d0 O1 m
2 _: V# c' M4 w" q
虽然最后在UART_Start_Receive_IT中进行了解锁,
! A D, O. V c4 r6 N2 w D
8 q' o: l% s. f6 t8 r" d; ~但有多种情况会导致不能解锁,从而影响到了串口接收。' A) m1 s3 L( q7 g0 j$ f5 S, H
在使用HAL_UART_Transmit时,可以看到,此函数的源码中,也有上锁和解锁,而且还是和UART_Start_Receive_IT控制的是一个锁!!!好好的全双工被HAL库搞成了半双工。
. ~# T- L X8 d" v2 X o- ^ 解决办法手动解锁 - return_state=HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE);* L9 y( Q8 ?& w, k# y1 D$ R a
- if(return_state!=HAL_OK)
$ D9 S4 u# t- A1 _! Q - {
- |# x% B0 y; z+ e - //解除忙状态(由ORE导致,清零ORE位)
. S$ q+ [5 y5 ]1 s& c - if(return_state == HAL_BUSY)
/ @ v! X6 p3 s0 n& N, ]4 } - {
' E& A7 U0 n% W0 L* p4 | - //清除ORE错误; y0 r+ U6 B+ h
- // __HAL_UART_CLEAR_OREFLAG(&huart1);//清楚ORE标志位
. m% n) a6 R& n& r - // huart1.RxState=HAL_UART_STATE_READY;' J b* B1 `2 s. W( \, h2 q( H
- huart1.Lock=HAL_UNLOCKED;
# j! h. z2 v( m4 b! \8 @ - //重新开始接收4 g2 h4 o( D8 E9 ]7 ~
- return_state=HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE);8 w6 u0 B4 J4 I1 q7 x
- }) _( Z' K5 F6 H: C
- }
复制代码 ' |; W. s- Q1 R# t" d* u
转载自: 物联网知识 如有侵权请联系删除
: |" z" y6 [% d |