文章目录

  • 一、概要
  • 二、STM32F4波特率的计算方法
  • 三、高波特率、低误差的计算方法
  • 四、实验验证
    • 1.与参考手册中的典型波特率误差进行比对
    • 2.实际验证

一、概要

使用UART串口时往往比较喜欢配置波特率为标准的9600、115200等,而实际应用中需要更高的波特率。如果在配置UART波特率时任意输入一个很高的波特率,如200000,那么很有可能因为单片机的波特率寄存器配置方法,导致实际的波特率与200000相差很大,往往当误差大于2%时就不能稳定通讯了。因此,在获得尽量高的波特率的同时,还要保证尽量小的波特率误差,最粗暴的方式就是把目标波特率范围内的所有波特率都算一遍,然后取波特率高且误差小的。

二、STM32F4波特率的计算方法

以stm32f4系列为例,其波特率的计算方法如下,公式1:

1.fCK为UART外设的运行频率,stm32f4中为主频的一半;
2.OVER8是8倍过采样、16倍过采样的选择寄存位,当其设置为0时,表示使用16倍过采样,当其设置为1时,表示使用8倍过采样;
3.USARTDIV 是一个存放在 USART_BRR 寄存器中的无符号定点数,当 OVER8=0 时,小数部分编码为 4 位并通过 USART_BRR 寄存器中的 DIV_fraction[3:0] 位编程,当 OVER8=1 时,小数部分编码为 3 位并通过 USART_BRR 寄存器中的 DIV_fraction[2:0] 位编程,此时 DIV_fraction[3] 位必须保持清零状态。
USART_BRR寄存器的内容如下所示

由USART_BRR计算USARTDIV的步骤在参考手册里已经做了如下示例说明

三、高波特率、低误差的计算方法

有了以上的理论基础,那么就可以在matlab中进行编程了。具体思路为:由初始初始波特率到截至期望波特率,按100进行步进增加;每次的波特率计算出USARTDIV后,按照STM32写USART_BRR的方式写到DIV_Mantissa与DIV_Fraction中;然后按照USART_BRR中的DIV_Mantissa与DIV_Fraction的值对实际波特率按公式1进行计算;最后得出期望波特率与实际波特率的误差,只存储误差小于2%的记录。这样一来,我们就可以获得高波特率,且低误差的波特率了,按照此波特率进行设置没有问题。
具体程序如下,备注已经写的非常清楚了,可以拿来就用。如果你的使用情景和我不同,那么只可能改以下三个地方:
1.uart_fclk的设置,具体按你的主频来,主频除以2就是uart_fclk;
2.uart_overSample的设置,一般默认是按16倍过采样,如果你用了8倍,改成8即可;
3.for baud=9600: 100:5000000,初始期望波特率与截至期望波特率。

%存放波特率和误差的数组,第一列存期望波特率,第二列存实际波特率,第三列存误差
resArr = 1;
%resArr数组的写指针
pWresArr = 1;
%usart外设的频率,挂载在APB1总线上,主频168M时usart外设频率为84MHz,可根据实际情况调整
uart_fclk = 84000000;
%默认的16倍过采样,OVER8=1时为8
uart_overSample = 16;
%USARTDIV的值
uart_div = 0;
%USARTDIV在USART_BRR寄存器中的整数部分
DIV_Mantissa = 0;
%USARTDIV的小数部分
DIV_Fraction = 0;
%实际波特率
true_baudrate = 0;%从波特率9600开始算,直到5M,步进值100
for baud=9600:100:5000000%第一步,计算当前波特率算出的USARTDIV,并按16倍过采样保存到小数点后四位uart_div = uart_fclk / (baud * uart_overSample);uart_div = roundn(uart_div,-4);%第二步,获得USARTDIV的小数部分,乘以16后四舍五入到整数DIV_Fraction = uart_div - floor(uart_div);DIV_Fraction = round(DIV_Fraction * uart_overSample);%第三步,计算真实的波特率%此时USART_BRR寄存器中存储了USARTDIV的整数部分DIV_Mantissa和其小数部分DIV_FractionDIV_Mantissa = floor(uart_div);true_baudrate = uart_fclk / (uart_overSample * (DIV_Mantissa + roundn(DIV_Fraction/16,-4)));%第四步,计算实际波特率和期望波特率的百分比误差,通常小于2%可认为可以比较稳定的通讯diff = (true_baudrate - baud) / baud *100;if(diff <= 2 && diff >= -2) %存期望波特率到resArrresArr(pWresArr,1) = baud;%存实际波特率到resArrresArr(pWresArr,2) = true_baudrate;%存百分比误差到resArrresArr(pWresArr,3) = diff;%resArr写指针加1pWresArr = pWresArr + 1;end
end

四、实验验证

1.与参考手册中的典型波特率误差进行比对

运行matlab程序后,在resArr里便输出了结果,在STM32F4参考手册中给出了许多典型波特率以及其误差,如下所示,由于程序里设置的频率为84MHz,故只关心红框部分即可。

在我们的resArr中分别找到这几个典型波特率,发现与官方表格结果完全一致。





2.实际验证

在resArr中选一个较大的波特率,因为resArr之中只保存了误差小于2%的结果,所以,放心大胆的选把。这里随便选一个,1.9M,相当快的波特率了。

在单片机中设置波特率,并打印一句“AD7606 Reset”,如下所示


在串口助手中设置波特率为1908900,可以正常通讯,如下所示。

最后,由于使用的ttl转USB模块用的是CH340芯片,其最大波特率为2M,所以更高波特率的就暂时没法测了。

【嵌入式】任意波特率的合理计算——高波特率、低误差相关推荐

  1. 《安富莱嵌入式周报》第290期:开源静电便携测试仪,开源音频功放,CAN高波特率设计,超级铁电产品,小米Vela系统,65W USB PD充电器参考设计

    往期周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - P ...

  2. 计算机上的波特率标准,电子信号术语-波特率9600计算单位是波特/每秒(B/s)

    波特率计算公式及含义是什么: 波特率 :Bps;Baud rate;BAUD;baudrate;band rate 电抗值,电阻(率)硬件方面设计了时钟电路和波特率配置: In the hardwar ...

  3. 嵌入式100题(81):波特率是什么,为什么双方波特率要相同,高低波特率有什么区别;...

    波特率是什么,为什么双方波特率要相同,高低波特率有什么区别: 波特率是每秒钟可以传送的二进制位数,其单位为bps(bits per second)也写作bits/s.它是衡量串行数据速度快慢的重要指标 ...

  4. python输入任意多个成绩-Python 实现输入任意多个数,并计算其平均值的例子

    学习了Python相关数据类型,函数的知识后,利用字符串的分割实现了输入任意多个数据,并计算其平均值的小程序.思路是接收输入的字符串,以空格为分隔符,将分割的数据存入列表(lst1)中,将lst1中的 ...

  5. 国产自主可控的嵌入式仿真软件SkyEye和同步数据流语言高阶运算消去的可信翻译

    同步数据流语言高阶运算消去的可信翻译 同步数据流语言(例如Lustre,Signal等)广泛应用于工业界的核心安全级控制系统,如航空.核电等高安全等级的关键领域,与语言相关的软件的安全性也越来越受到人 ...

  6. mysql编写1到n的奇数和_编写程序。输入任意整数n,计算1到n的奇数和

    编写程序.输入任意整数n,计算1到n的奇数和以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 编写程序.输入任意整数n,计 ...

  7. python求1到n的奇数和_编写程序。输入任意整数n,计算1到n的奇数和。C语言编写程序 输入整数N 显...

    编写程序.输入任意整数n,计算1到n的奇数和. C语言编写程序 输入整数N 显 www.zhiqu.org 时间: 2020-11-23 解题思路:循环判断1到N的每一个数: 若除以2是结果为整数,也 ...

  8. 比特率 波特率 数据传输速率 区别;波特率与比特率--转换公式

    1.比特率 比特率(bit rate)= 传信率 = 信息传输速率(简称信息速率,information rate). 定义:通信线路(或系统)单位时间(每秒)内传输的信息量,即每秒能传输的二进制位数 ...

  9. 什么是波特率?为什么要设置波特率?

    欢迎来到东用知识小课堂! 一.什么是波特率? 波特率(Baud Rate)单位bps是用于衡量串口通信速度的单位,它表示每秒钟发送的比特数.如果一个串口的波特率为9600,就表示该串口在一秒钟内可以发 ...

最新文章

  1. 小鱼易连电脑版_生活多么美好 篇十六:我的桌面改造,有绿植,有小鱼,有大音箱...
  2. NC:自体免疫水泡皮肤病中鉴定基因与微生物组互作(微生物组关联分析MWAS)
  3. 分享一个引起极度舒适的工作桌面
  4. select事件有哪些_Android 深入底层:Linux事件管理机制 epoll
  5. 工信部:1-2月我国出口手机1.6亿台 同比增加32.6%
  6. 真机调试时部分日志丢失(魅族)
  7. 原版win7集成usb3.0驱动_windows7的不老传说,十代U安装win7教程
  8. windows 内部预览版与迅雷极速版不配合
  9. mysql数据库咋还原_mysql数据库备份和还原
  10. wcf 接收post数据_简单聊下HTTP中POST和GET请求本质区别
  11. linux壁纸图片不让复制,一些不常见到的LINUX壁纸,老规矩只提供给红联的兄弟姐妹...
  12. excel电子表格插件_从电子表格到漏洞管理
  13. pdf怎么分割页面?
  14. 【企业邮箱注册】管理员如何设置定期修改密码?
  15. day13课后总结App
  16. 立创开源 | 通过光耦PC817控制NE555产生方波脉冲
  17. 如何写cover letter 翻译自How to write a cover letter
  18. 前端瓦片地图加载之塞尔达传说旷野之息
  19. 使用Unity制作3D驾驶游戏
  20. tuned-adm性能优化的配置文件详解

热门文章

  1. 开发一个app应用的流程有哪些
  2. Android-69-音视频开发:AnyChat for Android SDK
  3. gradle配置全局镜像
  4. Pytorch实现mnist手写数字识别
  5. telegram电报机器人配置
  6. 我犯了一个非常基础的错误:在对List的循环中改变了List
  7. 上海人设提示访问接口出错
  8. BPM 应用系统开发案例实战
  9. 转:沪江小d每日一句一周详解(1.26~2.1)
  10. HA(高可用)集群之AIS(corosync),高可用httpd+NFS