|
前言! b) Q" k) v. A. V3 | 众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和自定义编写串口通信函数。 ) A* z+ J5 y7 M. W 一、通信接口背景知识 1. 并行通信和串行通信 所谓通信,其实说白了就是处理器与外部设备之间的交流,就像电脑连接键盘、鼠标或打印机之类。计算机领域的通信一般有两种方式,即并行通信和串行通信。这两种方式的优缺点对比如下:' x1 p) U. e4 J2 o" x+ S0 q 并行通信 -传输原理:数据各个位同时传输。 -优点:速度快 -缺点:占用引脚资源多 ( ]' |0 c0 y- |2 O6 y4 l' U 串行通信- ]6 a3 z6 d) y! C) h -传输原理:数据按位顺序传输。 -优点:占用引脚资源少# `+ i8 r( V7 F6 E6 E5 R, F -缺点:速度相对较慢 % y/ q* E& v( i3 F! Y: `6 H. ` 2 m2 M) @" M, Z; q: i 2. 串行通信的分类 由于本文所讲的串口通信属于串行通信,所以就不对并行通信做过多的讲解了,下面是串行通信的分类,按照数据的传送方向可以分为:& 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 为了清晰的表述这三种传输方向上的区别,我们看下图:
(a)单工通信 (b)半双工通信 (c)全双工通信; h; R$ ]; |# X& w U1 q% F 另一种分类方式是根据通信是否有时钟信号来划分的,分为同步通信和异步通信。 同步通信指的是带有时钟同步信号,比如:SPI通信、IIC通信; 异步通信指的是不带时钟同步信号比如:UART(通用异步收发器),单总线。/ ^- ?( Z* ?2 U/ I9 V4 P% a) M( n 我们以下面的表格来详细对比串行通信接口 " z, K+ W% j W9 S2 \# v # P, r4 E7 D! y6 ~, Z* P9 m
二、STM32的串口通信基础 1. 串口通信接口 STM32共有两种串口通信接口,分别是:UART通用异步收发器,USART:通用同步异步收发器/ H; R& i+ P3 Z R1 V3 y- J8 r ' h% o1 U3 z* d, Y) |2 H 对于大容量的STM32F10x系列芯片,包含3各USART和2个UART。UART异步通信的引脚连接方法如下: " Q: j* t. y2 ~+ S3 y % i2 V# y6 p8 |4 V% N
. C. r0 ^9 _; Z( d . 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 ] 下图是STM32大容量芯片的5个串口对应的引脚号,可以通过中文参考手册查询& f% P; J/ a0 S h
. F' J/ Z4 U. J* e3 Q1 e 查阅官方手册,UART异步通信方式的特点如下: 全双工异步通信。 分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s 可编程的数据字长度(8位或者9位); 可配置的停止位(支持1或者2位停止位); 可配置的使用DMA多缓冲器通信。 单独的发送器和接收器使能位。 检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志 多个带标志的中断源。触发中断。 其他:校验控制,四个错误检测标志。$ n0 H8 L' G8 Q9 @4 d$ y! _1 e * g8 A% j! M+ {; K 2. 串口通信框图! S. H# }- h. D- c" H& k 学习STM32单片机的外设,最重要的是要理清楚它的框图,下图就是串口通信的框图: ; E- X6 q) d0 ~8 i
' u1 w/ f- r9 \3 b4 f# S0 X 从这个框图可以看出,STM32的串口通信是由最下面的波特率控制部分产生波特率,给来自PCLK1/2的时钟做预分频,再经过1/16分频后传给发送/接收其控制,最后分别发送给发送移位寄存器和接收移位寄存器。这两个寄存器分别在发送数据寄存器(TDR)和接收数据寄存器(RDR)的控制下完成和外部之间的数据发送和接收。 " O$ l0 g3 K* i& ]: ~ C+ d 3. 串口通信相关寄存器& F7 h% o- k T- [& k STM32串口通信的相关寄存器共有3个,分别是: USART_SR状态寄存器 USART_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 下面是来自中文参考手册的部分截图介绍: : U( a0 [8 c+ Q+ \
* h# @& F' M5 s3 U8 k% \ h6 l 0 M3 I( P' S' M1 f8 c
! K0 Z8 {) G% [' e 0 q- ]: G' R4 d" i6 I2 K! g
7 g) r# U, S' |: J4 ]# e+ p 还有一个寄存器是控制寄存器,用来存放串口的控制和中断相关配置位,这里不做展开了。 / `! J$ p) D* R! n 建议大家在学习基础外设(GPIO、定时器、外部中断、串口通信等)的时候不仅可以熟悉库函数的编写过程,寄存器编程也同样重要,不一定要掌握,理解即可。读者不要被寄存器编程吓住了,其实串口的寄存器相对于GPIO是很少的,配置过程也比较简单。5 j7 G7 S5 \% O6 L 4. 波特率计算方法8 H' Y' J8 y9 x6 U6 n 0 G* U+ C9 X- k0 Y6 F9 U
/ S& r5 u- e5 b$ q& d
这是官方文档的信息,波特率预分频器是分数预分频器,为什么小数部分要乘以16呢,大家可以理解位最后的小数是四位,四位二进制的1111正好就是16(15)。 三、库函数配置 1. 串口配置一般步骤 串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd(); 串口复位: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(); 使能串口:USART_Cmd(); 编写中断处理函数:USARTx_IRQHandler(); 串口数据收发:void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据 串口传输状态获取:& U4 N& z/ ?4 P FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);/ W! L ?. K8 I- n # X) m/ }: h, }; r void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);' }, b- z9 b3 f8 u& N1 H ———————————————— 版权声明:KevinFlyn0 {) Z2 C: t/ T 如有侵权请联系删除. d2 U2 m5 ^& M# {/ O8 q' ^ |
STM32L562DK探索板——串口通讯的再测试
经验分享 | STM32 IAP应用时的跳转注意事项
实战经验 | 碰到hardfault问题你还在死磕代码吗?
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
【STM32U3 评测】CAN报文接收及过滤
STM32 硬核调试技巧:用 DWT 硬件监控内存读写与函数调用
OpenBLT移植到STM32F103战舰开发板上适用于所有STM32F103系列的Bootloader
微信公众号
手机版