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

基于STM32串口通信经验分享

[复制链接]
攻城狮Melo 发布时间:2023-4-30 17:47
前言
( V: z; t; I/ Y: o1 p# C众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和自定义编写串口通信函数。7 G1 U" [" e% k9 }5 S/ |# y
* ^+ f; @! L1 |' z& {5 T/ Y) e0 s& _
+ s7 H; K& r  `$ I
一、通信接口背景知识
- o1 t. g, U! o3 U' @" G' F: y1. 并行通信和串行通信% Q' C8 N4 p+ q7 p% i6 |
所谓通信,其实说白了就是处理器与外部设备之间的交流,就像电脑连接键盘、鼠标或打印机之类。计算机领域的通信一般有两种方式,即并行通信和串行通信。这两种方式的优缺点对比如下:) E, _' }6 W: ?2 x' p% ~+ Y

9 @2 o- y3 w) a" @$ Z
7 d- q4 ]$ P# u8 A2 V
并行通信* ]3 P6 Q* G& i' [3 ^
   -传输原理:数据各个位同时传输。, d1 |- r2 s6 B7 v* ~
   -优点:速度快, {$ w6 v7 ?% r
   -缺点:占用引脚资源多( D1 t" H( x& ?* f' q  t- x: D
1 ?$ e% I. @& F, z' o7 V1 g- u

% t8 Z$ J1 X0 P! u% B: h; h% v串行通信
2 t& p  y2 `* ~4 h/ K) o: i   -传输原理:数据按位顺序传输。
5 r7 B* Z) u5 T' X$ Z   -优点:占用引脚资源少& C3 R6 K9 L9 S. w$ `* n, o! K
   -缺点:速度相对较慢
  v+ l; P. G: B6 ~1 ]. i8 ~; S+ w' G8 s$ [5 u( g' c6 }4 ^
5 M% ?* r9 p! C1 x
2. 串行通信的分类
, J) N1 P0 R' g8 I6 R, X- Z由于本文所讲的串口通信属于串行通信,所以就不对并行通信做过多的讲解了,下面是串行通信的分类,按照数据的传送方向可以分为:0 w$ S$ W' c8 L9 ^3 g0 C3 n
) Z3 q. z6 y  R: G" Q1 |4 J  q
7 L: ]2 N5 l8 a- }/ h
单工:数据传输只支持数据在一个方向上传输
2 h2 V5 N6 I* ^- Q  t" k5 f4 K半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;
8 [3 P/ Q, l' B; r全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。3 }' \0 j1 E' }! l4 k
/ y3 ^( R# |( O) C

" d- i. n: s' Y, O; P为了清晰的表述这三种传输方向上的区别,我们看下图:# D. _" F" f  V8 Y/ }( k

# a$ u% R6 r; z3 a! U7 Y. I3 x6 { ac264b36384549b9ba1fef9ce2eecce0.png
7 Q  p% j# c; X% ^# J# y# O
, s( q2 |  ]+ D

7 R% ^5 j" l' A3 ?' j% G) k(a)单工通信        (b)半双工通信        (c)全双工通信& l" s$ s7 X1 k4 a0 n
另一种分类方式是根据通信是否有时钟信号来划分的,分为同步通信和异步通信。/ m6 L3 ^" c/ N; r+ u
同步通信指的是带有时钟同步信号,比如:SPI通信、IIC通信;7 H0 ~; E) l7 m. [4 c3 l6 D
异步通信指的是不带时钟同步信号比如:UART(通用异步收发器),单总线。
5 L  k, ~- G0 q6 B我们以下面的表格来详细对比串行通信接口2 M1 C" ?, ^0 K6 r& P( O

6 x% l( {9 F5 H5 J& G6 I0 ?
) f& C' k- @/ k# j. U. Q* N
dbac60db4f8d44cd9aebe6ff7c41dd9e.png
5 K# }! H- ?, X! C. F1 w9 N" z6 V
二、STM32的串口通信基础6 r# Y8 s) M0 b0 Y) s% h5 d
1. 串口通信接口% _: z$ ^+ p( M+ z$ ]
STM32共有两种串口通信接口,分别是:UART通用异步收发器,USART:通用同步异步收发器
: c9 m5 I+ U5 F, P3 V- d; @3 r4 p; w9 \8 u* s6 j
6 L; G/ n9 {$ P, ~' B6 [
对于大容量的STM32F10x系列芯片,包含3各USART和2个UART。UART异步通信的引脚连接方法如下:
4 J- p  [& l& T$ R( H3 p9 u# s
0 K8 w& W, Q, ~0 Q) U  `0 w

& X" t: X4 I1 U- h- I ae83c1e6cdcc465c811713789ed680d4.png 5a3d411cdfc34816884a0632aa76d7a5.png / d% C, V  j/ Y8 o. l2 w; R
5 W9 f" H/ S$ R9 }$ I  L
# B- p, L0 M; n! M0 k, w

) n( d3 g( j, \& ] 这里需要注意的是:TX引脚要连接另一个控制器的RX引脚,反之RX亦然。
3 K+ P6 z7 s" G, h# T! U9 {
( b' e- y7 L, E' R, D( a' Z
% Z  c! v6 o) f  Q* R5 S
下图是STM32大容量芯片的5个串口对应的引脚号,可以通过中文参考手册查询8 p, l4 S4 F( s6 C0 r
4 ~2 Y* Q) V9 v/ T( `' G8 {

* P9 f" G; l9 s bd0eb7a3a0324fec9d37b41bf66549e3.png 9 c2 m3 b% j3 r
# x" P. }) A7 w0 x% C$ ?0 I- q
, h( R6 ^. o* }4 J3 Z9 s. F. j
查阅官方手册,UART异步通信方式的特点如下:. q; H( q5 s, a- q* j9 P
全双工异步通信。
' P8 W4 T$ Y# S% E. l3 O- g& C$ A$ V; {分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s
4 ]6 v$ f  h: d% O6 E4 m可编程的数据字长度(8位或者9位);+ }- _7 w/ j$ ?% t' P% b3 a
可配置的停止位(支持1或者2位停止位);2 D/ c1 O+ v, o& s  E: V
可配置的使用DMA多缓冲器通信。" a' ]# M% v( \$ X7 G" V
单独的发送器和接收器使能位。: i/ t5 M) Z) U* L* ?
检测标志:① 接受缓冲器  ②发送缓冲器空 ③传输结束标志
! j/ b+ Y5 [2 I7 J多个带标志的中断源。触发中断。( _- ]+ h4 B$ {8 y
其他:校验控制,四个错误检测标志。
* T9 G% H6 J1 w) W! S, a/ L1 w- b8 c4 \
+ b- d& j: |! o8 F. f
2. 串口通信框图  r( P: l; j$ ]2 b5 a$ F( q* L
学习STM32单片机的外设,最重要的是要理清楚它的框图,下图就是串口通信的框图:
1 \' q% l$ d8 P) i& K
& g" A6 r+ {. k, C) Y+ I6 c% X

( E- \: O' P5 H8 ?6 Y4 o6 M dd78b14eb86e4e77b2a014b9c6b4b78b.png
5 C& c2 A; F6 o" H; g, M& D# b) {+ g& @& t) R+ \! H% `

' n+ t3 N4 t" \4 r  {  y 从这个框图可以看出,STM32的串口通信是由最下面的波特率控制部分产生波特率,给来自PCLK1/2的时钟做预分频,再经过1/16分频后传给发送/接收其控制,最后分别发送给发送移位寄存器和接收移位寄存器。这两个寄存器分别在发送数据寄存器(TDR)和接收数据寄存器(RDR)的控制下完成和外部之间的数据发送和接收。
0 p0 g* c0 Y3 v2 R2 o  M; W3 I7 F- ]- r( Z# G& B8 D

0 i& }+ z0 r7 |* o) c, R2 P3. 串口通信相关寄存器
$ ^  D, |4 ]6 ~+ N+ ISTM32串口通信的相关寄存器共有3个,分别是:/ O- T5 i' H+ \( _3 @
USART_SR状态寄存器
+ _' X& c* ^" \USART_DR数据寄存器6 l# {" }- F. \7 H* C4 B
USART_BRR波特率寄存器0 K! c" O! A, x* C! h
% ]) r2 J7 k$ O: [% m! t
6 S, o2 S! C/ x4 d
下面是来自中文参考手册的部分截图介绍:
0 Y  I! v$ E* i! B
$ U5 j: `- I% c8 K& P- P% [( h

8 z' }& t/ j+ a4 S2 q7 U f0e2865656ae4eacbec160743e72eb10.png 7 `4 T& z; e/ }: K! O
1 a# z) X  {- Z/ e1 [( h& a

9 q2 c6 u0 S0 u0 D6 v$ | 013795b8c49844c5b88516740459945f.png
# d1 `0 ~* l! _; k" j/ I' ]7 o6 d5 d: V- ?7 l" L( n  i1 C

7 F% {  @3 l- G* h  B( U% x 2f215c8c96684ff1bfb8f1393e05792d.png & f& W3 v% V, J* N
. U$ }0 x. d" m. i) T) [

; p- `+ R# f+ D. k/ a0 c 5bfea7743ff1400982e0d60669cdf153.png
: d/ y% E: O4 h. _( V* x! ^1 I) r5 `( O" j) k+ Z7 ~" K

+ R  ~6 V: Q! S5 Z: x 86c8749d79e54a679d98a5a8bc376faa.png & U" n6 a: ?3 e  q- e' r- J! I

/ E& i8 F* s0 u( T2 ]- F! y( S- N
1 \: d6 }7 h0 i) `9 {, l
还有一个寄存器是控制寄存器,用来存放串口的控制和中断相关配置位,这里不做展开了。# z4 t( ^. |3 I# c% a& H

: Z; Z+ I9 @; n% s5 F
, Q4 t8 r% a- R; W, G
建议大家在学习基础外设(GPIO、定时器、外部中断、串口通信等)的时候不仅可以熟悉库函数的编写过程,寄存器编程也同样重要,不一定要掌握,理解即可。读者不要被寄存器编程吓住了,其实串口的寄存器相对于GPIO是很少的,配置过程也比较简单。# g: n3 m5 h+ K8 f6 h3 ~8 d: Z

/ I. M0 w8 h& o8 X

$ K* m- l; u7 C4. 波特率计算方法" K7 ?/ C2 E& D& n3 _* P
, n( U! J* E  u. v' y: w
, e! ]1 T" i  s. ?; [4 B
7e31640e4c1943e4902dfcd07fded844.png
4 v. P* l+ [/ t2 \  T$ F7 P7 {+ A  D( B/ f; L/ n$ X( f

% V. a) G+ O8 v; I! w* s# A ce096aec52a5437aab8de43298e90825.png
# C2 J4 |3 Y0 ^" I- F* x- k
; E" p5 u4 [! z2 I( U

* f8 `# C3 w" F9 | 这是官方文档的信息,波特率预分频器是分数预分频器,为什么小数部分要乘以16呢,大家可以理解位最后的小数是四位,四位二进制的1111正好就是16(15)。
) o- H/ n0 ^. a4 d; |6 k8 H7 g/ [
2 `# z- M4 X3 k) M# I% q! @0 `2 ?

" p1 m1 L  A6 {4 H三、库函数配置/ K6 q& P4 P. Y
1. 串口配置一般步骤  T  s% N% p- A
串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();$ r; Y* R$ b8 h
串口复位:USART_DeInit(); 这一步不是必须的4 H, F5 V5 F; L8 U9 e
GPIO端口模式设置:GPIO_Init(); 模式设置为推挽复用以及浮空输入或者上拉输入(具体可参照中文参考手册)/ k* u, G& w7 O, A6 n$ w. y8 K
串口参数初始化:USART_Init();
0 ^) g. ]4 E  P- \9 \2 z3 V开启中断并且初始化NVIC(如果需要开启中断才需要这个) NVIC_Init();USART_ITConfig();
- P! e% l2 N. h; D- {: L4 A5 v使能串口:USART_Cmd();
- s, I3 F, c9 D1 M3 {* J编写中断处理函数:USARTx_IRQHandler();
% G9 E& _0 z7 o4 j串口数据收发:void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据9 F# V5 f: J  P- c
串口传输状态获取:
7 V- a$ b; |4 \7 LFlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
/ X. B$ k2 ]+ ^0 g: @9 o* T! V& J. ?

, c: }; H8 W9 a6 p* p: Hvoid USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);* g- G8 j) u4 ^: |% t2 J: o# @3 j! q
————————————————8 s/ w8 c8 m0 I
版权声明:KevinFlyn
- f8 @" y! _; Q9 F7 |- c' f. K9 a) u" ~: y( F. \7 F
如有侵权请联系删除
3 }- _. t& m+ G0 w7 k
, v5 i) y1 l5 l$ ]+ C* Z
  Z& U6 V* u# n9 T
收藏 评论0 发布时间:2023-4-30 17:47

举报

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