OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2447|回复: 2

关于串口波特率计算问题

[复制链接]

43

主题

87

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2016-9-16
在线时间
41 小时
发表于 2017-4-19 00:08:52 | 显示全部楼层 |阅读模式
1金钱
要求 USARTDIV = 50.99
就有:
DIV_Fraction = 16*0.99 = 15.84
最接近的整数是:16 = 0x10 => DIV_frac[3:0]溢出 => 进位必须加到小数部分
DIV_Mantissa = mantissa (50.990 + 进位) = 51 = 0x33
于是:USART_BRR = 0x330,USARTDIV=51

红色部分是什么意思啊,没看懂,[3:0]是什么玩意
蓝色部分 为什么0x10和0x33相加就成了 0x330,C语言学的不太好。。。
另外前面是要求USARTDIV = 50.99,最后就成了USARTDIV=51


这个例子是从stm32的中文参考手册上复制过来的


求各路大神解释下。。

最佳答案

查看完整内容[请看2#楼]

波特率存在USART_BRR寄存器,USART_BRR寄存器又分成DIV_Mantissa[11:0],和DIV_Fraction[3:0];[3:0]代表第0bit到第3bit。 不是0x10和0x33相加就成了 0x330,或者说这个相加不是数学相加,而是移位后相加。0x330是最终存在USART_BRR里的值,0x33是DIV_Mantissa里的,0x0是DIV_Fraction里的,两者一个占低四位,一个占高12位共同构成一个16位数。就是0x33左移4位然后加0x00就变成了0x330。 这个例子里面,小数部分*16算出来0x10, ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

171

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
450
金钱
450
注册时间
2017-3-31
在线时间
118 小时
发表于 2017-4-19 00:08:53 | 显示全部楼层
波特率存在USART_BRR寄存器,USART_BRR寄存器又分成DIV_Mantissa[11:0],和DIV_Fraction[3:0];[3:0]代表第0bit到第3bit。
不是0x10和0x33相加就成了 0x330,或者说这个相加不是数学相加,而是移位后相加。0x330是最终存在USART_BRR里的值,0x33是DIV_Mantissa里的,0x0是DIV_Fraction里的,两者一个占低四位,一个占高12位共同构成一个16位数。就是0x33左移4位然后加0x00就变成了0x330。
这个例子里面,小数部分*16算出来0x10,但是DIV_Fraction只有0-3一共4个bit,最大只能存储0xf,所以要向整数部分进位,小数部分进位之后变为0存在DIV_Fraction里。整数部分本来是50,接收小数部分进位变为51,存在DIV_Mantissa里。
至于50.99变成了51,也是没办法的,精度越高需要寄存器位数就越多,而0.01的误差并不会影响通信
回复

使用道具 举报

5

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2018-1-14
在线时间
26 小时
发表于 2018-4-15 15:47:10 | 显示全部楼层
看波特率公式啦。。。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 19:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表