STM32单片机串口波特率的计算方法解析

发布者:Whisper123最新更新时间:2024-05-11 来源: elecfans关键字:STM32  单片机串口  波特率 手机看文章 扫描二维码
随时随地手机看文章

1. 什么是波特率

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


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

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

STM32单片机串口波特率的计算方法解析

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

3. 波特率计算方法

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

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;

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

STM32单片机串口波特率的计算方法解析

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

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

4. 程序的实现

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

STM32单片机串口波特率的计算方法解析

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

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

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

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

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

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

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


关键字:STM32  单片机串口  波特率 引用地址:STM32单片机串口波特率的计算方法解析

上一篇:如何在STM32F4 ARM MCU和Python之间建立USART通信
下一篇:STM32 + ESP8266 + MQTT协议连接阿里云物联网平台

推荐阅读最新更新时间:2026-03-24 11:23

51单片机串口波特率计算
对于11.0592M晶振 bot=256-(11059200/9600/32) 此处波特率为9600 11.0592M晶振可以支持基本波特率 对于12M晶振有所不同 bot=256-(1200000/4800/32) 此处波特率为4800 12M这里波特率设置不能超过4800,因为超过后,时钟误差过大,在通讯的时候某些数据就会乱码。
[单片机]
STM32 CAN 波特率的确定
先看两份资料: (1),STM32 得到500Kb/s的波特率 CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; CAN_InitStructure.CAN_Prescaler=1; 每一位的Tq数目 = 1 (固定SYNC_SEG) + 8 (BS1) + 7 (BS2) = 16 如果CAN时钟是 8 MHz : (8M / 1 ) / 16 = 500K 其中: 1 为分频系数 16 为每一位的Tq数目 为了设置为 100K,
[单片机]
STM32之关于USART以及波特率的一些思考
一、UART与USART?   UART:通用异步收发器    USART:通用同步和异步收发器   同步:发送端发送数据后,接收端回应后才发下一个数据包,是为阻塞模式   异步:发送端发送收据后,不需要等待接收端回应,接着发送下一个数据包,是为非阻塞模式   半双工:允许数据在两个方向上传输,但是某一时间,只允许数据在一个方向上传输   全双工:允许数据同时在两个方向上传输   SPI为同步全双工通信、IIC为同步半双工通信,UART为异步全双工通信、USART为同步或异步通信   UART数据格式:          数据帧格式:开始位、数据位、奇偶校验位、停止位       起始位:开始发送一个字节数据,数据线为逻辑0状态
[单片机]
<font color='red'>STM32</font>之关于USART以及<font color='red'>波特率</font>的一些思考
STM32波特率设置
USART1的波特率公式:Baud_Rate = Fck/(16*USARTDIV) USARTDIV = Fck/(16*Baud_Rate) 然后按下述方法计算,例如总线时钟频率为72MHz,配置波特率为9600过程如下: 求得:USARTDIV = 468.75, 因为STM32的波特比率寄存器USART_BRR分为整数部分和小数部分,所以分开计算。 则有,小数部分:DIV_Fraction = 16*0.75 =12 注:这里是将10进制小数转换成16进制的小数所以乘以16** 最接近的整数是:12 = 0x0C 整数部分DIV_Mantissa = 取整 (468.75) = 468= 0x1D4 于
[单片机]
STM32 CAN 波特率、采样点设置
为了总结在STM32上设置CAN波特率和采样点,所以整理自己的理解如下: 一,CAN波特率 1.CAN位时序 2.公式推导 这里Tpclk理解成CAN时钟的周期(实际上CAN使用APB1时钟) 根据图中公式有: (1) 正常的位时间(Tnbt) = (1+Tbs1 + Tbs2)*Tq (2) Tq = (BRP+1)*Tpclk 设CAN时钟频率为Fpclk,则有 (3) Tq = (BRP+1)/Fpclk 由(1),(3)有: (4) Tnbt =(1+Tbs1 + Tbs2)* (BRP+1) / Fpclk 由(4)知CAN输出波特率(Fcan = 1 / Tnbt )为:
[单片机]
<font color='red'>STM32</font> CAN <font color='red'>波特率</font>、采样点设置
STM32基于库函数版本的系统工作频率与CAN工作波特率设置
1,系统工作频率设置 STM32系统工作频率设置寄存器版和库函数版相差较大。库函数版本系统工作频率通过system_stm32f10x.c 中的SystemInit()函数进行设置,其他的配置主要在stm32f10x_rcc.c文件中。对于系统时钟,默认情况下是在SystemInit函数的SetSysClock()函数中间判断的,而设置是通过宏定义设置的。 static void SetSysClock(void) { #ifdef SYSCLK_FREQ_HSE SetSysClockToHSE(); #elif defined SYSCLK_FREQ_24MHz SetSysClockTo24(); #elif def
[单片机]
<font color='red'>STM32</font>基于库函数版本的系统工作频率与CAN工作<font color='red'>波特率</font>设置
STM32波特率计算详解
波特率的计算 STM32下的波特率和串口外设时钟息息相关,USART 1的时钟来源于APB2,USART 2-5的时钟来源于APB1。在STM32中,有个波特率寄存器USART_BRR,如下: STM32串口波特率通过USART_BRR进行设置,STM32的波特率寄存器支持分数设置,以提高精确度。USART_BRR的前4位用于表示小数,后12位用于表示整数。但是它还不是我们想要设置的波特率,想要设置我们串口的波特率大小还需要进行计算。其实有关波特率的计算是下面这一条表达式: 从上面的表达式,我们引入了一个新量USARTDIV,它表示对串口的时钟源fck进行分频。假设我们已知道了波特率和fck时钟频率的
[单片机]
<font color='red'>STM32</font>下<font color='red'>波特率</font>计算详解
CAN FD的波特率到底能跑多快?
  众所周知,CAN FD是基于CAN 2.0的升级版协议,为了满足汽车电子日益增长的高带宽和高传输速率的要求,CAN FD主要升级了以下几个方面:   一、更高的传输波特率   图 1 可变数据段波特率结构   CANFD速率包含两个段的速率,一个是仲裁段和ACK段,沿用CAN2.0的规范,最高速率为1Mbit/s,中间的数据段是可以加速的,标称可以达到5Mbit/s,甚至更高。   二、更高效的数据段   对于汽车电子来说,对车辆动力系统、地盘以及主被动系统来说,加长的数据段避免了数据非必要的拆分,大大提升了CAN帧的传输效率。   图 2 CAN FD高效的数据段   三、更可靠的CRC校验和额外的控制位  
[嵌入式]
CAN FD的<font color='red'>波特率</font>到底能跑多快?
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved