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

基于STM32串口通信经验分享

[复制链接]
攻城狮Melo 发布时间:2023-4-30 17:47
前言! b) Q" k) v. A. V3 |
众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和自定义编写串口通信函数。
( @. \( X. D. X4 J+ V% D; b) A
& i+ k: h6 t8 u( |, w- O
) A* z+ J5 y7 M. W
一、通信接口背景知识
! ~! S" q2 H# X+ J1. 并行通信和串行通信
# r6 s* s- E, k* S3 I# n所谓通信,其实说白了就是处理器与外部设备之间的交流,就像电脑连接键盘、鼠标或打印机之类。计算机领域的通信一般有两种方式,即并行通信和串行通信。这两种方式的优缺点对比如下:' x1 p) U. e4 J2 o" x+ S0 q

& C& S' n5 T+ c' t( C

# a" j; v7 W1 x" }并行通信
! T! |7 i7 g% g, i) M; ]7 h4 a   -传输原理:数据各个位同时传输。
8 k8 }1 _, t' c7 ^/ A" ]+ w   -优点:速度快
: Q7 Y0 G* Y1 [# E9 v2 d1 |" ^   -缺点:占用引脚资源多
+ L- h1 r2 I0 x! ?) u$ D/ ?+ R( ]' |0 c0 y- |2 O6 y4 l' U

* o4 U% f8 G4 ^* W  w. M7 T: @串行通信- ]6 a3 z6 d) y! C) h
   -传输原理:数据按位顺序传输。
3 R* j' [. r8 J) D   -优点:占用引脚资源少# `+ i8 r( V7 F6 E6 E5 R, F
   -缺点:速度相对较慢
) @3 x! E' q# Y% y/ q* E& v( i3 F! Y: `6 H. `
2 m2 M) @" M, Z; q: i
2. 串行通信的分类
- g! l6 l  X& Z  \8 ~由于本文所讲的串口通信属于串行通信,所以就不对并行通信做过多的讲解了,下面是串行通信的分类,按照数据的传送方向可以分为:& j" K2 K- A- ^/ E5 V2 B) K7 h
6 C  L6 z# O% s& P% I
3 K5 W% q' X9 K* v# H  d( F/ M
单工:数据传输只支持数据在一个方向上传输8 y3 p3 K0 B2 h5 `  p
半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;6 v+ L7 _# ^, t. K8 Y$ n, N
全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。3 [* H- b- k, f- `* m

# H6 ?  L, B/ w6 d" x0 B; w, @

# H! p  T* \7 O8 ?0 g5 R为了清晰的表述这三种传输方向上的区别,我们看下图:
8 R& J* z: |- O% h! z
0 ^8 k- L$ A3 Y$ a; N, P2 I" T ac264b36384549b9ba1fef9ce2eecce0.png ( D% S( ?. z5 U9 V1 Y) V: G, k

1 q; }* f# h' K+ A* n% E

! G$ P3 A1 r! `5 {- P(a)单工通信        (b)半双工通信        (c)全双工通信; h; R$ ]; |# X& w  U1 q% F
另一种分类方式是根据通信是否有时钟信号来划分的,分为同步通信和异步通信。
! p. Q/ L, R& r( C/ S同步通信指的是带有时钟同步信号,比如:SPI通信、IIC通信;
" a0 i$ r: T, a: N& f" P% a异步通信指的是不带时钟同步信号比如:UART(通用异步收发器),单总线。/ ^- ?( Z* ?2 U/ I9 V4 P% a) M( n
我们以下面的表格来详细对比串行通信接口
6 E/ W4 B3 [5 c5 O: c" z, K+ W% j  W9 S2 \# v
# P, r4 E7 D! y6 ~, Z* P9 m
dbac60db4f8d44cd9aebe6ff7c41dd9e.png
$ l' L" W& @" h' ]
: s/ }9 p, [  \1 C5 Y% L 二、STM32的串口通信基础
" C: ?5 V4 C7 X1. 串口通信接口
& V. D# ]2 V! ~; q- P+ z0 b2 cSTM32共有两种串口通信接口,分别是:UART通用异步收发器,USART:通用同步异步收发器/ H; R& i+ P3 Z  R1 V3 y- J8 r
' h% o1 U3 z* d, Y) |2 H

6 s2 }, u; N  d8 U对于大容量的STM32F10x系列芯片,包含3各USART和2个UART。UART异步通信的引脚连接方法如下:
9 f+ k% d$ A4 q, V3 K; y, D" Q: j* t. y2 ~+ S3 y
% i2 V# y6 p8 |4 V% N
ae83c1e6cdcc465c811713789ed680d4.png 5a3d411cdfc34816884a0632aa76d7a5.png 5 y0 x" L, x' _& [- X5 E) l
. C. r0 ^9 _; Z( d

$ E9 T+ b9 Y( `1 b8 A1 v$ D+ s
. w1 l5 l+ X% l, u. _6 y. V
这里需要注意的是:TX引脚要连接另一个控制器的RX引脚,反之RX亦然。# X) t. m7 L4 i& E" N& s
4 [4 A2 J# r  ~$ S1 q0 {8 ]

5 K) Z6 B* b) ?& e# h6 U& R下图是STM32大容量芯片的5个串口对应的引脚号,可以通过中文参考手册查询& f% P; J/ a0 S  h

% K* R6 F; F9 U$ K# K+ I

: h) l3 K/ j5 o9 L) L5 v bd0eb7a3a0324fec9d37b41bf66549e3.png 1 L8 l1 z; B( H9 L6 Z3 F
. F' J/ Z4 U. J* e3 Q1 e

. h$ v; o$ C) ?* C1 j5 o+ l 查阅官方手册,UART异步通信方式的特点如下:
! h! m+ \' x! Q& L! C  u2 H全双工异步通信。
9 J1 m+ l" T3 F) u& B; l- ^8 C分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s
2 q% R$ N) B( H9 Z3 s可编程的数据字长度(8位或者9位);
/ h5 B3 t6 |* M2 w  A, P可配置的停止位(支持1或者2位停止位);
. v" W- a0 |0 Y3 n( ?6 j可配置的使用DMA多缓冲器通信。
* H, D( k0 H5 O( _/ c单独的发送器和接收器使能位。
# T- d0 }$ r7 X. d, \0 u3 z检测标志:① 接受缓冲器  ②发送缓冲器空 ③传输结束标志
8 A9 a& t( F: ^, V4 F6 T多个带标志的中断源。触发中断。
& k, q  a- V- a: |9 f其他:校验控制,四个错误检测标志。$ n0 H8 L' G8 Q9 @4 d$ y! _1 e

2 B4 C- p5 @7 K9 c
* g8 A% j! M+ {; K
2. 串口通信框图! S. H# }- h. D- c" H& k
学习STM32单片机的外设,最重要的是要理清楚它的框图,下图就是串口通信的框图:
- ]) x8 x" q& a* K, e8 C
- p4 r/ `+ ?: i( Z  @) y
; E- X6 q) d0 ~8 i
dd78b14eb86e4e77b2a014b9c6b4b78b.png 5 Z$ n9 p: Q; S9 ?! c

$ X( i3 Z9 s  C: M' L" z! \
' u1 w/ f- r9 \3 b4 f# S0 X
从这个框图可以看出,STM32的串口通信是由最下面的波特率控制部分产生波特率,给来自PCLK1/2的时钟做预分频,再经过1/16分频后传给发送/接收其控制,最后分别发送给发送移位寄存器和接收移位寄存器。这两个寄存器分别在发送数据寄存器(TDR)和接收数据寄存器(RDR)的控制下完成和外部之间的数据发送和接收。
, \, N2 v% X1 [0 r4 O2 q" k
) H9 L( ~# g, N& c9 I7 M  l
" O$ l0 g3 K* i& ]: ~  C+ d
3. 串口通信相关寄存器& F7 h% o- k  T- [& k
STM32串口通信的相关寄存器共有3个,分别是:
" I( |: E/ G/ EUSART_SR状态寄存器
/ E# A) ]3 V9 d; U+ EUSART_DR数据寄存器- p2 I# M$ |7 B( F
USART_BRR波特率寄存器2 [3 D+ v; O: j8 B, q% ?9 j
' r# M) K$ i0 z3 X, z1 q' G

$ r( L7 f" M! y1 O; }4 S下面是来自中文参考手册的部分截图介绍:
5 L( f! A' f' S1 H" c: U( a0 [8 c+ Q+ \

% S7 L* r( `9 t  S% G f0e2865656ae4eacbec160743e72eb10.png
9 A$ R; D( Q( k3 q' N. K* h# @& F' M5 s3 U8 k% \  h6 l
0 M3 I( P' S' M1 f8 c
013795b8c49844c5b88516740459945f.png 7 x+ ~0 s! n; t# _+ _

8 z) v# b0 d3 N+ b

0 j: G9 [5 i, z7 z 2f215c8c96684ff1bfb8f1393e05792d.png + R% J3 H5 g& B4 v# T
! K0 Z8 {) G% [' e
0 q- ]: G' R4 d" i6 I2 K! g
5bfea7743ff1400982e0d60669cdf153.png
8 n  ?  L# ~+ p, j) W
1 @' P3 m" H# z$ S7 U

/ D& v( |0 T, P( f: h0 i4 [ 86c8749d79e54a679d98a5a8bc376faa.png
. {+ X2 N5 y3 ~: E% W. c) W6 Y4 V7 g) r# U, S' |: J4 ]# e+ p

% f( D- |, l% q' d) u还有一个寄存器是控制寄存器,用来存放串口的控制和中断相关配置位,这里不做展开了。
% C$ [% T* W5 j/ E& n$ }: \/ `! J$ p) D* R! n

% t  M( y& a) |" ~+ I* \建议大家在学习基础外设(GPIO、定时器、外部中断、串口通信等)的时候不仅可以熟悉库函数的编写过程,寄存器编程也同样重要,不一定要掌握,理解即可。读者不要被寄存器编程吓住了,其实串口的寄存器相对于GPIO是很少的,配置过程也比较简单。5 j7 G7 S5 \% O6 L

( r3 f7 N: b$ y3 c

5 b% g. q5 L, c2 G1 r4. 波特率计算方法8 H' Y' J8 y9 x6 U6 n

# ~- G- g9 L$ P. H* r  U$ N% V
0 G* U+ C9 X- k0 Y6 F9 U
7e31640e4c1943e4902dfcd07fded844.png # U! C" |3 o( A& a
/ S& r5 u- e5 b$ q& d

* j) ]3 H: g5 k8 W: h( R ce096aec52a5437aab8de43298e90825.png ( k8 s3 ^+ W8 p4 O5 `8 v

: O6 r* z- {3 b. D

- `6 y  b6 `8 v# K; W4 o# m 这是官方文档的信息,波特率预分频器是分数预分频器,为什么小数部分要乘以16呢,大家可以理解位最后的小数是四位,四位二进制的1111正好就是16(15)。
) b3 c+ s1 Z9 ^
9 |0 I! _8 s9 @3 S, I

# Y* B7 }7 F  G. D9 d三、库函数配置
* T$ W% V1 z! @+ B1. 串口配置一般步骤
* r& Z9 _" _3 W串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();
* C+ G2 w  u( F1 a5 |( S串口复位:USART_DeInit(); 这一步不是必须的# e$ b8 \# [2 J. O; [
GPIO端口模式设置:GPIO_Init(); 模式设置为推挽复用以及浮空输入或者上拉输入(具体可参照中文参考手册)3 ~( F$ G$ |2 Q) C  I, @8 w; ]
串口参数初始化:USART_Init();5 d8 f- G& U- k- T: g* d# m
开启中断并且初始化NVIC(如果需要开启中断才需要这个) NVIC_Init();USART_ITConfig();
4 |' y" h& F' S8 a8 F使能串口:USART_Cmd();
) s% j& g) T+ e, g1 v2 b' X- Q- _编写中断处理函数:USARTx_IRQHandler();
3 X* f' V9 y- \8 i& G7 i串口数据收发:void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
9 C6 y3 i# ?$ z  H串口传输状态获取:& U4 N& z/ ?4 P
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);/ W! L  ?. K8 I- n

' c% g) q3 y7 s* k+ G5 A
# X) m/ }: h, }; r
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);' }, b- z9 b3 f8 u& N1 H
————————————————
4 q( E, n# K% V% N% f; n版权声明:KevinFlyn0 {) Z2 C: t/ T

+ P: ^& r5 A7 W, t4 {8 i如有侵权请联系删除. d2 U2 m5 ^& M# {/ O8 q' ^

# [3 r9 S; ~6 p/ }* r
1 {% ^' g* m# g  y5 a
收藏 评论0 发布时间:2023-4-30 17:47

举报

0个回答

所属标签

相似技术帖

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