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

【经验分享】STM32-串口通信详解

[复制链接]
STMCU小助手 发布时间:2022-5-7 11:40
前言7 k% a7 ^) ^, |! l9 z
众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和自定义编写串口通信函数。
; {5 N  H2 V  C6 m3 C& R* _$ ]- ~5 d8 b2 h  D/ w; h
一、通信接口背景知识
4 s6 w/ u5 ~, y( s% n( ]# i1. 并行通信和串行通信
; i8 s; [  C  `. t+ h
所谓通信,其实说白了就是处理器与外部设备之间的交流,就像电脑连接键盘、鼠标或打印机之类。计算机领域的通信一般有两种方式,即并行通信和串行通信。这两种方式的优缺点对比如下:7 t4 g2 r- \: b/ N( x+ V

1 ?+ D# `  u4 {+ b5 v$ c并行通信
4 p  x  P5 h1 ?* @$ A2 I   -传输原理:数据各个位同时传输。
9 o& `. u: `9 W
/ s  H- d# u8 ?$ Y; f   -优点:速度快( A+ L6 G) M2 o5 l' f. v

9 S. b1 C( o" H  x! S   -缺点:占用引脚资源多
; @0 @1 A! ~4 ]9 z7 T0 F1 e5 F- G; d  J2 I5 x! z6 ~
串行通信
% c" |% w% u8 n/ ^+ I   -传输原理:数据按位顺序传输。
3 u$ z1 l  ?+ p9 b& P
6 P8 z4 ]5 F9 G2 v% y6 C   -优点:占用引脚资源少
4 h/ I4 E9 K6 V% S/ i
- d/ {  M& b9 c) r1 M0 R2 l   -缺点:速度相对较慢5 k+ o; F1 g5 S+ V$ c* X

3 w7 T6 K7 Y, w" P- W2. 串行通信的分类
  N9 E0 x( E& |# J由于本文所讲的串口通信属于串行通信,所以就不对并行通信做过多的讲解了,下面是串行通信的分类,按照数据的传送方向可以分为:
7 N9 ^+ m# N' M& G( _
! P6 v* Z* ]) p9 _0 Y6 f单工:数据传输只支持数据在一个方向上传输
' d  V0 `# J% W% d: N半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;7 ]3 i  j3 L" n- `% ~2 p5 ?
全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
: w6 R$ B# s  K7 z8 H为了清晰的表述这三种传输方向上的区别,我们看下图:
; k3 `8 R: N( s& S( m+ o
7 l/ e/ m6 B0 V& m4 x( R' b ~E$_DJ7FBW64QTC9IC_)BVR.png # ]8 O" h0 K! F. A. E5 }( r2 ^9 [  k
  w* m- O! J$ N4 T7 `
(a)单工通信        (b)半双工通信        (c)全双工通信
) |! D" V: M3 [另一种分类方式是根据通信是否有时钟信号来划分的,分为同步通信和异步通信。6 T& J( y6 Q4 R# g

2 v% F" I7 R: D/ Z8 q! X同步通信指的是带有时钟同步信号,比如:SPI通信、IIC通信;
" [) n9 u+ j! e- z7 H; |$ T
+ t% N) j" |5 R* @异步通信指的是不带时钟同步信号比如:UART(通用异步收发器),单总线。
0 k/ \/ }( y" N  \7 i6 I2 B$ N6 [& n9 P6 S0 C- S
我们以下面的表格来详细对比串行通信接口
2 z3 d  [! G, p& J: C$ w9 k
' w2 w$ j2 S6 f2 s5 e3 U K$M880]{5K0NW2IAOWO.png
6 U  Q0 z) ~, @4 X* N
; h& A& Y$ N6 R6 U$ i$ ^- d. Q 二、STM32的串口通信基础$ q: ]" r; ~: d, w- X& g
1. 串口通信接口
$ h; M  M. v  R5 o
STM32共有两种串口通信接口,分别是:UART通用异步收发器,USART:通用同步异步收发器$ k' l7 h5 ]! R  j+ u

0 y0 F0 [; k# U) ~对于大容量的STM32F10x系列芯片,包含3各USART和2个UART。UART异步通信的引脚连接方法如下:
) A/ ]6 {6 w7 c+ f5 s0 }7 P
7 `( p% F7 D& F' ` )FLZ0SA}L2301K`33X~D}}R.png + U$ s3 i" p6 X: E) n4 e8 E
- I  v* r( ^0 e9 |% v8 s5 s
这里需要注意的是:TX引脚要连接另一个控制器的RX引脚,反之RX亦然。. Y; a; x7 ]* X2 g  P) o
" d1 `* W; {# R- K8 l
下图是STM32大容量芯片的5个串口对应的引脚号,可以通过中文参考手册查询& f  l7 X2 {9 l  o$ C

) j$ v2 h0 H8 A5 p0 K8 A$ h QK1UH]W{OD%}W`H{%%ICWEQ.png 1 r. E2 e3 C! d4 {$ t; e
8 f6 K- {$ b# z/ \* e8 n5 Y$ F
查阅官方手册,UART异步通信方式的特点如下:
6 E! Q3 z* k8 q
8 R1 x- n  \* ^( n) b  I全双工异步通信。
8 W2 _- l& j$ i! Z$ I5 J分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s
9 G9 X! u# d( l; M; y& |可编程的数据字长度(8位或者9位);
0 ^- W+ c/ H' H1 x- y+ O可配置的停止位(支持1或者2位停止位);# U4 m7 c) m- v# w9 q- ?
可配置的使用DMA多缓冲器通信。
: ?! j) d5 t. I! b; _# A9 P5 }单独的发送器和接收器使能位。, ^) j+ F: m6 P  ?, G  s! M
检测标志:① 接受缓冲器  ②发送缓冲器空 ③传输结束标志
" |; E8 T4 x) I8 J! C7 j多个带标志的中断源。触发中断。
! @) p" i6 Z) l其他:校验控制,四个错误检测标志。
. y& R$ J1 N8 L5 o  u- T" y2. 串口通信框图7 p  W, P' _3 t- Z4 j4 g( Q/ X+ U
学习STM32单片机的外设,最重要的是要理清楚它的框图,下图就是串口通信的框图:
9 N2 c$ D, f& ~9 D4 B1 G, |' n, p8 n& s" E
C2XM(K7JUKMP`9)4YOGJ494.png 1 a8 F( N$ P: X+ l5 D$ l; q  @. |
' f- r; T  R1 ]* X3 h/ ]
从这个框图可以看出,STM32的串口通信是由最下面的波特率控制部分产生波特率,给来自PCLK1/2的时钟做预分频,再经过1/16分频后传给发送/接收其控制,最后分别发送给发送移位寄存器和接收移位寄存器。这两个寄存器分别在发送数据寄存器(TDR)和接收数据寄存器(RDR)的控制下完成和外部之间的数据发送和接收。7 V; T- l% m* n3 Z/ S; X1 c+ T

( J( a3 D  P( a9 n9 Y( t9 ], t3. 串口通信相关寄存器
2 W& p3 @6 g) n8 aSTM32串口通信的相关寄存器共有3个,分别是:& \' K: i- n( @( `5 T' Q
. `. N" o" i+ B- e  L, \! `
USART_SR状态寄存器- d& @7 M4 l2 j. i7 \* \
USART_DR数据寄存器
- v# \+ ]* B4 a) n$ j* C6 n" PUSART_BRR波特率寄存器
6 O2 Q$ p2 O6 I4 o9 T3 G* S  ~+ _下面是来自中文参考手册的部分截图介绍:
" ]" n5 z. p9 x! k( i9 D% D4 Y
, N, n9 b" j" \; u, {/ W. H, T/ x2 j O}@1F67{3[]X~$BN52SWP.png 1 g# p. }9 a4 q
* y/ X) p8 G3 }( P7 q4 J
`3%WZ2QC_RO1N`BJZ9%GHCA.png
" C" v3 o$ N3 C$ Q  c
& H/ `1 X& U$ E _)NKLA7RY0WBETB$Y1PLW$W.png
, S/ `: k. N, F6 |! i
7 ?$ v& u6 k8 [5 S1 L O[1%NB67_]7@MFTTB47{439.png
3 |% O8 U: l4 }* R( t
0 J1 }6 U6 ~4 u( B3 Q0 r0 O XZVMCBR7U9@T6B}~U~]G6TW.png
2 c: U7 J+ g6 v. J( U
( e1 k' k$ C  Y$ O还有一个寄存器是控制寄存器,用来存放串口的控制和中断相关配置位,这里不做展开了。
7 Z& ^( o( `" V2 O, N7 ~: R* R/ p$ }$ S2 U2 ~1 \
建议大家在学习基础外设(GPIO、定时器、外部中断、串口通信等)的时候不仅可以熟悉库函数的编写过程,寄存器编程也同样重要,不一定要掌握,理解即可。读者不要被寄存器编程吓住了,其实串口的寄存器相对于GPIO是很少的,配置过程也比较简单。5 |7 c$ J4 m( Q* d
; V* F/ D& v% D+ L1 t
4. 波特率计算方法/ V' i% i7 [) ?0 M& b. v
) s8 S3 T; r8 I2 @5 Z
{1X6T55S7~KX{G8%4TJWTRV.png ) Y  E2 H- W/ @2 ^- m$ j+ j2 c
7 u8 T8 ]( A5 H: {; p' W9 `
)(_P~FS4({)$I6U`K)FA@RV.png " i8 h; H  i( X% {: w$ i

1 y! F, j0 }" y& T 这是官方文档的信息,波特率预分频器是分数预分频器,为什么小数部分要乘以16呢,大家可以理解位最后的小数是四位,四位二进制的1111正好就是16(15)。
( A& \: n# g$ p* C
/ S& ~' S" c- \' M三、库函数配置0 T/ V2 B, Y/ D# U4 H3 \$ ]/ d
1. 串口配置一般步骤
5 h; {( }! ~' q4 C
串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();
# X- O" h8 y# }' V串口复位:USART_DeInit(); 这一步不是必须的7 v9 f% ~; b6 C6 o7 r, N/ h0 q. f
GPIO端口模式设置:GPIO_Init(); 模式设置为推挽复用以及浮空输入或者上拉输入(具体可参照中文参考手册)( }  [  t; t, J% }) f, D2 s
串口参数初始化:USART_Init();. Z* E! ~6 q5 t- v7 b) s
开启中断并且初始化NVIC(如果需要开启中断才需要这个) NVIC_Init();USART_ITConfig();, i0 h6 Z) k# P0 a, H
使能串口:USART_Cmd();4 L4 g, g6 k, ]
编写中断处理函数:USARTx_IRQHandler();
! q# S. Y. H; ~串口数据收发:void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
# S4 U+ {/ Z& L! Q9 {/ d串口传输状态获取:3 C& X( |: N& G2 P2 e' {) \
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
% v( o; b. M% ^; |* P& t% m9 k
# i5 x* z9 u# h$ Y2 L9 Y5 Dvoid USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);# T1 ?/ o4 k5 k0 ]$ l  H! q
3 E  o9 B# Q' ^- `
总结
/ z. C4 B+ `, @! @这就是关于STM32的串口通信基本知识的介绍,学好这部分知识是日后深入学习STM32的基础,STM32虽然有很多串口,但是具体来说它们的配置过程基本上都是一样的,只不过是引脚不一样而已,希望大家反复学习这部分知识,做到掌握,这是日后深入学习STM32的基础。
- F+ Z) X) E7 k& ^# w/ c8 Q2 Q4 C& T

! j* [, v+ a2 ]  R7 ^" L! L/ a* v+ D% O" M
赞 收藏 评论0 发布时间:2022-5-7 11:40

举报

0个回答

所属标签

相似技术帖

官网相关资源

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