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

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

[复制链接]
STMCU小助手 发布时间:2022-4-15 10:00
问题表现, W4 \9 j  K9 \9 }
在MCU系统负载较重、串口收发数据频率很高、多个中断存在(如同时有定时器更新中断、外部中断、DMA中断、串口接收中断)的情况下,容易出现串口溢出错误(ORE)。该错误的主要显现形式是:程序莫名卡死在串口中断之中(单片机失去响应)。/ c; s. S2 `3 O  P: c# V
+ q9 Y/ y" I' l' ?# n$ k( l# i
解决方法( }" G2 Y* @2 X* M
ORE标志位在USART_SR寄存器,当我们打开串口接收中断时,同时也就打开了ORE中断,串口的overload错误会导致程序反复进入串口中断服务程序。在中断服务程序中增加处理overload的处理,顺序执行对USART_SR和USART_DR寄存器的读操作可以复位ORE位,以防止程序反复进入串口中断服务程序。示例代码如下:3 J2 ^6 l8 h4 \7 s' {4 f

& d- Y- `# e3 T' C在STM32中断函数增加USART_IT_ORE等异常中断的处理,执行USART_GetFlagStatus(USART1, USART_FLAG_ORE),会对USART_SR进行了一次读操作,然后再执行USART_ReceiveByte(USART1),会对USART_DR进行一次读操作,从而复位了ORE位。
* Q3 ]) p' e1 x$ D- t+ D
! L% A$ z6 p+ X; {9 N7 |! X4 l/**
6 y; E0 S" ~2 m$ q. O( N  * @brief  Checks whether the specified USART flag is set or not.. J3 U8 Z0 p6 y3 Q- w: _' y% |4 [, I
  * @param  USARTx: Select the USART or the UART peripheral. ; g$ _- k# H; _3 z
  *   This parameter can be one of the following values:5 C4 Z0 f6 m/ Y6 |" M4 O
  *   USART1, USART2, USART3, UART4 or UART5.
/ h: r5 |5 b+ n4 p5 |  * @param  USART_FLAG: specifies the flag to check.7 v5 e+ h2 @, A9 n8 K+ K; L
  *   This parameter can be one of the following values:
# k: |: O( E8 S& \$ U7 k9 k  *     @arg USART_FLAG_CTS:  CTS Change flag (not available for UART4 and UART5)
3 q+ O7 [" |# E, _  *     @arg USART_FLAG_LBD:  LIN Break detection flag$ j. L+ Z. L9 w3 Y: z/ r+ p
  *     @arg USART_FLAG_TXE:  Transmit data register empty flag( c* x. o  Y8 q; I1 D6 ~
  *     @arg USART_FLAG_TC:   Transmission Complete flag
- H- W& H) h5 a: f  N( e/ ^& \  *     @arg USART_FLAG_RXNE: Receive data register not empty flag6 c0 _, O' s. R1 H; B
  *     @arg USART_FLAG_IDLE: Idle Line detection flag$ I2 |9 C0 D, v' o* c* r
  *     @arg USART_FLAG_ORE:  OverRun Error flag. X; s/ B. S* P" W$ B. u. y
  *     @arg USART_FLAG_NE:   Noise Error flag  ~8 Q) l  V# P$ [# p. C0 e& ]3 r
  *     @arg USART_FLAG_FE:   Framing Error flag6 Q. \6 k8 s; E0 ~7 _1 {
  *     @arg USART_FLAG_PE:   Parity Error flag& a3 x' j2 K8 S2 R2 n
  * @retval The new state of USART_FLAG (SET or RESET).
) k5 p/ ^, w' s( w! t4 u; p  */
& n' y/ P( U9 x& m  z2 H) T! lFlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)3 Q5 ~) t$ R1 y6 b) O+ Z. y* Y
{  M; J$ C4 @) E
  FlagStatus bitstatus = RESET;
* P1 m- I7 K: R0 R5 a+ v  /* Check the parameters */% b2 L1 p5 G1 R6 Z$ ~/ L& ~. c
  assert_param(IS_USART_ALL_PERIPH(USARTx));
. Y$ p( ?0 k8 m: T( |4 M  assert_param(IS_USART_FLAG(USART_FLAG));
1 X  G% w% j3 A% f  /* The CTS flag is not available for UART4 and UART5 */( c( i1 c3 m, K8 t* N6 T5 c% S
  if (USART_FLAG == USART_FLAG_CTS)4 I5 F( g4 P$ d* g9 x
  {
7 Q" L  S8 M; c7 @    assert_param(IS_USART_123_PERIPH(USARTx));
/ ?4 @: y0 I' e# V  O  }  7 W5 v2 k7 T' y$ h7 m$ H

: V: T4 y1 ]- N' e& f6 C  if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET)
; }8 _& q$ o, G: s8 W  {4 q$ o; q; |3 }' w
    bitstatus = SET;& S# q$ D& R# L9 x  e+ g( i& d
  }& A( Q: z1 R& J$ d: L3 M0 }% j2 d: m
  else
( Q% Y0 ?( |! I% I7 Y. e: l' S% O2 S  {
# O6 V+ t! s; f2 f+ K, O) p    bitstatus = RESET;7 {1 G  U3 R0 N4 z  a
  }
0 v( l+ F9 v( _4 G4 W2 X- c: c  return bitstatus;: L8 e0 h8 ^+ }) X# F! P5 C, J7 a
}# L, L7 G& J3 o" _" l
0 o( I! x2 c2 k0 p# Q& @

( l. M- ^& R* W4 x) d) l) \
1 S6 i# N" Z$ O6 }! \/**/ M/ }% {0 K0 k% ]3 N
  * @brief  Returns the most recent received data by the USARTx peripheral.
. w7 q' @3 w, |) H3 ?  * @param  USARTx: Select the USART or the UART peripheral. ( r7 j9 {: I5 U$ d2 P5 \; A+ W5 L7 M& n
  *   This parameter can be one of the following values:) R8 G9 B6 u# z: X3 l
  *   USART1, USART2, USART3, UART4 or UART5.
: ~8 U7 V7 N7 H# w  * @retval The received data." t- s7 @% l. _+ n$ x4 N9 U3 g
  */9 ]6 C! d& [! P) @6 L2 w
uint16_t USART_ReceiveByte(USART_TypeDef* USARTx)3 W' |% g3 M5 k  q# d
{
# {1 s2 s; M7 C4 [' Z" `* f  /* Check the parameters */
8 G" l( L/ @' J% r) ~# l  assert_param(IS_USART_ALL_PERIPH(USARTx));1 G# g  L5 q5 N7 m2 W1 K- ~. p

) J  u9 f. X* F$ }3 F  /* Receive Data */
# G9 m3 z- n) r8 |5 [$ [$ X  return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);, A! G% [% p& V3 Z; Z
}
2 A; g/ _, x* S# t
. o/ F" ~: g$ ^. u& _* u! ~0 Y( X5 q" c! R6 c
) C9 o" s6 d" }3 y+ [% n
void USART1_IRQHandler(void)' @) M7 Q9 R0 s4 N$ e
{7 x5 B- k+ K* b) X+ V
        /**
* Y7 R# P2 t% U% ^4 L         * 如果使能串口接收中断,那么ORE为1时也会产生中断。. X' v/ }0 Z- \9 h5 p# P8 M: j: n
         * 在应用中对ORE标志进行处理,当判断发生ORE中断的时候,- C, {. |0 j) t: w) d
         * 我们再读一次USART_DR的值,' N/ L2 \" r3 R2 b1 D
         * 这样如果没有新的Overrun 溢出事件发生的时候,ORE会被清除,
; I( s, C& I6 g/ g! K9 U         * 然后程序就不会因为ORE未被清除而一直不断的进入串口中断# }9 V) m) d) ]
         */8 z0 t5 m. U: G' ?& F; ~3 e4 h
           n4 ^: x5 W" R! v/ E& F& I, k
        //没有使能USART_IT_ERR中断时,ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE)读到
, l1 W) N/ w2 W2 R        if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET); L2 h) z$ ~1 I  C7 R
        {' K' l; x4 F2 A8 }* M
                //(void)USARTx->SR;: P! p4 O$ S; X! Y
                //(vois)USARTx->DR; //先读SR再读DR寄存器
0 b% h3 W. N' J( |: e: s                ; V9 l+ i0 ?; f; z. h: O
                USART_ReceiveByte(USART1);- ?0 x+ k9 O& }! d  [1 m
               
# Y: c% j- E3 b% ~( z0 B8 Z) q                //USART_ClearFlag(USART1, USART_FLAG_ORE);
/ n( ]8 H9 Y* y( l1 `7 O        }
2 H. e8 m* [- T        " b2 t1 }7 K8 j& |% x! q9 ~
        //处理接收到的数据(示例为FIFO缓冲队列)  H% Q0 r% a9 b& q1 }7 K( S
        if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
" l  g' W  {5 P" ?) J% I6 Z        {- d2 N& k$ R6 j: U
                USART_ClearITPendingBit(USART1, USART_IT_RXNE);; B( m7 Z2 ?$ }
                *USART_RevPointer[0][0] = (u8) USART_ReceiveByte(USART1);
0 o1 W  ^1 h5 ^9 [2 Z8 y                USART_RevPointer[0][0]++;
8 [9 e  V6 h+ ?                USART_RevCount[0]++;
: T4 Z, Y6 \! C/ A# p+ Q3 O* G# l5 S6 B9 j4 R$ E2 r1 \  i5 A
                if (USART_RevPointer[0][0] >= USART_RevBuffer[0] + USART_BufferSize[0])3 {6 r' q' v  i/ |5 T* Z$ c5 \. d
                        USART_RevPointer[0][0] = USART_RevBuffer[0];+ W% W3 z0 ~$ f9 ^
        }
2 _6 b* x9 h8 j}. r1 r' {7 s0 t" ^5 w* X/ h* h' m
6 n' u# O- j* L

6 V/ j* i& Q+ f, b0 k. n: e3 e: I, b6 c' |
收藏 评论0 发布时间:2022-4-15 10:00

举报

0个回答

所属标签

相似分享

官网相关资源

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