STM32单片机的串口通信波特率应该这样计算~

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1




1

什么是波特率


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



2

STM32波特率相关的寄存器



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

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1


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



3

波特率计算方法



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

0?wx_fmt=jpeg


在这个公式上,共有三个变量,其中两个我们是知道的,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;


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

0?wx_fmt=jpeg


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

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



4

程序的实现


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

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

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

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

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

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

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

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

640?

1.C语言学习|封装和模块化思想

2.嵌入式系统开发中,如何选择适合的MCU平台?

3.让嵌入式工程师毛骨悚然的掉电丢数据事故可以这样解决!

4.高薪都被谁拿走了?中国电子工程师薪酬调查大揭秘

5.学好单片机设计,关于晶振的这些难题一定要先搞懂!

6.80后技术人的中年危机

0?wx_fmt=gif

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

你可能感兴趣的:(STM32单片机的串口通信波特率应该这样计算~)