|
前言 众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和自定义编写串口通信函数。4 S+ P1 P5 a( _4 r E4 L% I0 q$ z; q- i" p 一、通信接口背景知识 1. 并行通信和串行通信 所谓通信,其实说白了就是处理器与外部设备之间的交流,就像电脑连接键盘、鼠标或打印机之类。计算机领域的通信一般有两种方式,即并行通信和串行通信。这两种方式的优缺点对比如下: 并行通信 -传输原理:数据各个位同时传输。8 ]! b/ h! Q& b& ?3 \ -优点:速度快) O0 A; t* e. S* v% _& ] -缺点:占用引脚资源多 5 r3 V# @/ U; F5 c/ u 串行通信3 s; `& B2 Y9 w; N$ { -传输原理:数据按位顺序传输。0 `0 T' t% `6 l w6 J -优点:占用引脚资源少 -缺点:速度相对较慢( V( p7 x0 X+ Q' w" S5 |* i- l5 g: V . d' L ?! z/ F3 j" B) B1 J 2. 串行通信的分类4 @! M1 T0 A" h0 u* h4 _ 由于本文所讲的串口通信属于串行通信,所以就不对并行通信做过多的讲解了,下面是串行通信的分类,按照数据的传送方向可以分为:' ?0 K" K3 C1 L- a& g7 q T) I 单工:数据传输只支持数据在一个方向上传输- r3 S$ b( ]/ R" z G* j9 p 半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信; 全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。 2 f }- m# s; p ( l, ?% f/ t( ~+ P% U7 P0 ? 为了清晰的表述这三种传输方向上的区别,我们看下图:# _) Z0 w2 O+ N" x" d% e& ^
! w6 P! Z3 Y) j% k. K+ g (a)单工通信 (b)半双工通信 (c)全双工通信 另一种分类方式是根据通信是否有时钟信号来划分的,分为同步通信和异步通信。 同步通信指的是带有时钟同步信号,比如:SPI通信、IIC通信; 异步通信指的是不带时钟同步信号比如:UART(通用异步收发器),单总线。1 ]% x0 o D/ h; T) y( ~ 我们以下面的表格来详细对比串行通信接口 5 M3 k4 c# c8 r4 p9 B% e/ H
" }& N# z2 \) Y$ Q1 M( P8 b 二、STM32的串口通信基础 1. 串口通信接口' P- g# ]: K$ m, n) i' ^9 k STM32共有两种串口通信接口,分别是:UART通用异步收发器,USART:通用同步异步收发器 ! h7 c3 `2 n7 ~& J) E7 b1 m6 d 对于大容量的STM32F10x系列芯片,包含3各USART和2个UART。UART异步通信的引脚连接方法如下: 2 B. G% ]9 X; ~8 a1 A0 v8 U
; 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亦然。 9 o$ G9 [ D, [. k. ]0 s5 \' F 下图是STM32大容量芯片的5个串口对应的引脚号,可以通过中文参考手册查询 9 m& U0 A5 E2 E& `: _
3 ?& i8 I' a4 M4 ]3 a& ] 查阅官方手册,UART异步通信方式的特点如下: 全双工异步通信。, N: J3 U' j: S 分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s g! p2 R6 K y 可编程的数据字长度(8位或者9位); 可配置的停止位(支持1或者2位停止位);$ D: d. f r+ v! A, B; V 可配置的使用DMA多缓冲器通信。 _$ G% c' x! c5 U% G% n7 @/ K 单独的发送器和接收器使能位。 检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志 多个带标志的中断源。触发中断。 其他:校验控制,四个错误检测标志。; q, U# N7 ]7 s4 r3 k) U7 q+ C9 g $ ?, Q7 u. |6 R0 h6 H; a 2. 串口通信框图 学习STM32单片机的外设,最重要的是要理清楚它的框图,下图就是串口通信的框图: 3 Y1 X6 X4 O0 f1 |9 D 4 w! V+ T- z6 ~
& g7 d3 P. C& r1 r) e 从这个框图可以看出,STM32的串口通信是由最下面的波特率控制部分产生波特率,给来自PCLK1/2的时钟做预分频,再经过1/16分频后传给发送/接收其控制,最后分别发送给发送移位寄存器和接收移位寄存器。这两个寄存器分别在发送数据寄存器(TDR)和接收数据寄存器(RDR)的控制下完成和外部之间的数据发送和接收。 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状态寄存器 USART_DR数据寄存器 USART_BRR波特率寄存器# n7 ]+ }' ?- v5 P 下面是来自中文参考手册的部分截图介绍:- E$ `) g; V0 b8 M. b% Y4 q8 J2 X % X$ C) J( N% X+ t8 e
* g5 P# X$ ?9 y9 i0 T8 @
; R3 M- k1 \) k& {8 w: H # R: e4 C& d5 g: t$ U, d# C
H9 K& c5 z0 P% ~ L% J, w 7 `- a* `) t1 g: ]0 D2 `' @
( u0 E# C& ?, `% a 还有一个寄存器是控制寄存器,用来存放串口的控制和中断相关配置位,这里不做展开了。 . k. `& {# |& G 建议大家在学习基础外设(GPIO、定时器、外部中断、串口通信等)的时候不仅可以熟悉库函数的编写过程,寄存器编程也同样重要,不一定要掌握,理解即可。读者不要被寄存器编程吓住了,其实串口的寄存器相对于GPIO是很少的,配置过程也比较简单。1 U; z$ _$ T4 u8 ~( f 8 q- k3 ^& s) h: ]- s0 d- _ 4. 波特率计算方法( n- A! F3 G$ \/ J" [' s# q
/ z4 N2 w2 _- m$ A
3 Z& L' R- k: k- ~ ( T' E! ]* U$ ]5 X 这是官方文档的信息,波特率预分频器是分数预分频器,为什么小数部分要乘以16呢,大家可以理解位最后的小数是四位,四位二进制的1111正好就是16(15)。1 s. _4 q F' O# y. @ 7 y: J% i- I" r' g0 |" x- B 三、库函数配置 1. 串口配置一般步骤; 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(); 模式设置为推挽复用以及浮空输入或者上拉输入(具体可参照中文参考手册) 串口参数初始化:USART_Init();- L. m5 B9 @* E+ s, L; o& K 开启中断并且初始化NVIC(如果需要开启中断才需要这个) NVIC_Init();USART_ITConfig(); 使能串口:USART_Cmd(); 编写中断处理函数:USARTx_IRQHandler();( G _4 }% @# g0 | 串口数据收发:void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据8 E# _& A0 A4 H1 k 串口传输状态获取: FlagStatus 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); ———————————————— W7 {1 _9 w( ]5 k6 G 版权声明:KevinFlyn, N; u. {% J1 i9 [/ L/ @# T* o+ y 如有侵权请联系删除 - \3 w2 a! _; J |
STM32L562DK探索板——串口通讯的再测试
经验分享 | STM32 IAP应用时的跳转注意事项
实战经验 | 碰到hardfault问题你还在死磕代码吗?
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
【STM32U3 评测】CAN报文接收及过滤
STM32 硬核调试技巧:用 DWT 硬件监控内存读写与函数调用
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
微信公众号
手机版