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

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

[复制链接]
STMCU小助手 发布时间:2022-5-7 11:40
前言
$ d; s2 F: h& @! _众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和自定义编写串口通信函数。8 S. J! `' Z8 p
* ^0 j9 e8 o( d* s2 x* I6 |9 ]
一、通信接口背景知识
8 T& r4 j: K3 y1. 并行通信和串行通信
5 m( b: X! X! f1 b6 y& o2 O
所谓通信,其实说白了就是处理器与外部设备之间的交流,就像电脑连接键盘、鼠标或打印机之类。计算机领域的通信一般有两种方式,即并行通信和串行通信。这两种方式的优缺点对比如下:
/ K3 L/ A) D* n5 }$ l( ], u3 i; U; G. [& i0 t0 `5 L- M
并行通信
* S  I# G2 z, H+ J   -传输原理:数据各个位同时传输。3 P) g2 ~  u6 A1 j: z% L

) q3 {+ C2 P  \0 ^   -优点:速度快
6 \* q0 r0 U' J( d8 z
+ V. ~5 [  u% F! y, _   -缺点:占用引脚资源多
! p4 P* J. ?6 Q$ z7 i$ O& |2 V0 Z5 ~9 [" ~# i  V
串行通信
2 O# s! ?- p* s3 |( c9 B   -传输原理:数据按位顺序传输。
) F4 b( N( {' W: ]) R6 C+ @5 u$ C9 E  D1 h( h, }# g
   -优点:占用引脚资源少' i" c7 Q' V% |& y; r# j
( G& b( J, T9 ]
   -缺点:速度相对较慢: U% ?4 r: v1 B* I5 R/ x& j
6 B1 p; C# w8 m0 c' M  {+ Y! u
2. 串行通信的分类
0 v2 X8 j* e& B由于本文所讲的串口通信属于串行通信,所以就不对并行通信做过多的讲解了,下面是串行通信的分类,按照数据的传送方向可以分为:
# z- ~! Y% l/ Y: l$ v/ C' _7 u# e
$ J6 g! h* x! z8 l9 y单工:数据传输只支持数据在一个方向上传输
3 I9 p  \9 J; C$ p2 M  c. w7 S# O半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;
% S3 f& i( @3 n全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
% U6 I3 V* f' r  }0 F, x为了清晰的表述这三种传输方向上的区别,我们看下图:, T8 b3 {4 I4 N$ K; u$ p8 B9 R
/ u4 ^6 D. x" K: t5 s. L: e7 k
~E$_DJ7FBW64QTC9IC_)BVR.png & G1 C$ p* E" M" i! |6 d% c
$ L* s* y) \- K& C1 W! M+ \# |- a
(a)单工通信        (b)半双工通信        (c)全双工通信
' }- P3 Q) g7 r1 b& i1 F另一种分类方式是根据通信是否有时钟信号来划分的,分为同步通信和异步通信。% I7 o) [5 ~/ L! U+ Z. S: d8 E

( `+ Z1 v# {6 K1 t同步通信指的是带有时钟同步信号,比如:SPI通信、IIC通信;
- [8 M9 g6 [% l7 ]
( b- G; \$ r7 @7 {+ _1 g% R* X异步通信指的是不带时钟同步信号比如:UART(通用异步收发器),单总线。
, c5 X: d1 v7 B/ p* Y: d0 S; M4 R' [# k+ C
我们以下面的表格来详细对比串行通信接口
( a. a& n' U5 ^  [1 Z) K8 C& _* C0 q* u( }# i3 [
K$M880]{5K0NW2IAOWO.png
2 }+ ?6 c5 c5 i7 r$ A  X7 A& f' @+ Q8 P6 C  m
二、STM32的串口通信基础
. P0 ~0 L+ F: [1. 串口通信接口
. J4 `4 l* [# ?  {9 s
STM32共有两种串口通信接口,分别是:UART通用异步收发器,USART:通用同步异步收发器2 }7 X3 N* h4 E0 Z& i
* a- K$ G% h! O- `/ h
对于大容量的STM32F10x系列芯片,包含3各USART和2个UART。UART异步通信的引脚连接方法如下:. h( \: e: B7 |

& I2 B2 l: L% t8 c )FLZ0SA}L2301K`33X~D}}R.png : K, S. D  w+ _# Z' q, q: Z
6 N; c1 d7 B! t$ X
这里需要注意的是:TX引脚要连接另一个控制器的RX引脚,反之RX亦然。# Q9 U) G4 k. L2 T& M
9 U" S2 z5 s- d* O. f+ S
下图是STM32大容量芯片的5个串口对应的引脚号,可以通过中文参考手册查询
4 \% t* q# v7 F. N9 t
" {0 L* G: v. o# I1 S QK1UH]W{OD%}W`H{%%ICWEQ.png
4 w% C* i: g6 a: q
9 D/ ~1 o5 q1 p4 L' E 查阅官方手册,UART异步通信方式的特点如下:
) r6 v- H8 G6 S- m$ @
& O9 H% X" @1 x4 O全双工异步通信。
0 F& H. D+ n! x" _分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s8 w, T. Z; o. `6 T5 w7 N
可编程的数据字长度(8位或者9位);
7 S* v! U1 W; u8 o' t* s+ K0 @' @* ~可配置的停止位(支持1或者2位停止位);
& v; B% c! g% E! D可配置的使用DMA多缓冲器通信。
+ ^8 d' {2 J% W* |6 l单独的发送器和接收器使能位。
8 U7 P7 A8 j6 C: C检测标志:① 接受缓冲器  ②发送缓冲器空 ③传输结束标志
1 {7 E9 f( u$ k# V/ V) G: \多个带标志的中断源。触发中断。
+ t/ w! U* }( q3 R. N4 i& {: N: L其他:校验控制,四个错误检测标志。0 E7 A) n3 B$ l' O$ p5 c3 \" D
2. 串口通信框图- n1 e% Z4 w) K4 }) i- t
学习STM32单片机的外设,最重要的是要理清楚它的框图,下图就是串口通信的框图:
+ r( M5 K0 ?! w1 v  F, C- a) A5 U0 a+ x
C2XM(K7JUKMP`9)4YOGJ494.png + [. y" |3 o; K. W1 l" Y/ {. x

/ j- `' H$ T8 O! O% y' p 从这个框图可以看出,STM32的串口通信是由最下面的波特率控制部分产生波特率,给来自PCLK1/2的时钟做预分频,再经过1/16分频后传给发送/接收其控制,最后分别发送给发送移位寄存器和接收移位寄存器。这两个寄存器分别在发送数据寄存器(TDR)和接收数据寄存器(RDR)的控制下完成和外部之间的数据发送和接收。' T* ~5 ?/ X! A, k

* T  g! ^! r4 Q! U+ ?8 u6 }3. 串口通信相关寄存器
, f' e  Z# \, B* X0 U$ OSTM32串口通信的相关寄存器共有3个,分别是:
* B5 w( I' Y( b, U1 Y" P" ?/ M% _8 `
USART_SR状态寄存器8 g+ z% p9 M1 v+ a3 R9 V4 Q
USART_DR数据寄存器
! c- P* H: X: g# f- w# [: z! jUSART_BRR波特率寄存器  v4 N/ q2 I6 ~* O
下面是来自中文参考手册的部分截图介绍:. v8 A2 E' r; H! R& h! ]

" q/ ~5 x, c* m/ m/ a* U  x" o) F O}@1F67{3[]X~$BN52SWP.png ! o  x; s9 l1 B9 s7 z" q% f9 U  p" p: ?
4 l, H' h5 n3 u) ~; z7 ~- ^3 P% d
`3%WZ2QC_RO1N`BJZ9%GHCA.png
5 S% y. w5 v  o, u) T8 ^6 G* E" ?0 s# L" K/ w0 c% r$ I
_)NKLA7RY0WBETB$Y1PLW$W.png ( a2 E2 k$ B8 E2 J5 t# N4 p

% i# b9 O" A5 t9 E. g1 x O[1%NB67_]7@MFTTB47{439.png
- C# z: Q% |8 w7 j! ]; d
% `" f; b" _1 y7 l6 l8 Y XZVMCBR7U9@T6B}~U~]G6TW.png
* p7 p( R  h$ u/ a( E+ ]1 g! G  O. p4 Q; D$ [+ V7 w
还有一个寄存器是控制寄存器,用来存放串口的控制和中断相关配置位,这里不做展开了。5 X; ?. k) B' U

6 b# u% }$ f2 e建议大家在学习基础外设(GPIO、定时器、外部中断、串口通信等)的时候不仅可以熟悉库函数的编写过程,寄存器编程也同样重要,不一定要掌握,理解即可。读者不要被寄存器编程吓住了,其实串口的寄存器相对于GPIO是很少的,配置过程也比较简单。+ p; u8 S, P$ X& C! L

) k) K0 h6 i" `) p2 o* i* e4. 波特率计算方法0 O' O0 |- U8 z" c# X2 K

! S# V; e8 \* Q" r& Q$ F8 I8 [$ P {1X6T55S7~KX{G8%4TJWTRV.png
( C4 p% R& [8 Z% I/ ^0 C4 E' Y
+ R7 G. J' S. m4 n )(_P~FS4({)$I6U`K)FA@RV.png
, j' h# ~( p; d9 }6 ?1 z4 R
" j/ O5 j) g7 _; H0 N* s7 Q* ^ 这是官方文档的信息,波特率预分频器是分数预分频器,为什么小数部分要乘以16呢,大家可以理解位最后的小数是四位,四位二进制的1111正好就是16(15)。
: c" k" ]  U9 y9 G
+ F4 R2 Y  {$ b) ?3 |$ p" |三、库函数配置
. K1 {$ h3 H5 J% c1. 串口配置一般步骤
# E- t5 z8 a1 Y; x; _* P
串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();) T" `' Y5 c3 ~6 n
串口复位:USART_DeInit(); 这一步不是必须的
0 s+ M! f; f4 M5 ~: WGPIO端口模式设置:GPIO_Init(); 模式设置为推挽复用以及浮空输入或者上拉输入(具体可参照中文参考手册)
9 d- c. ]3 K( M7 Q9 w, t串口参数初始化:USART_Init();
8 v6 f5 |* H2 z) [2 N: P开启中断并且初始化NVIC(如果需要开启中断才需要这个) NVIC_Init();USART_ITConfig();; u$ ], K2 j, y4 \( y+ I
使能串口:USART_Cmd();- Q! G0 v) w& {$ d% s
编写中断处理函数:USARTx_IRQHandler();
& D; ]: B: y1 n串口数据收发:void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
: P, h, E- \* Z4 b$ }/ O串口传输状态获取:( L+ _5 }" \9 M
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
. q; h& `2 p- v( ^& u
5 T; f% O: a. l; {8 g8 Cvoid USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);1 i0 X0 J' b9 I0 v3 `( ]3 m- P
# U0 Z  H' R- y# k9 M  X
总结
' ?% J; b6 H7 n) F5 K这就是关于STM32的串口通信基本知识的介绍,学好这部分知识是日后深入学习STM32的基础,STM32虽然有很多串口,但是具体来说它们的配置过程基本上都是一样的,只不过是引脚不一样而已,希望大家反复学习这部分知识,做到掌握,这是日后深入学习STM32的基础。
# S% ]! J! x: A7 T  z( W: y( I
; h: e  }9 s, a8 p. Z& j8 ~7 I/ ]& ^1 Z/ a  e. c  F. N2 n3 P1 a9 C4 Y
5 c- _- W% x- p7 z) ~; X
收藏 评论0 发布时间:2022-5-7 11:40

举报

0个回答

所属标签

相似分享

官网相关资源

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