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

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

[复制链接]
STMCU小助手 发布时间:2022-2-12 18:25
问题:
$ {$ N1 |- l9 z, U( A  e$ T此问题由客户工程师提出,客户在使用 STM32F103 的 USART 做串口通讯时,发现了一个问题 ,当设备正常通信一段时间后,串口不响应外部的通信请求了.
- z4 I! e" O7 d5 B文中配图引用自 STM32F103 的中文版本用户手册 ,下载链接为 :
5 \. f4 h. u* U! F/ T UVNI)Z5UDP5IVAKN5Y[7[WY.png
1 v3 ^) Y1 B6 @0 b# f& o
5 `0 O! I4 h& V% V7 k调研:1 G- L+ B9 H4 i
一、 经过调研:) ?0 d  q( U: @) y$ x
1.1 客户除了使用 USART 做串口通信,还开启了定时器中断来进行数据采集.
) n! D- b2 r$ X$ \& m  P& C/ a1.2 定时器的优先级比串口接收的优先级高.
6 r: h# Z# C0 o6 C( _- V1.3 定时器处理数据操作也比较频繁.
, e6 J9 Q7 N  C' r; p/ j# T1.4 客户使用的 STM32F1 标准库(版本 V3.5.0).% d4 U2 _- o; Y9 N, M* u% x0 Q
二、经过问题复现和使用 ST-LINK 在线调试和定位发现:
* i5 H  X! e1 x, ^) D2.1 在出现这个问题的时候,程序不断的进入串口接收中断,不能够运行到 main 主函数处其他任务了.
  K6 W% }/ H; u" C0 j# p2.2 发现 ORE 标志为‘1’,也就说明程序是发生了串口溢出错误.$ I$ K. r- B# `1 v2 ~1 z
2.3 客户在进入串口中断后会调用 USART_GetITStatus(USART2, USART_IT_RXNE)来获取 RXNE 的值.如果 RXNE 为 1 则去读取 DR 数据寄存器的数据,读取后 RXNE 为 0,但是 ORE 的标志依然为 1,依然进入了串口中断., p9 ]2 H9 |+ `
三、 经过分析以及我们可以通过我们芯片的用户手册可以得到以下信息:
$ B0 z" ~1 J8 [3.1 程序不断进入串口中断是因为 ORE 标志始终为 1,没有被用户清除掉:
' g4 q! l# \( y3 S% V( m% d4 |8 [/ }/ s* a4 I# I( a2 q
PG~E{WU1OM3GCO`}M}1RSD6.png 9 s4 Y4 `; m# }

8 m. @) P6 Y8 y从上图红色部分我们可以看到,如果串口接收中断开启了,那么 ORE 为 1 时就会产生中断.9 n) ?" t2 P. ~4 m/ F( J$ Z5 i
3.2.从下图我们可以看到,顺序执行对 USART_SR 和 USART_DR 的操作就会清除 ORE 的标志,客户在中断中执行了以下操作,那为什么 ORE 标志还没有被清除呢?(R1 执行了读USART_SR 操作,R2 执行了读 USART_DR 操作).
, r, k0 g- a8 b7 s# m2 [! _
5 ]. j0 T  C# Y+ c/ O: L )QGA6F[{G`G5B%@VCL)9824.png 0 @9 V& n5 R) Q& B% c! P% |! p. w
* e) C# ]  p: i' A$ I: J0 Y
3.3 我们可以看手册中下表的解释:* R; h7 {$ X+ Z+ X+ Z9 _: o1 D
3.3.1 ORE 表征的是一个历史事件,当 ORE 为 1 时,表明至少有 1 个数据已经丢失.+ w" D, H, |6 `# N: a
3.3.2 这有 2 种可能发生的情况,RXNE 为 1 的情况 R3 和 RXNE 为 0 的情况 R4,如下图中的解释.
& ?3 a7 B, N2 |  n- f4 m7 C  |! B
`B8305UXTORP02HNJI]AZ%E.png
- j, x0 X: P. u) h% w% M- _+ T+ x4 Q0 a* d7 {; t
3.3.3 我们从上图可以看出,3.2 图中的 R1+R2 操作只能处理 RXNE 为 1 的情况;3 s" Y7 G) N' o$ z8 Q) S+ V
当 RXNE 为 0 的特殊情况, 就是在读序列器件(在 USART_SR 寄存器读访问和 USART_DR 读访问之间)接收到新的数据,数据 SR 虽然被读过了,但是 overrun 事件依然发生了,以上操作是不能够处理的:
6 }: |' T: }, x! J& ]" W% K3 c5 H7 o; L6 R$ @% C
%VMRSZL{X4L9G[L17NNMA_M.png 8 [2 q' Y/ l3 |) h- V- c* f: \
6 b. l7 o# U. E! W% T$ x8 s
3.4 因此我们要在应用中对 ORE 标志进行处理,即当判断发生 ORE 中断的时候,我们再读一次USART_DR 的值,这样如果没有新的 Overrun 溢出事件发生的时候,ORE 会被清除,然后程序就不会因为 ORE未被清除一直不断的进入串口中断了,代码处理如下:
! f+ ], `  T5 I  u6 I9 p& `' a7 G: {+ v* V+ u5 g8 g
JQOWY[(Q%J%8W2W_%0GF7CG.png / f9 t+ S6 G5 T. w- N5 k

" Z! \3 ]4 j, d& L结论:

8 k/ J; h8 a" E3 O7 y9 {4 w对于这种情况,我们可以看到 USART 串口接收中断使能了,那 ORE 中断也就开启了;为了消除在通过读序列(USART_SR/USART_DR)的过程中产生的溢出错误,我们可以尝试在应用程序中需要针对 ORE 标志做一个处理来清除 ORE 标志,使得串口通信可以正常的继续工作.
7 {! }; l. x/ O/ W' P# k8 y建议客户在做串口通信时需要增加帧检验功能,如 CRC 校验等...,当发生 ORE 时,帧校验肯定是通不过的,不会造成从机误响应.+ V5 Z" j$ H+ |! k1 J. s

) M: k3 u* h7 {, Z6 ?+ f" F8 p
赞 收藏 评论0 发布时间:2022-2-12 18:25

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版