介绍串口通信- A7 r! f7 H: K) b; N- h/ Q% K1 m' S
( N# J f% z2 ?& y( ?7 [' d
按照数据传送方向分类 ?0 Y) n: }& y' ?6 W
- 单工:数据传输只支持数据在一个方向上传输
$ w3 k: p% m8 e
( Q& g* E2 T3 [; ]2 A/ y+ m; T- m - 半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口& t( m8 |% p, M( W' c$ e# X G F( M& e
- 全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端* V1 y0 l! C# H9 O/ g9 @
7 ?8 d. L- c$ T5 C7 N" G 分别如下图中的a、b、c所示。
1 @$ ~+ T5 y0 b: H0 p! h
( S5 P$ u* u9 P1 O+ T 按照通信方式分类
, }+ e% [5 o. D' `( R$ o8 {
% H4 z/ Z' F% J$ J3 Z- 同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口; Q+ w8 @7 c& v7 I/ _
9 f4 \8 {* U# R" ] - 异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线
0 Y, ~# I+ ^4 `& Z8 M" M0 z. R3 H2 {* u$ K; S
在同步通讯中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数据。例如,通讯中通常双方会统一规定在时钟信号的上升沿或者下降沿对数据线进行采样。
0 l- i3 J# I( Q% M; H: S. X% r& J 在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些用于同步的信号位,或者将主题数据进行打包,以数据帧的格式传输数据。通讯中还需要双方规约好数据的传输速率(也就是波特率)等,以便更好地同步。常用的波特率有4800bps、9600bps、115200bps等。* X. d( r* K0 j; c# f6 i
, K8 f; N* T2 X, Z' W* a
在同步通讯中,数据信号所传输的内容绝大部分是有效数据,而异步通讯中会则会包含数据帧的各种标识符,所以同步通讯效率高,但是同步通讯双方的时钟允许误差小,稍稍时钟出错就可能导致数据错乱,异步通讯双方的时钟允许误差较大。
) L9 t, ?7 H# N W" {3 N) BSTM32串口通信基础' g q6 \/ O! U1 L6 V6 X; M
4 Z( H' k- K3 H5 Z1 o% h: o STM32的串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器)。而对于大容量STM32F10x系列芯片,分别有3个USART和2个UART。
2 N) W+ D! o3 o1 E- M, SUART引脚连接方法
# d+ m5 d: S! g. M2 @* q8 l& o1 q" A; ]9 ^# b$ U
- RXD:数据输入引脚,数据接收4 r- k" S. R' B; z; D
- TXD:数据发送引脚,数据发送5 l$ }) S$ m- A0 g+ C. w
- u: K9 u+ ~) T& {9 j( R
6 _+ u0 n% g0 ~' O* E
对于两个芯片之间的连接,两个芯片GND共地,同时TXD和RXD交叉连接。这里的交叉连接的意思就是,芯片1的RxD连接芯片2的TXD,芯片2的RXD连接芯片1的TXD。这样,两个芯片之间就可以进行TTL电平通信了。6 p5 G a, b4 |% t7 B
4 ]' s! G. y1 A4 e, N1 ]5 k
( M; E g; b5 A* F" h. ]. K 若是芯片与PC机(或上位机)相连,除了共地之外,就不能这样直接交叉连接了。尽管PC机和芯片都有TXD和RXD引脚,但是通常PC机(或上位机)通常使用的都是RS232接口(通常为DB9封装),因此不能直接交叉连接。RS232接口是9针(或引脚),通常是TxD和RxD经过电平转换得到的。故,要想使得芯片与PC机的RS232接口直接通信,需要也将芯片的输入输出端口也电平转换成RS232类型,再交叉连接。; @; O* Z8 F. L5 _( \
; S: o+ N* Q* i- v# K P$ s 经过电平转换后,芯片串口和RS232的电平标准是不一样的:
- b ~ ^2 p0 J% l1 P$ d4 E- 单片机是TTL电平:+5V表示1,0V表示0
: @. P) S4 ]( c- l3 f - RS232是负逻辑电平,-3~-15V为1,+3~+15V为0
) p9 O# E3 _- e: v
s& f; z+ v3 A! L7 ` RS-232通讯协议标准串口的设备间通讯结构图如下:
' ~/ H+ @ t, g
3 d- A0 ~ s5 m, u. e$ a5 X" X7 Q6 t 所以单片机串口与PC串口通信就应该遵循下面的连接方式:在单片机串口与上位机给出的RS232口之间,通过电平转换电路(如下面图中的Max232芯片) 实现TTL电平与RS232电平之间的转换。下图中的P10,也就是上文中提到的DB9。! ~) Y9 p0 \9 R% o2 M- L2 Z
0 ~( c% _: }, }9 J5 W/ a% a3 _
( P8 O' F7 E6 z7 u- X & s$ m3 _* ~- M) [7 s5 g, ^
STM32的UART特点
8 h U6 r; H; P, J5 T- 全双工异步通信;6 z$ F" I, D7 `# k- E, |
- 分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s;2 ?: K: ]' m( {0 s5 t# D. O7 v- w* z
- 可编程的数据字长度(8位或者9位);
6 q7 P* p) G7 H$ O+ i) i( r+ S8 } - 可配置的停止位(支持1或者2位停止位);2 E& _$ l/ M, U4 |/ Y2 L! S
- 可配置的使用DMA多缓冲器通信;
, i+ V* I8 G1 h9 X# |9 m. | - 单独的发送器和接收器使能位;
' e! M9 D9 F5 [% J* i - 检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志;
" k, O; q) Y: ], `4 R$ w/ P. n - 多个带标志的中断源,触发中断;
8 S' @$ o5 I' k2 Q8 c8 e/ v - 其他:校验控制,四个错误检测标志。
8 g% K( o& R, w$ K
. D+ |* F# Q8 S: ?$ L. C 串口通信过程
+ k2 {! \1 x# l6 U
. M) ?, [% Z p, a5 [; e5 y9 n- a
STM32中UART参数0 H! z1 M5 i1 m$ l) l! Q
! M9 D: P4 b# a6 f3 W; G) G 串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口,通讯双方的数据包格式要规约一致才能正常收发数据。STM32中串口异步通信需要定义的参数:起始位、数据位(8位或者9位)、奇偶校验位(第9位)、停止位(1,15,2位)、波特率设置。
- E J/ k! v, i UART串口通信的数据包以帧为单位,常用的帧结构为:1位起始位+8位数据位+1位奇偶校验位(可选)+1位停止位。如下图所示:6 N' F0 y5 l- `
% b; I2 `+ ~ `4 S- l
3 c" t4 R: ~, m( ~9 x# c3 D 奇偶校验位分为奇校验和偶校验两种,是一种简单的数据误码校验方法。奇校验是指每帧数据中,包括数据位和奇偶校验位的全部9个位中1的个数必须为奇数;偶校验是指每帧数据中,包括数据位和奇偶校验位的全部9个位中1的个数必须为偶数。- p! Q4 c8 `- @2 z
, {" \! h. C2 Q, ~; C 校验方法除了奇校验(odd)、偶校验(even)之外,还可以有:0 校验(space)、1 校验(mark)以及无校验(noparity)。0/1校验:不管有效数据中的内容是什么,校验位总为0或者1。
# o" r; D2 z( e6 i4 K; L3 EUART框图+ `& w B0 e) l
1 n8 E5 ^6 V. l6 z) C! G. [ 这个框图分成上、中、下三个部分,具体的可以看《STM32中文参考手册》中的描述。
9 V6 p8 }: m3 _
7 n+ `" y9 w1 n i1 A2 e5 }% ?- R/ f 框图的上部分,数据从RX进入到接收移位寄存器,后进入到接收数据寄存器,最终供CPU或者DMA来进行读取;数据从CPU或者DMA传递过来,进入发送数据寄存器,后进入发送移位寄存器,最终通过TX发送出去。; W l, B1 ^( X
0 \! w6 m$ V: d
然而,UART的发送和接收都需要波特率来进行控制的,波特率是怎样控制的呢?, d/ i' g% N5 d ]& p8 X
, h, \8 t5 t3 H& H0 ~7 X
这就到了框图的下部分,在接收移位寄存器、发送移位寄存器都还有一个进入的箭头,分别连接到接收器控制、发送器控制。而这两者连接的又是接收器时钟、发送器时钟。也就是说,异步通信尽管没有时钟同步信号,但是在串口内部,是提供了时钟信号来进行控制的。而接收器时钟和发送器时钟又是由什么控制的呢?
8 n+ e# H$ L% {# }1 d; m( d& f/ Z% f
可以看到,接收器时钟和发送器时钟又被连接到同一个控制单元,也就是说它们共用一个波特率发生器。同时也可以看到接收器时钟(发生器时钟)的计算方法、USRRTDIV的计算方法。
% q6 ?6 z0 ^2 X" z6 ?$ I" \! h
, D( c+ x, j+ J! i 这里需要知道一个知识点:
. {. h3 D6 t9 l4 h4 q- UART1时钟:PCLK2(高速)/ I' r7 P5 m0 R4 z1 n
- UART2、UART3、UART4时钟:PCLK1(低速)
0 X) N. h$ {/ g6 Y# n# z h3 V- L( p8 h+ r; B% x# |9 B( |
|