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

基于STM32串口通信经验分享

[复制链接]
攻城狮Melo 发布时间:2023-4-30 17:47
前言
( W  L' f$ H9 X6 P5 Y1 m众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和自定义编写串口通信函数。4 S+ P1 P5 a( _4 r

' h; V+ P$ U7 ~
  E4 L% I0 q$ z; q- i" p
一、通信接口背景知识
1 E" d# c8 T* O9 w1 M7 k* |2 B; f1. 并行通信和串行通信
6 S' y- r+ f2 g4 A. V+ J& I所谓通信,其实说白了就是处理器与外部设备之间的交流,就像电脑连接键盘、鼠标或打印机之类。计算机领域的通信一般有两种方式,即并行通信和串行通信。这两种方式的优缺点对比如下:
' n0 J% c! B. G. |
, ^+ C1 d1 Z/ O4 {) m: x3 i* t

& Y$ p) Q8 E+ @- `2 ^3 g并行通信
4 Q( d3 f* c8 V5 b. H& o$ Y   -传输原理:数据各个位同时传输。8 ]! b/ h! Q& b& ?3 \
   -优点:速度快) O0 A; t* e. S* v% _& ]
   -缺点:占用引脚资源多
8 w% t& _% a- A  J% u, @3 L' j5 r3 V# @/ U; F5 c/ u

( }$ |! x* o8 t8 w" [! C: O( P串行通信3 s; `& B2 Y9 w; N$ {
   -传输原理:数据按位顺序传输。0 `0 T' t% `6 l  w6 J
   -优点:占用引脚资源少
% s% a) M9 M, T; S' O! K, c   -缺点:速度相对较慢( V( p7 x0 X+ Q' w" S5 |* i- l5 g: V
. d' L  ?! z/ F3 j" B) B1 J

% I- L0 e$ C1 U5 @/ E: V8 n& G5 }% N2. 串行通信的分类4 @! M1 T0 A" h0 u* h4 _
由于本文所讲的串口通信属于串行通信,所以就不对并行通信做过多的讲解了,下面是串行通信的分类,按照数据的传送方向可以分为:' ?0 K" K3 C1 L- a& g7 q  T) I

( L& Z% U& C! W8 Z

. C5 T2 X2 C+ ^/ ~5 l7 P单工:数据传输只支持数据在一个方向上传输- r3 S$ b( ]/ R" z  G* j9 p
半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;
; Z9 M( S7 u& [全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
" ~; u; ?7 J* H7 M9 W2 f  }- m# s; p
( l, ?% f/ t( ~+ P% U7 P0 ?
为了清晰的表述这三种传输方向上的区别,我们看下图:# _) Z0 w2 O+ N" x" d% e& ^

3 p5 Q: V3 b: J" c5 y; S, K+ \ ac264b36384549b9ba1fef9ce2eecce0.png   {- |4 o7 W* V* k

3 x; d% Y) F) C
! w6 P! Z3 Y) j% k. K+ g
(a)单工通信        (b)半双工通信        (c)全双工通信
/ u' _; K6 l1 i; d% E另一种分类方式是根据通信是否有时钟信号来划分的,分为同步通信和异步通信。
0 v1 t7 l+ V* E同步通信指的是带有时钟同步信号,比如:SPI通信、IIC通信;
( U% }* u+ [, C9 [" J异步通信指的是不带时钟同步信号比如:UART(通用异步收发器),单总线。1 ]% x0 o  D/ h; T) y( ~
我们以下面的表格来详细对比串行通信接口
$ f* c* u  z5 }) h4 K
& X$ E8 q: b: ~! s. S/ `+ {2 z
5 M3 k4 c# c8 r4 p9 B% e/ H
dbac60db4f8d44cd9aebe6ff7c41dd9e.png / f" M$ D, j, b. P* C; s$ f5 M
" }& N# z2 \) Y$ Q1 M( P8 b
二、STM32的串口通信基础
7 ^+ n8 H5 r3 |% v1. 串口通信接口' P- g# ]: K$ m, n) i' ^9 k
STM32共有两种串口通信接口,分别是:UART通用异步收发器,USART:通用同步异步收发器
* _1 z) ]5 |. j1 G
7 b6 a4 v4 m" c2 p# R
! h7 c3 `2 n7 ~& J) E7 b1 m6 d
对于大容量的STM32F10x系列芯片,包含3各USART和2个UART。UART异步通信的引脚连接方法如下:
6 H' s3 u+ p3 w& E6 w' z2 B. G% ]9 X; ~8 a1 A0 v8 U

' x+ H6 J- o1 W9 L( n, \; [ ae83c1e6cdcc465c811713789ed680d4.png 5a3d411cdfc34816884a0632aa76d7a5.png
: p4 I# k3 \( z/ y; g' y$ k6 T) R( m. h: \# P
5 {2 R3 y+ L% O3 V; w
7 c$ _5 n* v6 h- P0 _  f- x, @( R! S
这里需要注意的是:TX引脚要连接另一个控制器的RX引脚,反之RX亦然。
6 P3 S; d, r( t1 {% f, Y: q" U
& q; v, ^9 M2 o+ C1 ]9 {! `
9 o$ G9 [  D, [. k. ]0 s5 \' F
下图是STM32大容量芯片的5个串口对应的引脚号,可以通过中文参考手册查询
5 Y- z5 J0 b3 N. C6 \: P9 m& U0 A5 E2 E& `: _

9 H& p$ K7 W3 [, y1 C bd0eb7a3a0324fec9d37b41bf66549e3.png
  n1 f2 u; d- [0 r$ m* s
& |, i4 D' z3 ?" F6 e% d
3 ?& i8 I' a4 M4 ]3 a& ]
查阅官方手册,UART异步通信方式的特点如下:
! s  F/ m9 M. z# _" O0 @, k- Y全双工异步通信。, N: J3 U' j: S
分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s  g! p2 R6 K  y
可编程的数据字长度(8位或者9位);
$ Z% l. [" M: W5 H3 l+ P& L可配置的停止位(支持1或者2位停止位);$ D: d. f  r+ v! A, B; V
可配置的使用DMA多缓冲器通信。  _$ G% c' x! c5 U% G% n7 @/ K
单独的发送器和接收器使能位。
  G! v+ T( t) K; f. e3 B" \检测标志:① 接受缓冲器  ②发送缓冲器空 ③传输结束标志
4 B4 m2 V( _. K3 k. ?4 C多个带标志的中断源。触发中断。
- `& f1 X: C- {  F% W其他:校验控制,四个错误检测标志。; q, U# N7 ]7 s4 r3 k) U7 q+ C9 g
$ ?, Q7 u. |6 R0 h6 H; a

- @4 B# Z. l6 n. Q2 V2. 串口通信框图
8 Y$ c8 j) ]) s学习STM32单片机的外设,最重要的是要理清楚它的框图,下图就是串口通信的框图:
# t4 l4 {' C; Q) j# o! f" Q3 Y1 X6 X4 O0 f1 |9 D
4 w! V+ T- z6 ~
dd78b14eb86e4e77b2a014b9c6b4b78b.png
' Q( w4 |; z1 c0 n& g7 d3 P. C& r1 r) e

1 n) F, r" C" t& @ 从这个框图可以看出,STM32的串口通信是由最下面的波特率控制部分产生波特率,给来自PCLK1/2的时钟做预分频,再经过1/16分频后传给发送/接收其控制,最后分别发送给发送移位寄存器和接收移位寄存器。这两个寄存器分别在发送数据寄存器(TDR)和接收数据寄存器(RDR)的控制下完成和外部之间的数据发送和接收。
  ^( ^9 h9 u9 X& ~% ^
$ k# o/ Q4 e# [5 b
6 b0 n* x$ Z+ f) r; ^' S0 F
3. 串口通信相关寄存器( M/ w/ |8 z! b; `
STM32串口通信的相关寄存器共有3个,分别是:( c$ X( N4 b5 `( y% G+ W7 a4 b
USART_SR状态寄存器
, u; s: T$ }/ {4 ~2 g" k" ?USART_DR数据寄存器
/ ^. R0 n  f4 X* g5 SUSART_BRR波特率寄存器# n7 ]+ }' ?- v5 P

9 L% M3 ~0 `% x

9 r- q* K2 n9 _0 m  T7 U下面是来自中文参考手册的部分截图介绍:- E$ `) g; V0 b8 M. b% Y4 q8 J2 X

' b7 `* d# U* [) j/ m8 C  P7 m
% X$ C) J( N% X+ t8 e
f0e2865656ae4eacbec160743e72eb10.png & X' ]7 V% b$ ~2 i6 S
* g5 P# X$ ?9 y9 i0 T8 @

3 Z" [3 S, r, Y5 R2 o& e 013795b8c49844c5b88516740459945f.png 3 a# I+ F3 \  r( K
; R3 M- k1 \) k& {8 w: H
# R: e4 C& d5 g: t$ U, d# C
2f215c8c96684ff1bfb8f1393e05792d.png
' T+ S9 y' |& U) D7 |, Y  H9 K& c5 z0 P% ~  L% J, w
7 `- a* `) t1 g: ]0 D2 `' @
5bfea7743ff1400982e0d60669cdf153.png
3 J1 p: f! {' z* O' A
7 V7 S5 S/ L2 l( Z* \/ T" P

  R7 ]  y) Q+ o 86c8749d79e54a679d98a5a8bc376faa.png / e5 H+ W8 Q% I, }& `) R
( u0 E# C& ?, `% a

2 o9 C+ q. }+ C0 S6 K( j还有一个寄存器是控制寄存器,用来存放串口的控制和中断相关配置位,这里不做展开了。
1 L" E( ~8 t- U) Z2 t" t6 f7 F
9 S+ j& @2 Z+ c$ g# Z+ c# w
. k. `& {# |& G
建议大家在学习基础外设(GPIO、定时器、外部中断、串口通信等)的时候不仅可以熟悉库函数的编写过程,寄存器编程也同样重要,不一定要掌握,理解即可。读者不要被寄存器编程吓住了,其实串口的寄存器相对于GPIO是很少的,配置过程也比较简单。1 U; z$ _$ T4 u8 ~( f

3 q( `8 B% x) c1 x) |, R
8 q- k3 ^& s) h: ]- s0 d- _
4. 波特率计算方法( n- A! F3 G$ \/ J" [' s# q

: i* N+ h$ v* p- i$ f* U  a0 `

$ Q& s' {" W' W! _ 7e31640e4c1943e4902dfcd07fded844.png
# j& ?" ~: T$ H
% g! F& V5 W9 {9 @
/ z4 N2 w2 _- m$ A
ce096aec52a5437aab8de43298e90825.png
; u3 j: L% J, t4 [" }  F3 Z& L' R- k: k- ~
( T' E! ]* U$ ]5 X
这是官方文档的信息,波特率预分频器是分数预分频器,为什么小数部分要乘以16呢,大家可以理解位最后的小数是四位,四位二进制的1111正好就是16(15)。1 s. _4 q  F' O# y. @

2 @6 _# G4 w' g1 O7 [( g9 ~" ]
7 y: J% i- I" r' g0 |" x- B
三、库函数配置
- m* c0 V/ D0 H- N1. 串口配置一般步骤; C/ J( F, _% i7 D( s7 j
串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();  x0 N& Z6 e) g0 v. T$ ]
串口复位:USART_DeInit(); 这一步不是必须的, G7 R2 t  {! d' `" P9 [- t( Q
GPIO端口模式设置:GPIO_Init(); 模式设置为推挽复用以及浮空输入或者上拉输入(具体可参照中文参考手册)
& ^3 v/ z- W! d0 _) W串口参数初始化:USART_Init();- L. m5 B9 @* E+ s, L; o& K
开启中断并且初始化NVIC(如果需要开启中断才需要这个) NVIC_Init();USART_ITConfig();
* K+ e# e4 @$ ~$ q. ~" i使能串口:USART_Cmd();
3 E& Z& u) }2 ]4 Z; t( ^编写中断处理函数:USARTx_IRQHandler();( G  _4 }% @# g0 |
串口数据收发:void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据8 E# _& A0 A4 H1 k
串口传输状态获取:
9 k2 c" i4 }, I0 m" AFlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);, e9 e) ^  K+ N: j
/ B) B4 @- S' J2 c/ ?3 O- U( o
+ i" e" K# j: s+ T9 J1 W9 _
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
4 z$ J$ b) Y! t: r( ]# S: r————————————————  W7 {1 _9 w( ]5 k6 G
版权声明:KevinFlyn, N; u. {% J1 i9 [/ L/ @# T* o+ y

; S! {* d% v1 ?, p7 ~如有侵权请联系删除
; O: P, o, {: l) _! S: U- \3 w2 a! _; J

. K2 r0 H; _4 A& [- m: L& M. i
收藏 评论0 发布时间:2023-4-30 17:47

举报

0个回答

所属标签

相似技术帖

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