设计与开发

单片机波特率9600 单片机学习:如何计算单片机串口通信的波特率

小编 2024-11-23 设计与开发 23 0

单片机学习:如何计算单片机串口通信的波特率

1. 什么是波特率

不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率:波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。下面以STM32单片机为例,讲解一下串口波特率的计算方法。

2. STM32波特率相关的寄存器

STM32单片机设置波特率的寄存器只有一个:USART_BRR寄存器,如下图所示。

该寄存器的有效位数为16位,前4位用于存放小数部分,后12位用于存放整数部分。将波特率算出来后,数值填入这个波特率就可以了。下面介绍如何计算。

3. 波特率计算方法

STM32的数据手册给出了计算方法,有一个公式,如下图所示:

在这个公式上,共有三个变量,其中两个我们是知道的,FckTx/Rx波特率 这两个是已知的,USARTDIV 是未知的。

通过该公式的描述可以看出如果使用USART1的话,那Fck就是PCLK2=72MHz,否则就是PCLK1=36MHz,Tx/Rx波特率 这个参数是已知的。只需要计算出USARTDIV的值赋值给USART_BRR寄存器就可以了。

以115200为例,将公式变形后得到:

USARTDIV = 72×1000000/(16×115200) = 39.0625。即,将39.0625写入USART_BRR即可。

前文说过,USART_BRR的前4位存放小数部分,后12位存放整数部分。

那小数部分DIV_Fraction = 0.0625×16 = 1 = 0x01;

那整数部分DIV_Mantissa = 39 = 0x27;

那USART_BRR = 0X271;

数据手册给我们提供了一张数据表:

在这张数据表上,已经算出了常用的波特率值,我们可以拿来直接用。但是如果我们想把波特率的计算做成一个传参函数的方式,

如:USART_INIT(uint_t 16 Baud),在调用时只需要写USART_INIT(9600),USART_INIT(115200),那程序该怎么写呢?

4. 程序的实现

下面介绍的是寄存器版的程序。

程序第一步45行:先计算得到USART_DIV,这个就是前面公式的变形;

程序第二步46行:获得USART_DIV的整数部分;

程序第三步47行:获得USART_DIV的小数部分;

程序第四步48行:将整数部分左移4位,即存入BRR寄存器的后12位;

程序第五步49行:将整数和小数部分合在一起,即前4位和后12位重新组合;

程序第六步50行:将计算出来的数值赋给BRR寄存器。

这样一个将波特率作为形参的函数就完成了。从以上来看的话,波特率的计算好像也不是很难啊。

本订阅号致力于单片机、ARM等嵌入式软硬件的设计经验分享,秉承“人人都是电子设计经验的分享者”的理念,成功路上不孤单,我们一起努力。

公众号:玩转嵌入式 。嵌入式学习网振兴网 :www.picmcu.com

Altium Designer 专题:

Altium Designer 有批量自动分组摆放元器件的方法,点击查看。

Altium Designer PCB设计技巧之|如何根据电路板尺寸确定背景形状,点击查看。

PCB设计技巧|布板时如何批量隐藏/显示元器件标号,点击查看。

单片机学习:如何将GPIO口设置为上拉、下拉输入,点击查看。

单片机串口通信的波特率如何计算?看了就明白,以STM32为例

1. 什么是波特率

不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率:波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。下面以STM32单片机为例,讲解一下串口波特率的计算方法。

2. STM32波特率相关的寄存器

STM32单片机设置波特率的寄存器只有一个:USART_BRR寄存器,如下图所示。

波特率寄存器

该寄存器的有效位数为16位,前4位用于存放小数部分,后12位用于存放整数部分。将波特率算出来后,数值填入这个波特率就可以了。下面介绍如何计算。

3. 波特率计算方法

STM32的数据手册给出了计算方法,有一个公式,如下图所示:

计算公式

在这个公式上,共有三个变量,其中两个我们是知道的,FckTx/Rx波特率 这两个是已知的,USARTDIV 是未知的。通过该公式的描述可以看出如果使用USART1的话,那Fck就是PCLK2=72MHz,否则就是PCLK1=36MHz,Tx/Rx波特率 这个参数是已知的。只需要计算出USARTDIV的值赋值给USART_BRR寄存器就可以了。以115200为例,将公式变形后得到:USARTDIV = 72×1000000/(16×115200) = 39.0625。即将39.0625写入USART_BRR即可。

前文说过,USART_BRR的前4位存放小数部分,后12位存放整数部分。

那小数部分DIV_Fraction = 0.0625×16 = 1 = 0x01;

那整数部分DIV_Mantissa = 39 = 0x27;

那USART_BRR = 0X271;

数据手册给我们提供了一张数据表:

表格

在这张数据表上,已经算出了常用的波特率值,我们可以拿来直接用。但是如果我们想把波特率的计算做成一个传参函数的方式,

如:USART_INIT(uint_t 16 Baud),在调用时只需要写USART_INIT(9600),USART_INIT(115200),那程序该怎么写呢?

4. 程序的实现

下面介绍的是寄存器版的程序。

代码部分

程序第一步2行:先计算得到USART_DIV,这个就是前面公式的变形;

程序第二步3行:获得USART_DIV的整数部分;

程序第三步4行:获得USART_DIV的小数部分;

程序第四步5行:将整数部分左移4位,即存入BRR寄存器的后12位;

程序第五步6行:将整数和小数部分合在一起,即前4位和后12位重新组合;

程序第六步7行:将计算出来的数值赋给BRR寄存器。

这样一个将波特率作为形参的函数就完成了。从以上来看的话,波特率的计算好像也不是很难啊。

欢迎关注头条号“玩转嵌入式”,获取更多电子设计知识!

相关问答

为什么要把 波特率 设为 9600 ,本人初学,请指教,谢谢?

先说波特率。波特率从300到115200都可以,甚至更高或更低。一般规范的波特率都是3的倍数,比如9600、19200、38400;但是并不是一定的,波特率也可以是10000或者1...

【微机原理问题采用串行异步通信时, 波特率 9600 bps,8位数据...

[最佳回答]楼主,第一,为什么是十位?8为数据位,一位停止位是题目条件已知的,还有题目说不含奇偶校验位,貌似应该是8+1=9位,但是有隐含条件:起始位(必须有的),如...

STC12c5204AD 单片机 22.1184晶振如何实现115200 波特率 串口通...

InitUART(void){TMOD=0x20;SCON=0x40;TH1=0xFF;TL1=TH1;PCON=0x80;EA=1;ES=1;TR1=...

STC12c5204AD 单片机 22.1184晶振如何实现115200 波特率 串口通...

这个是stc-isp软件生成的串口初始化函数:voidUartInit(void)//115200bps@22.1184MHz{PCON|=0x80;//使能波特率倍速位SMODSCON...

内部晶振,38400的 波特率 ,能不能稳定?

波特率从300到115200都可以,甚至更高或更低。一般规范的波特率都是3的倍数,比如9600、19200、38400;但是并不是一定的,波特率也可以是10000或...先说波特率...

程序中 波特率 9600 bit/s是怎么得到的? 波特率 的大小说明什么?

波特率为9600bit/s是通过对串口芯片8251或者8250进行方式控制字设置得到的;波特率的大小说明了串口传输数据的速度,他们之间成正比关系。波特率为9600bit/s...

串口通信实验中, 波特率9600 bps?

使用FPGA或者CPLD实现串口通信吗?如果用50Mhz晶振,因为串口是一拍一bit所以,波特率9600bps即传输速率是9600hz,那么多少个50Mhz(20ns)时钟周期是9600hz(1.....

为何参数默认为 9600 ?

意思是波特率9600bps,无校验位,8位数据,1个停止位。意思是波特率9600bps,无校验位,8位数据,1个停止位。

请问一下, 单片机 串口发送一帧数据时,两个字节的间隔时间是多少?

至少需要一个比特时间的10倍如波特率9600,每一位需1/9600毫秒一个字节至少是10位,所以理论上需1/960毫秒,即1.04毫秒另外,接收方要取数据也要花费数微秒...

波特率9600 每秒能传多少字节数据?

波特率是指串口传输的数据速率,9600波特率意味着每秒钟传输9600位的数据。但是,实际上,要计算9600波特率下每秒钟可以传输多少字节的数据,需要考虑以下因素:...

猜你喜欢