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

【经验分享】USART 中断方式接收无响应问题的一种情况及其处理方法

[复制链接]
STMCU小助手 发布时间:2022-2-12 18:25
问题:
5 L. w2 L: R- b此问题由客户工程师提出,客户在使用 STM32F103 的 USART 做串口通讯时,发现了一个问题 ,当设备正常通信一段时间后,串口不响应外部的通信请求了.
/ i4 S  w4 w* ~3 I文中配图引用自 STM32F103 的中文版本用户手册 ,下载链接为 :$ l! D- f) f6 f) ]
UVNI)Z5UDP5IVAKN5Y[7[WY.png % o7 u' ~' K) r+ N% o

/ M  {) k* d1 B$ h4 P( ?: t# M调研:  J5 J& N* @( B
一、 经过调研:
. O0 p! y0 @! b1.1 客户除了使用 USART 做串口通信,还开启了定时器中断来进行数据采集.7 E% v0 G; t" o+ m! I4 I
1.2 定时器的优先级比串口接收的优先级高.; o! g9 t5 `2 r, W
1.3 定时器处理数据操作也比较频繁.
! M/ O' e7 G# p# F9 ^* j0 f  e- o9 L1.4 客户使用的 STM32F1 标准库(版本 V3.5.0).
1 i/ K2 p# x1 U2 _( Q' e' ]  ~二、经过问题复现和使用 ST-LINK 在线调试和定位发现:
5 }) y* Y% L3 c& @7 r, K2.1 在出现这个问题的时候,程序不断的进入串口接收中断,不能够运行到 main 主函数处其他任务了.6 z" x/ T4 s% R& Q, b* M
2.2 发现 ORE 标志为‘1’,也就说明程序是发生了串口溢出错误.
/ m3 ~* D" m. f# c3 {3 ]( x2.3 客户在进入串口中断后会调用 USART_GetITStatus(USART2, USART_IT_RXNE)来获取 RXNE 的值.如果 RXNE 为 1 则去读取 DR 数据寄存器的数据,读取后 RXNE 为 0,但是 ORE 的标志依然为 1,依然进入了串口中断." P  q4 ^2 ]- t  y6 E
三、 经过分析以及我们可以通过我们芯片的用户手册可以得到以下信息:
3 q0 X$ J, Y* T/ i% k: P% O* k3.1 程序不断进入串口中断是因为 ORE 标志始终为 1,没有被用户清除掉:
- H) ]5 |+ p! e' n
( F/ S- I% |2 {- q PG~E{WU1OM3GCO`}M}1RSD6.png + W' `" L) r( C  f; @9 k8 H' R
8 i( Q' _8 ?- Q! L8 ]! g" ~
从上图红色部分我们可以看到,如果串口接收中断开启了,那么 ORE 为 1 时就会产生中断.0 r6 A: r9 c: {$ \! s! S8 F
3.2.从下图我们可以看到,顺序执行对 USART_SR 和 USART_DR 的操作就会清除 ORE 的标志,客户在中断中执行了以下操作,那为什么 ORE 标志还没有被清除呢?(R1 执行了读USART_SR 操作,R2 执行了读 USART_DR 操作)./ Z6 H( T* T$ o; V. k9 Z7 x5 j& E
! _4 }. p+ _/ v: G1 }  {; i1 s
)QGA6F[{G`G5B%@VCL)9824.png
& z0 R# i& p) Y9 @. x& T3 ?$ }3 [, V' f9 E# `
3.3 我们可以看手册中下表的解释:# Y9 S$ L+ M  ~8 Q9 e/ L
3.3.1 ORE 表征的是一个历史事件,当 ORE 为 1 时,表明至少有 1 个数据已经丢失.  t7 f- ^' o- F" ^6 K( ]+ @7 P
3.3.2 这有 2 种可能发生的情况,RXNE 为 1 的情况 R3 和 RXNE 为 0 的情况 R4,如下图中的解释.
4 K# O6 x1 z3 i$ Q0 _5 z
4 y$ p0 _$ W9 d; E0 C9 J `B8305UXTORP02HNJI]AZ%E.png
- e7 ~7 _% k4 D. X( l# C; Q+ v5 h5 r" z7 F9 }( w. E0 G
3.3.3 我们从上图可以看出,3.2 图中的 R1+R2 操作只能处理 RXNE 为 1 的情况;" f2 @, G2 n! D1 t' Q4 X
当 RXNE 为 0 的特殊情况, 就是在读序列器件(在 USART_SR 寄存器读访问和 USART_DR 读访问之间)接收到新的数据,数据 SR 虽然被读过了,但是 overrun 事件依然发生了,以上操作是不能够处理的:9 Y% o1 _' Z' |: y) d

2 P) x1 {; f' Y4 | %VMRSZL{X4L9G[L17NNMA_M.png
7 M2 g0 @+ v- M, H: n( y+ @# t# G0 R( z' f' j. ^
3.4 因此我们要在应用中对 ORE 标志进行处理,即当判断发生 ORE 中断的时候,我们再读一次USART_DR 的值,这样如果没有新的 Overrun 溢出事件发生的时候,ORE 会被清除,然后程序就不会因为 ORE未被清除一直不断的进入串口中断了,代码处理如下:: R; ~+ g; t/ u  ^

3 y4 m, S2 q) I5 [$ C7 w JQOWY[(Q%J%8W2W_%0GF7CG.png
0 w( P1 e" p2 I+ w" F, c5 M; A: e$ y1 D" S$ T! S% V4 z# k1 i9 r) D
结论:
  Y! @8 y: r4 ~/ T7 l4 X* b
对于这种情况,我们可以看到 USART 串口接收中断使能了,那 ORE 中断也就开启了;为了消除在通过读序列(USART_SR/USART_DR)的过程中产生的溢出错误,我们可以尝试在应用程序中需要针对 ORE 标志做一个处理来清除 ORE 标志,使得串口通信可以正常的继续工作.
" h; u( j" m% l* X* l. ?  P建议客户在做串口通信时需要增加帧检验功能,如 CRC 校验等...,当发生 ORE 时,帧校验肯定是通不过的,不会造成从机误响应.
+ b& ^) x( P. Z4 r* n5 v5 j5 j. ?& [- A; E, \4 |2 X
收藏 评论0 发布时间:2022-2-12 18:25

举报

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