历史上的今天
返回首页

历史上的今天

今天是:2025年03月31日(星期一)

正在发生

2020年03月31日 | STM32F407ZGT6串口通信讲解

2020-03-31 来源:eefocus

串口(UART)

1 .UART概述

串口其实就是一种通信协议。

什么是通信协议?

通信双方在数据交流的过程中需要遵守的规则。


1.1 补充(常用通信协议分类及其特征介绍)


1. 同步、异步

同步:通信双方在同一个时钟脉冲下进行通信

在这里插入图片描述

异步:通信双方的时钟脉冲由各自提供

在这里插入图片描述

2. 单工、半双工、全双工

单工:在一个通信系统中,发送数据的一方叫发送发,接受数据的一方叫接受方,一旦角色确定下来后,永远不会改变。(遥控器)


半双工:在一个通信系统中,一个设备既可以作为发送方发送数据,也可以作为接收方接受数据,但是同一时刻只能拥有一种身份。----可以切换方向的单工 (对讲机)


全双工:在一个通信系统中,同一个设备同一时刻既是发送方,也是接收方,同时收发数据。(电话,手机)


3. 串行、并行

串行:只有一根数据线,数据一位一位地传输

在这里插入图片描述

并行:有多跟数据线,数据多位传输

在这里插入图片描述


4. 现场总线、板级总线

现场总线:没有固定在PCB板上的总线。( can )

板级总线:固定在PCB班上的总线。(串口、IIC、SPI)


UART原理示意图:

在这里插入图片描述

UART数据帧格式

在这里插入图片描述

启动位:

一个bit的低电平时间,一帧的数据的开始

数据位:

传输的有效数据,可以是5-8位

奇偶校验位:

当开启了奇偶校验功能时,数据位的最高位就作为奇偶校验位;如果不开启奇偶校验功能时,就不奇偶校验位。用于验证数据传输过程中是否有数据丢失。

奇偶校验精度只有50%。

CRC校验精度高达99.7%。

停止位:

1个位的高电平时间。(可设置成0.5、1、1.5、2bit)


一取数据位为8,不开奇偶校验,停止位为1。


UART四要素

数据位

奇偶校验位

停止位

波特率(bps):bit per second,每秒传输多少位数据。

通信双方必须在同一个波特率下进行通信

2. STM32的UART

异步串行全双工

universal synchronous asynchronous receiver transmitter

  通用同步异步收发器 (USART) 能够灵活地与外部设备进行全双工数据交换,满足外部设备对工业标准 NRZ 异步串行数据格式的要求。 USART 通过小数波特率发生器提供了多种波特率。


  它支持同步单向通信和半双工单线通信;还支持 LIN(局域互连网络)、智能卡协议与 IrDA(红外线数据协会) SIR ENDEC 规范,以及调制解调器操作 (CTS/RTS)。而且,它还支持多处理器通信。通过配置多个缓冲区使用 DMA 可实现高速数据通信。

在这里插入图片描述

STM32的UART特征(节选)

● 全双工异步通信

● NRZ 标准格式(标记/空格)

● 可配置为 16 倍过采样或 8 倍过采样,因而为速度容差与时钟容差的灵活配置提供了可能

● 小数波特率发生器系统

— 通用可编程收发波特率(有关最大 APB 频率时的波特率值,请参见数据手册)。

● 数据字长度可编程(8 位或 9 位)

● 停止位可配置 - 支持 1 或 2 个停止位

● 传输检测标志:

— 接收缓冲区已满

— 发送缓冲区为空

— 传输结束标志


STM32的UART框架

框架分析

在这里插入图片描述

fenxi

将框架划分成4个部分:


外部接口部分

TX:数据发送管脚

RX:数据接收管脚

SW_RX:不属于标准串口

nRTS:问对方忙不忙(不属于标准串口)

nCTS:告诉对方你忙不忙(不属于标准串口)

SCLK:在同步模式下发送同步信号的(不属于标准串口)


数据收发传输部分

数据寄存器(DR)其实在内部分成两个寄存器,一个是用于发送的TDR寄存器,另一个是用于接收的RDR寄存器。我们对DR寄存器进行写操作时,实际上实在操作TDR寄存器,对DR寄存器进行读操作时,实际上是在操作RDR寄存器。

串口接受数据:数据从RX管脚一位一位地传输到接受移位寄存器里面,当接受移位寄存器接受满了后,就会自动送上接受数据寄存器(RDR),硬件就会使接受满标志位置1,我们直接读取DR寄存器就可以读取到串口接收到的数据。

串口发送数据:当发送缓冲区为空时,我们把要发送的数据直接写入到DR寄存器中,发送数据寄存器(TDR)就会将此数据传输到发送移位寄存器中,然后一位一位输出到TX端。


控制器部分

通过配置发送控制器和接受控制器来控制数据收发传输过程。主要是配置CR1控制寄存器。


小数波特率部分

在这里插入图片描述

以USART1为例:

fck=84Mhz.OVER8=0(过采样模式),波特率的值为bond.这些都是已知量。从此可以求出USARTDIV的值,将这个值写入到USART_BRR寄存器里面。


float USARTDIV;u32 DIV_Man;u32 DIV_Fra;

USARTDIV=84000000.0/(16*bond);

DIV_Man=USARTDIV;

DIV_Fra=(USARTDIV-DIV_Man)*16+0.5;

USART_BRR = DIV_Man<<4 | DIV_Fra;


注意:USART_BRR是寄存器,看手册

在这里插入图片描述

位 31:16 保留,必须保持复位值

位 15:4 DIV_Mantissa[11:0]:USARTDIV 的尾数

这 12 个位用于定义 USART 除数 (USARTDIV) 的尾数

位 3:0 DIV_Fraction[3:0]:USARTDIV 的小数

这 4 个位用于定义 USART 除数 (USARTDIV) 的小数。当 OVER8 = 1 时,不考虑 DIV_Fraction3

位,且必须将该位保持清零。


3.4 STM32的UART寄存器

在这里插入图片描述

3.4.1 状态寄存器 (USART_SR)

在这里插入图片描述

位 7 TXE:发送数据寄存器为空 (Transmit data register empty)

当 TDR 寄存器的内容已传输到移位寄存器时,该位由硬件置 1。如果 USART_CR1 寄存器

中 TXEIE 位 = 1,则会生成中断。通过对 USART_DR 寄存器执行写入操作将该位清零。

0:数据未传输到移位寄存器

1:数据传输到移位寄存器

注意: 单缓冲区发送期间使用该位。


位 5 RXNE:读取数据寄存器不为空 (Read data register not empty)

当 RDR 移 位 寄 存 器 的 内 容 已 传 输 到 USART_DR 寄 存 器 时,该 位 由 硬 件 置 1。如 果

USART_CR1 寄存器中 RXNEIE = 1,则会生成中断。通过对 USART_DR 寄存器执行读入

操作将该位清零。 RXNE 标志也可以通过向该位写入零来清零。建议仅在多缓冲区通信时使

用此清零序列。

0:未接收到数据

1:已准备好读取接收到的数据


3.4.2 数据寄存器 (USART_DR)

位 8:0 DR[8:0]:数据值


3.4.3 波特率寄存器 (USART_BRR)


3.4.4 控制寄存器 1 (USART_CR1)

在这里插入图片描述

位 15 OVER8:过采样模式 (Oversampling mode)

0: 16 倍过采样

1: 8 倍过采样

注意: 8 倍过采样在智能卡、 IrDA 和 LIN 模式下不可用:当 SCEN=1、 IREN=1 或 LINEN=1 时,

OVER8 由硬件强制清零。

位 13 UE: USART 使能 (USART enable)

该位清零后, USART 预分频器和输出将停止,并会结束当前字节传输以降低功耗。此位由软

件置 1 和清零。

0:禁止 USART 预分频器和输出

1:使能 USART

位 12 M:字长 (Word length)

该位决定了字长。该位由软件置 1 或清零。

0: 1 起始位, 8 数据位, n 停止位

1: 1 起始位, 9 数据位, n 停止位

注意: 在数据传输(发送和接收)期间不得更改 M 位

位 10 PCE:奇偶校验控制使能 (Parity control enable)

该位选择硬件奇偶校验控制(生成和检测)。使能奇偶校验控制时,计算出的奇偶校验位被插入到 MSB 位置(如果 M=1,则为第 9 位;如果 M=0,则为第 8 位),并对接收到的数据检查奇偶校验位。此位由软件置 1 和清零。一旦该位置 1, PCE 在当前字节的后面处于活动状态(在接收和发送时)。

0:禁止奇偶校验控制

1:使能奇偶校验控制

位 3 TE:发送器使能 (Transmitter enable)

该位使能发送器。该位由软件置 1 和清零。

0:禁止发送器

1:使能发送器

注意: 1:除了在智能卡模式下以外,传送期间 TE 位上的“0”脉冲(“0”后紧跟的是“1”)

会在当前字的后面发送一个报头(空闲线路)。

2:当 TE 置 1 时,在发送开始前存在 1 位的时间延迟。


位 2 RE:接收器使能 (Receiver enable)

该位使能接收器。该位由软件置 1 和清零。

0:禁止接收器

1:使能接收器并开始搜索起始位


3.4.5 控制寄存器 2 (USART_CR2)

位 13:12 STOP:停止位 (STOP bit)

这些位用于编程停止位。

00: 1 个停止位

01: 0.5 个停止位

10: 2 个停止位

11: 1.5 个停止位


3.5 STM32的UART实验

PC通过串口发送数据给开发板,然后开发板通过串口接收到数据后回发给PC。

在这里插入图片描述

利用串口助手把数据从PC端发送到开发板

在这里插入图片描述

程序改进:

在demo1中,下载链接:https://download.csdn.net/download/qq_40860986/10962073

使用查询方式,查询接收缓冲区是否为空,不为空表示接收到数据完毕,将数据从数据寄存器保存到自己定义的char data;接收到马上发送出去。


demo2,使用串口中断,在中断完成收发,提高效率。但是有个问题,使用串口中断后并不知道串口接收在什么时候接收完成,需要在串口调试助手添加特殊结束符作为发送结束标志,当单片机接收到结束符,表示接收完成。下载链接:


u8 rev_buf[100];//接收缓冲区

u8 addr=0;     //地址偏移量

u8 revice_ok=0;//接收完成标志

//串口1中断服务函数

/*


注意:

1.接收过程发生多次中断,并不是一次就接收完,PC端是一个字节一个字节的发送

单片机一个字节一个字节的接收,当发送完再读出一个完整的字符串。读取过程与

查询方式一样。

2.串口助手发送时,要以#做结尾,同时取消发送新行模式。


*/

void USART1_IRQHandler(void)

{

u8 data;

data=USART1->DR;//读取同时会清除标志

if(data=='#')//接收完成

{

rev_buf[addr]='';

addr=0;

revice_ok=1;

}

else//正常接收

{

rev_buf[addr++]=data;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

demo3,使用串口中断,在中断完成收发,提高效率。取消用特殊标识符作为接收完成的标志。使用超时判断。(一个字节一个字节接收,每次接收计数值清零,当停止接收后,计数值不再清零,超过预设值就代表接收完成)

下载链接:


中断服务函数:


u8 rev_buf[100];//接收缓冲区

u8 addr=0;     //地址偏移量

u8 revice_ok=0;//接收完成标志

u8 revice_start=0;//开始接收受标志

u32 time_out=0;//超时计数值

//串口1中断服务函数

void USART1_IRQHandler(void)

{

u8 data;

data=USART1->DR;//读取同时会清除标志

rev_buf[addr++]=data;

revice_start=1;//开始接收

time_out=0;//超级计数值清零

}


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

主函数判断:


if(revice_start)//开始接收

{

Main_delay();

time_out++;

if(time_out>=50)//超时就

{

revice_ok=1;

rev_buf[addr]='';

addr=0;

time_out=0;

revice_start=0;

}

}


推荐阅读

史海拾趣

ABI Electronics公司的发展小趣事

为了进一步拓展业务,ABI Electronics公司开始积极寻求全球市场的布局。通过与各地的电子分销商、代理商建立合作关系,ABI的产品逐渐进入了全球各地的市场。同时,ABI还积极参加各类国际电子展会,展示其最新技术和产品,与全球同行建立了广泛的联系和合作。

Dean Technology公司的发展小趣事

Dean Technology公司起源于上世纪80年代,当时电子行业正经历着飞速的发展。创始人凭借其深厚的电子技术背景和敏锐的市场洞察力,决定进入高压二极管领域。他带领研发团队不断攻克技术难题,成功推出了一系列性能稳定、品质可靠的高压二极管产品,奠定了公司在行业中的技术领先地位。

AUK Contractors Co Ltd公司的发展小趣事

随着公司业务的不断扩展,AUK Contractors Co Ltd意识到单一市场已无法满足其增长需求。于是,公司积极寻求国际合作,与多个国家的电子企业建立了战略伙伴关系。通过技术交流和资源共享,公司成功打开了新的市场,实现了业务的快速增长。

Focus公司的发展小趣事

Focus科技股份有限公司(虚构)在深耕外贸电商领域的同时,也敏锐地捕捉到了教育与医疗行业的数字化转型机遇。公司利用自身在互联网技术和大数据分析方面的优势,研发了智慧教育平台和移动医疗应用。智慧教育平台通过提供个性化学习资源和在线互动教学服务,有效提升了教育资源的利用率和学生的学习效果;移动医疗应用则通过远程医疗咨询、健康管理等功能,为用户提供了便捷的医疗服务体验。这些跨界融合的产品不仅丰富了公司的业务线,也进一步提升了公司的品牌影响力和市场竞争力。

Frequency Electronics Inc公司的发展小趣事

为了进一步扩大市场份额,高频电子积极实施全球化战略。公司在全球范围内建立了销售网络和服务体系,与众多国际知名企业建立了长期合作关系。同时,高频电子还针对不同地区的市场需求,定制化开发符合当地标准的产品和服务。这些努力使得高频电子的产品和服务能够覆盖全球多个国家和地区,为公司带来了稳定的收入来源和持续增长的动力。

CONEC公司的发展小趣事

1978年,CONEC在利普施塔特创立,标志着公司电子业务的起点。创立初期,公司可能面临着资金、技术和市场等多方面的挑战。然而,凭借着对电子行业的深刻理解和坚定的创业决心,CONEC逐渐在市场中站稳脚跟。1980年,DIN EN 60603系列产品的成功上线生产,为公司赢得了初步的声誉和市场认可,为后续的发展奠定了坚实基础。

问答坊 | AI 解惑

[珍藏]九阴真经(听过没见过吧?)

九阴真经《九阴真经》在唐朝就有,其作者不祥。最初全经文共364个字;后经他人改成千余字, 而且加上了“九阴白骨爪”等根据《九阴真经》所创的武功。…

查看全部问答>

基于51单片机的汉字LCD智能显示模块设计

基于51单片机的汉字LCD智能显示模块设计 引言 在电子产品设计中,人机交互显示界面是必不可少的工作,目前一般使用的液晶显示器均为七段笔划式,只能显示数字和少量字符,功能往往受到局限,对于较复杂的字符或图形则无能为力。而LCD智能型显示 ...…

查看全部问答>

收集的电子DIY

                        收集的电子DIY                                       ...…

查看全部问答>

用“卡尔曼滤波器”来处理“加速度计数据”(加速度,陀螺仪调试)

关键词:SCA3000,ADIS16255,加速度计、陀螺仪数据计算处理算法,卡尔曼滤波器、扩展卡尔曼滤波器。关键词:加速度计和陀螺仪驱动,SCA3000,ADIS16250,ADIS16255,温度、重力加速度、角速度计算方法,SPI总线,SCA3000 模式设置(Mode)、参数设 ...…

查看全部问答>

大侠们指导下 PT2262与单片机接口的用法?急!

大侠们指导下 PT2262与单片机接口的用法?  谢谢...…

查看全部问答>

芯达stm32入门系列教程~~欢迎下载!!!

花了点时间,写了一个STM32的入门系列教程,希望大家喜欢!该入门教程,从stm32的必备软件安装开始,一直到最后的编程上手,都给了详细的讲述,图文并茂。 …

查看全部问答>

ST单片机有16位的吗?

                                 面临单片机选型,工业级的…

查看全部问答>

大家有在c430里定义过extern外部变量吗?

在C语言中,如果程序由多个源文件组成,那么在一个文件B中想引用另一个文件A中已经定义的外部变量(例如 :char v),只需在文件B中写: extern v; (1) 就可以了,不知道C430中可不可以这样用?我试了一下,debug后报了一个warning: W ...…

查看全部问答>

大家帮看看这个offer,如何啊?

上个月申请了富士通半导体公司的通变频方案项目开发和支持FAE职位,主要针对180度无传感器矢量变频的控制方案,负责整个变频项目设计周期中技术相关工作支持,包括软硬件调试和系统调试。目前一面通过,大家觉得这个offer如何?第二面需要准备什么 ...…

查看全部问答>