单片机学习:如何计算单片机串口通信的波特率
1. 什么是波特率
不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率:波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。下面以STM32单片机为例,讲解一下串口波特率的计算方法。
2. STM32波特率相关的寄存器
STM32单片机设置波特率的寄存器只有一个:USART_BRR寄存器,如下图所示。
该寄存器的有效位数为16位,前4位用于存放小数部分,后12位用于存放整数部分。将波特率算出来后,数值填入这个波特率就可以了。下面介绍如何计算。
3. 波特率计算方法
STM32的数据手册给出了计算方法,有一个公式,如下图所示:
在这个公式上,共有三个变量,其中两个我们是知道的,Fck 和Tx/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的数据手册给出了计算方法,有一个公式,如下图所示:
计算公式
在这个公式上,共有三个变量,其中两个我们是知道的,Fck 和Tx/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寄存器。
这样一个将波特率作为形参的函数就完成了。从以上来看的话,波特率的计算好像也不是很难啊。
欢迎关注头条号“玩转嵌入式”,获取更多电子设计知识!
相关问答
51 单片机波特率 如何 设置 ?51单片机波特率设置主要有以下两种方式:1)工作方式0,2)工作方式1。1)工作方式0SM0=0且SM1=0时,串口选择工作方式0,实质这是一种同步移位寄存器模式...5...
怎么 设置 计算机的串口 波特率 ?-ZOL问答每次使用串口之前,都需要设置波特率通常是在软件中设定在打开这个串口,然后通信VB中用mscomm控件VC中可以用mscomm控件,也可以用API需要帮你写程...
55.何谓 波特率 ?如何计算和 设置 51 单片机 串行通信的 波特率 ?56....[最佳回答]200还差不多
单片机 的 波特率 ?600。波特率就是用来定义串口通讯时候每秒传送的数据量,用bps表示,像我们定义的波特率为600,即每秒发送600个二进制位,而我们每个字符占用十个二进制位,所...
单片机单片机单片机 串行口工作在方式1和方式3时,其 波特率 与...[最佳回答]TH1=TH2=256-FOSC/16/12/BAUD
51 单片机 12m晶振 波特率 怎么 设置 ?五一单片机12M晶振只需要在硬件上接一个说要找订正并且病的两个30皮法的电容就可以了。五一单片机12M晶振只需要在硬件上接一个说要找订正并且病的两个30皮法...
USB 转串口 波特率 设定高和低 都可以啊 STC 单片机 串口下载...STC单片机串口下载程序时单片机的波特率可以任意设置,它会自适应。原则上在能够正确握手的情况下设置高的波特率,这样下载速度快。在使用光耦等隔离器件产生...
单片机 关于定时器和 波特率 的计算?方式1,3的波特率=1/32或1/16*计时器2的溢出率此处有一个公式:波特率=1/16或1/32*(晶振的频率/12*(256-TH1))代入:9600=11059200/32*12*(256-TH...
STM32串口 波特率 怎么 设置 ?使用库直接设置吗?像51那样寄存器的设置?如果你仔细研究USART_Init()函数,你会发现,这程序在配置波特率时会读取RCC有关的寄存器来计算当前CPU实际的工作频率是多少,然后计算参数来实现你需要的波特率...
c51 单片机波特率 ?1、51单片机串口通讯波特率可以通过相应定时器寄存器设置成多个值,典型的波特率有2400、4800、9600、19200、38400和115200,其中最常用的是9600和15200。2、...