你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32开发项目:处理串口溢出中断(ORE)

[复制链接]
STMCU小助手 发布时间:2022-4-15 10:00
问题表现, C- d6 ]+ e  e$ N- G$ n8 F
在MCU系统负载较重、串口收发数据频率很高、多个中断存在(如同时有定时器更新中断、外部中断、DMA中断、串口接收中断)的情况下,容易出现串口溢出错误(ORE)。该错误的主要显现形式是:程序莫名卡死在串口中断之中(单片机失去响应)。" b; B% \- i1 P' m
/ O. k/ T& O4 u3 a
解决方法
3 R" h: @; L' s7 S$ A( F  vORE标志位在USART_SR寄存器,当我们打开串口接收中断时,同时也就打开了ORE中断,串口的overload错误会导致程序反复进入串口中断服务程序。在中断服务程序中增加处理overload的处理,顺序执行对USART_SR和USART_DR寄存器的读操作可以复位ORE位,以防止程序反复进入串口中断服务程序。示例代码如下:' k; y( z0 ]' a

) x) [) {6 P2 z  s& S& b3 z在STM32中断函数增加USART_IT_ORE等异常中断的处理,执行USART_GetFlagStatus(USART1, USART_FLAG_ORE),会对USART_SR进行了一次读操作,然后再执行USART_ReceiveByte(USART1),会对USART_DR进行一次读操作,从而复位了ORE位。% n0 f0 p. L( ?

& I; R8 L- q* L' u1 n* z7 L/**
+ @7 v  P" T+ ~6 ~% Q% Z, j  j  * @brief  Checks whether the specified USART flag is set or not.
% r% P6 o% T: A1 T  * @param  USARTx: Select the USART or the UART peripheral. % S" O/ B: F9 O1 Z
  *   This parameter can be one of the following values:
% I1 T2 a# |- T) N  *   USART1, USART2, USART3, UART4 or UART5./ f- I- |8 B; b) [
  * @param  USART_FLAG: specifies the flag to check.
/ }7 w! }, D, u  *   This parameter can be one of the following values:+ o6 ?0 i: Q% q6 Y# Z. ~
  *     @arg USART_FLAG_CTS:  CTS Change flag (not available for UART4 and UART5); k8 o" D9 R2 A2 z; A) P8 E! O3 ^
  *     @arg USART_FLAG_LBD:  LIN Break detection flag2 N) ~- Z' F% X& V8 d
  *     @arg USART_FLAG_TXE:  Transmit data register empty flag1 ?% V& Z* g, o% S' d( v; j
  *     @arg USART_FLAG_TC:   Transmission Complete flag
- Z, G) X4 h0 t  *     @arg USART_FLAG_RXNE: Receive data register not empty flag
# ^8 a5 Q7 }) w% l4 y: b, _( q  *     @arg USART_FLAG_IDLE: Idle Line detection flag; I6 ?" C* _0 \& W3 |! K0 f2 N
  *     @arg USART_FLAG_ORE:  OverRun Error flag
- ~6 e. j9 b: X* I& \  *     @arg USART_FLAG_NE:   Noise Error flag  \( h  L+ ~* |" e, n6 a
  *     @arg USART_FLAG_FE:   Framing Error flag
. E, B: i+ ~0 j6 N- z  *     @arg USART_FLAG_PE:   Parity Error flag
; M4 w' e  F$ k  w8 R, I. s  * @retval The new state of USART_FLAG (SET or RESET).4 r/ I2 @: q, t+ x. S! S/ ^; z7 q: s
  */
  X, a$ U% q- A  K& V! OFlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
* _& X- P- q/ }; ^8 f% d: ^{
! T' Z9 ?5 r# i. ~  FlagStatus bitstatus = RESET;
; A1 A+ M* V8 e0 K0 [: w  /* Check the parameters */
3 b4 C+ {2 ~! P  assert_param(IS_USART_ALL_PERIPH(USARTx));- y* b/ b; U& P8 ~, i$ H
  assert_param(IS_USART_FLAG(USART_FLAG));
8 J1 [8 s- S1 g! p" l4 U# _  /* The CTS flag is not available for UART4 and UART5 */
+ P* p( {( b8 ^  if (USART_FLAG == USART_FLAG_CTS); i# G0 q& Y9 f9 X/ B
  {, Z3 }3 j% B% [% H8 d) d
    assert_param(IS_USART_123_PERIPH(USARTx));
' [" B3 @& _% h3 o. N+ c! b# H  }  & ]0 i9 y* v2 w/ e5 K0 C; ]6 M

8 ^7 `7 T  P& _6 `2 q+ p9 g$ s1 N  if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET)
$ f0 _5 b: e# M/ K% X  {3 R. t) a+ b4 }
    bitstatus = SET;4 ]6 P  J5 h- i$ h. m
  }
1 i) ]/ F. n0 E! _. W7 y  else
" W; f  g" n; ?3 G! E+ }5 r" @  {4 O  T/ f" x% h& f" S5 K
    bitstatus = RESET;
% U( [, K0 C3 r5 ^1 M0 s) w' A  }7 p; G7 l2 O5 w. u, @8 p0 y4 j
  return bitstatus;
2 `  a5 S7 ]: }; Q}
  g/ L' x6 x' L! [2 o4 U9 z9 T
. k) Q; _$ R# l$ j7 }0 A9 X+ ]8 T8 r- A: _2 s+ N( r

6 E; B- T5 p1 y1 w5 f/**% m8 M# y  \2 U: x/ z' G
  * @brief  Returns the most recent received data by the USARTx peripheral.4 T: L# g6 d' e! l
  * @param  USARTx: Select the USART or the UART peripheral.
. A" h7 u, J( I3 i" Y4 z* D, I6 A# E  *   This parameter can be one of the following values:4 `0 ~: j; i% p$ u; k7 e* ]
  *   USART1, USART2, USART3, UART4 or UART5.* F6 F# ^, I* C* x
  * @retval The received data.
$ L7 T2 K3 E0 E9 T  */" e( O/ z8 {* Z) v! Z3 X
uint16_t USART_ReceiveByte(USART_TypeDef* USARTx)
& h6 H; l5 s" Y3 L{* _6 q4 S6 \  V
  /* Check the parameters */: N5 T/ s9 o3 }: E
  assert_param(IS_USART_ALL_PERIPH(USARTx));  N5 ~% L& U+ j# S, `
7 k5 t3 p9 w" w  S2 j9 b% Y  n0 _
  /* Receive Data */
6 `4 ~2 c# t7 s9 ~; f. |6 @  return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);9 j4 Y* ~+ n  g% b. V
}
7 s' ~; p6 C& k; Q# j$ P) F& n* e- p( P  N" F$ L
, P0 y7 Z+ O" `: q( T1 K$ B9 K3 Z
1 c$ d4 N  {8 j
void USART1_IRQHandler(void)& }$ p5 \' Q- O. v
{
9 k6 x! J5 l! C5 E* x2 W        /**1 s3 o1 j1 M$ p& @) ?1 d
         * 如果使能串口接收中断,那么ORE为1时也会产生中断。
. T( Q- O6 }. y) \5 |( `         * 在应用中对ORE标志进行处理,当判断发生ORE中断的时候,
) `1 c5 M* Y7 u; L8 u/ h2 @         * 我们再读一次USART_DR的值,( ^" w7 Y3 z) [& B: D5 o/ ]( r
         * 这样如果没有新的Overrun 溢出事件发生的时候,ORE会被清除,+ G, I6 ~1 \# C2 R1 `+ x8 Z
         * 然后程序就不会因为ORE未被清除而一直不断的进入串口中断
+ _' c& j5 w, i, ^         */
6 Q+ z& T; e, B. e. y7 }  ^         
) t6 H9 c4 Y: d6 N5 B5 `        //没有使能USART_IT_ERR中断时,ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE)读到4 _. y' p$ Z$ L' Z. ?
        if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET): D' P$ |: s- {- j& D
        {
9 _, |+ N* Y  e% G7 |6 _                //(void)USARTx->SR;
7 v  V) E! ^) L6 |                //(vois)USARTx->DR; //先读SR再读DR寄存器$ [2 \' T  i; c( v$ m+ F- V* c
               
! P. {8 P7 u4 k2 o% C% Y2 t- x                USART_ReceiveByte(USART1);3 N) E( w+ p4 O" `7 W) ~1 f
                - t4 T2 E: p0 G! _! X, D
                //USART_ClearFlag(USART1, USART_FLAG_ORE);
1 F* D, P* \$ C9 }# p        }8 E8 b9 i& j  D) R! b% y. r
       
( q. s' j& ]* o+ _: Z        //处理接收到的数据(示例为FIFO缓冲队列), `+ t) p; H! l2 l, Q! x
        if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
$ V* n/ F5 D" x% n3 o& K9 B        {
% u6 p  {- T1 g$ `: O+ f                USART_ClearITPendingBit(USART1, USART_IT_RXNE);& H( T$ w# u* i- \
                *USART_RevPointer[0][0] = (u8) USART_ReceiveByte(USART1);" _) @/ S! x6 p- g% a& q
                USART_RevPointer[0][0]++;
2 X) X! N5 ?  G3 S" \8 f. g1 Q                USART_RevCount[0]++;6 Z7 v& u% ^0 y4 m4 c* e
) Q5 K$ {) ?1 g& G+ g! h! i7 a
                if (USART_RevPointer[0][0] >= USART_RevBuffer[0] + USART_BufferSize[0])
; w: y9 t% x3 }/ i* s                        USART_RevPointer[0][0] = USART_RevBuffer[0];& q: \4 X; C! F1 y7 F7 N0 R2 X
        }0 D$ X" u0 T; v% I/ @
}( }7 M5 U8 k4 E7 N. t2 k' n$ q' t* V
/ {) N2 a5 z! j$ }/ a

/ \6 g, m* U) B  ]" }0 G
: l" ^7 A! L2 x% k$ I. U/ m
收藏 评论0 发布时间:2022-4-15 10:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版