|
前言 众所周知,串口通信是MCU最基本的通信方式,对于STM32来说也是如此。本文重点讲述STM32单片机的串口通信,主要包括的内容是:通信基础知识、串口通信原理、USART有关寄存器和自定义编写串口通信函数。 # C% j$ O* ? { 一、通信接口背景知识 1. 并行通信和串行通信3 c6 E6 \8 ~; y# ~: H6 l* f 所谓通信,其实说白了就是处理器与外部设备之间的交流,就像电脑连接键盘、鼠标或打印机之类。计算机领域的通信一般有两种方式,即并行通信和串行通信。这两种方式的优缺点对比如下: & z& g/ k9 Q/ _( K5 S$ x; ~7 R 并行通信* v7 v T- P4 E9 J" H5 P# E- M' b -传输原理:数据各个位同时传输。. s% n) S* P" j -优点:速度快. M* T% i, m% e+ q5 K& u$ p -缺点:占用引脚资源多 r6 n9 A0 Z: t 7 C( I j h1 G: a1 U: e# H * {0 A8 j) O' w: k5 j' K- z! ?' r 串行通信 -传输原理:数据按位顺序传输。 -优点:占用引脚资源少5 z" n4 ?" ~6 m+ {* o- \9 t -缺点:速度相对较慢 9 y% i0 G. H! h7 f/ @; @* G" X/ F/ U 2. 串行通信的分类! r' ?$ p$ `# X8 b r4 Z% [( a/ n 由于本文所讲的串口通信属于串行通信,所以就不对并行通信做过多的讲解了,下面是串行通信的分类,按照数据的传送方向可以分为:8 C' y0 S/ f$ u* D, ? ) ~7 q2 l: w$ ` Q) u9 u3 P9 @; ] 单工:数据传输只支持数据在一个方向上传输$ \/ y2 S; m+ I0 l5 j 半双工:允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;; w4 R' j5 h0 C9 m5 f( B 全双工:允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。$ }! f8 K0 [: ~7 F) o8 f 0 I& C; {3 F2 @9 U9 N 为了清晰的表述这三种传输方向上的区别,我们看下图:
9 J2 f8 r3 p3 {; D (a)单工通信 (b)半双工通信 (c)全双工通信4 A* d0 w$ H4 s) q1 _) A8 l 另一种分类方式是根据通信是否有时钟信号来划分的,分为同步通信和异步通信。 同步通信指的是带有时钟同步信号,比如:SPI通信、IIC通信;$ E2 Y5 s! ?3 o! [0 m! `5 t 异步通信指的是不带时钟同步信号比如:UART(通用异步收发器),单总线。 我们以下面的表格来详细对比串行通信接口 $ b" O& z2 ]. l' Z! ]& c
二、STM32的串口通信基础& a. ?7 }% b4 o0 ? 1. 串口通信接口 STM32共有两种串口通信接口,分别是:UART通用异步收发器,USART:通用同步异步收发器( t4 U7 h0 J7 S" a" E 5 `$ j8 ~+ y, O& j6 f7 b8 n * a$ A3 I( N5 _5 ` 对于大容量的STM32F10x系列芯片,包含3各USART和2个UART。UART异步通信的引脚连接方法如下:: D; t. o" Q2 b( }$ ` }" U1 n4 m" j
4 K8 \! X# T( {! A# M* ~& \4 ? 这里需要注意的是:TX引脚要连接另一个控制器的RX引脚,反之RX亦然。4 C' r+ J7 Y% K8 N; N8 } 下图是STM32大容量芯片的5个串口对应的引脚号,可以通过中文参考手册查询0 F: e$ }/ U4 Q/ n1 a) b* \* Q
查阅官方手册,UART异步通信方式的特点如下: 全双工异步通信。 分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s 可编程的数据字长度(8位或者9位); 可配置的停止位(支持1或者2位停止位);, x# ^! w# `9 M 可配置的使用DMA多缓冲器通信。 单独的发送器和接收器使能位。9 H* w9 c6 z# j+ P 检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志# W+ H3 C! d( A 多个带标志的中断源。触发中断。 其他:校验控制,四个错误检测标志。 2. 串口通信框图4 G) V) l0 K X' W 学习STM32单片机的外设,最重要的是要理清楚它的框图,下图就是串口通信的框图:0 _2 w& @1 S- d. ~2 s, [
( I5 Y+ Q* z; ]( m 从这个框图可以看出,STM32的串口通信是由最下面的波特率控制部分产生波特率,给来自PCLK1/2的时钟做预分频,再经过1/16分频后传给发送/接收其控制,最后分别发送给发送移位寄存器和接收移位寄存器。这两个寄存器分别在发送数据寄存器(TDR)和接收数据寄存器(RDR)的控制下完成和外部之间的数据发送和接收。8 _1 r8 I- ?4 x h) D 3. 串口通信相关寄存器+ g* S1 n2 s$ J, r8 ~* Q7 O STM32串口通信的相关寄存器共有3个,分别是: USART_SR状态寄存器 USART_DR数据寄存器7 ~! S/ R* g- f( [* {" I6 k USART_BRR波特率寄存器, i+ d7 C& {& H0 e( V+ D. O 下面是来自中文参考手册的部分截图介绍:: ]% J5 q) \0 y& Y& \4 ]1 } - R, U% O) V n5 n
1 q* i7 Z1 Z7 V! q+ _
z) G! n! I k/ r' Z x( T! D* y. F8 y
8 z N: [' G* S; a! _ 还有一个寄存器是控制寄存器,用来存放串口的控制和中断相关配置位,这里不做展开了。$ E ?0 M9 c) U) o* u6 o * H: S% [4 ~, m2 Q* Y- c+ } 建议大家在学习基础外设(GPIO、定时器、外部中断、串口通信等)的时候不仅可以熟悉库函数的编写过程,寄存器编程也同样重要,不一定要掌握,理解即可。读者不要被寄存器编程吓住了,其实串口的寄存器相对于GPIO是很少的,配置过程也比较简单。 : N9 |" @( U# _" D: @0 J7 P9 c 4. 波特率计算方法3 X7 F$ ^1 x6 a C6 g* d
2 ~7 m* ^( `# [( e: S
/ ^4 r8 ^+ }1 k9 b5 ^ 这是官方文档的信息,波特率预分频器是分数预分频器,为什么小数部分要乘以16呢,大家可以理解位最后的小数是四位,四位二进制的1111正好就是16(15)。 三、库函数配置7 G* a1 A8 x' B0 p4 ~; b5 @ 1. 串口配置一般步骤, t' |9 t# s. r1 F 串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd(); 串口复位:USART_DeInit(); 这一步不是必须的 GPIO端口模式设置:GPIO_Init(); 模式设置为推挽复用以及浮空输入或者上拉输入(具体可参照中文参考手册) 串口参数初始化:USART_Init(); 开启中断并且初始化NVIC(如果需要开启中断才需要这个) NVIC_Init();USART_ITConfig(); 使能串口:USART_Cmd(); 编写中断处理函数:USARTx_IRQHandler(); 串口数据收发:void USART_SendData();//发送数据到串口,DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据7 _+ J" M7 N l; B6 p 串口传输状态获取: FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG); void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT); ———————————————— 版权声明:KevinFlyn ; K* D% O7 Y A" a( B- V) q+ R 如有侵权请联系删除 : _! }- R/ x M5 I' }& \ |
STM32C542RC开发板的串口不定长数据接收实验
STM32C542RC开发板的串口DMA发送及接收实验
终于完成了STM32C542RC开发板的串口发送实验
STM32L562DK探索板——串口通讯的再测试
经验分享 | STM32 IAP应用时的跳转注意事项
实战经验 | 碰到hardfault问题你还在死磕代码吗?
【逢7发帖赢大礼】STM32开发之WIFI实时时钟
【逢7发帖赢大礼】STM32开发之指纹识别!
【逢7发帖赢大礼】STM32开发之环境空气质量监测
【逢7发帖赢大礼】STM32开发之人体实时运动信息监测!
微信公众号
手机版