问题:
7 u! l' P+ _& r7 n& C4 A1 D6 p此问题由客户工程师提出,客户在使用STM32F103 的USART 做串口通讯时,发现了一个问题,当设备正常通信一段时间后,串口不响应外部的通信请求了.
1 Q, f8 h5 z. `. R3 [0 o2 F7 s文中配图引用自STM32F103 的中文版本用户手册 ,下载链接为 :https://www.stmcu.org.cn/document/list/index/category-147% W) D4 e1 q3 R
; F- p* Z' K$ R- h
^! Y. G3 Y; c& J# C
3 r" V, K3 [3 b& d( Z调研:3 |6 r8 i" G/ P9 q
一、 经过调研:
) h$ ]- ~& c1 E' Z1 _. w" Z# g 1.1 客户除了使用USART 做串口通信,还开启了定时器中断来进行数据采集.
4 \" l, I$ W# O/ Q. w" N" v q0 o 1.2 定时器的优先级比串口接收的优先级高.! `3 D9 i! m& P' L: A
1.3 定时器处理数据操作也比较频繁.0 t& t* w+ ]& J; F
1.4 客户使用的STM32F1 标准库(版本V3.5.0).: i6 ~6 S! I. z8 y/ K% W; @
二 、经过问题复现和使用ST-LINK 在线调试和定位发现:
+ K0 q7 h. V! Q: @' k8 M9 h2 y 2.1 在出现这个问题的时候,程序不断的进入串口接收中断,不能够运行到main 主函数处理其他任务了.
! u2 P4 ^" J. Y 2.2 发现ORE 标志为‘1’,也就说明程序是发生了串口溢出错误.
0 C! F& k8 E0 h9 `6 U5 |! A 2.3 客户在进入串口中断后会调用USART_GetITStatus(USART2, USART_IT_RXNE) 来获取RXNE 的值.如果RXNE 为1 则去读取DR 数据寄存器的数据,读取后RXNE 为0,但 ORE 的标志依然为1,依然进入了串口中断.
# C4 Y9 r- [: H1 w 三、 经过分析以及我们可以通过我们芯片的用户手册可以得到以下信息:
% C. N$ P. a/ v' Z4 H 3.1 程序不断进入串口中断是因为ORE 标志始终为1,没有被用户清除掉:
8 E) [# n& k" }+ I, N& K" b7 E+ Q; ]) D. s
详细的专家解答请下载文档:USART 中断方式接收无响应问题的一种情况及其处理方法
! n( R# p7 p$ @ c" d" S( q; _更多实战经验请见:https://www.stmcu.org.cn/document/list/index/category-659
8 o9 ~% C3 u& u- q9 K9 \ # {& w+ J1 B# I$ F
|