【原创】STM32下波特率计算详解

波特率的计算

    STM32下的波特率和串口外设时钟息息相关,USART 1的时钟来源于APB2,USART 2-5的时钟来源于APB1。在STM32中,有个波特率寄存器USART_BRR,如下:


    STM32串口波特率通过USART_BRR进行设置,STM32的波特率寄存器支持分数设置,以提高精确度。USART_BRR的前4位用于表示小数,后12位用于表示整数。但是它还不是我们想要设置的波特率,想要设置我们串口的波特率大小还需要进行计算。其实有关波特率的计算是下面这一条表达式:

    从上面的表达式,我们引入了一个新量USARTDIV,它表示对串口的时钟源fck进行分频。假设我们已知道了波特率和fck时钟频率的大小,那么通过上式便可以计算出USARTDIV的具体大小,然后再通过USART的值大小对波特率寄存器进行设置。
    USARTDIV通过上面的表达式得出,是一个带有小数的浮点数(如27.75)。将小数部分和整数部分分开,分别得到一个整数值n(如27)和一个小数值m(如0.75)。有了这两个值我们便可以填写USART_BRR寄存器进而设置我们串口波特率大小了。
    将整数部分m(27 = 0x1B)直接写入USART_BRR的后12位部分;将小数部分n乘以16后得到的整数值(如0.75 x 16 = 12 = 0xC)写入USART_BRR前4位部分,最后USART_BRR的值为0x1BC。
注意:如果小数部分乘以16之后仍带有小数,则要四舍五入去除小数部分得到一个新的整数,再将其写入USART_BRR的前四位。
 
为什么在计算波特率的公式中要乘以16?
    ​我们知道串口通信是通过TXD和RXD这两条线进行通信的,当接收器的RXD连接着发送器的TXD,接收器的TXD连接着发送器的RXD,接收器和发送器可以通过RXD和TXD互传数据。当接收器检测到RXD这条线的电平被拉为低电平,立即开始接收发送器发送过来的数据,刚刚那个低电平只是一个告知接收器可以接收数据的起始位而已。
    在数据的传输中,信号可能受到一些干扰而产生一些抖动,如下图。如果接收端只对这些信号数据采样一次,那么它有可能采样到的是抖动的不准的数据,进而使数据传输不准确,所以接收端在采样数据线上的数据,通常都要采样多次,然后通过比较获得准确的数据。
  
    
    前面已经说过,USARTDIV,它表示对串口的时钟源fck进行分频,而这16表示的正是1bit数据的采样次数。为什么呢?
    ,将这个表达式的分子分母倒过来,可以得到下面这条表达式
    
    每一位的传输时间只有1/TX_baud,这个总时间除以16,所以每采样一次的时间正好是T1,即新分频后的周期。而初始的串口时钟信号来自于APBx,APBx时钟信号需要经过分频才会等于T1,所以才需要分频USARTDIV。
本文链接:http://www.cnblogs.com/cposture/p/4268910.html

转载于:https://www.cnblogs.com/cposture/p/4268910.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java对数组进行排序_用Java对数组进行排序所需的最少交换

java对数组进行排序Problem: 问题: In this problem, we would have an unordered array with consecutive distinct natural numbers [1,2,3,..n], where n is the size of the array. We have to find the minimum number of swaps required to sort the array i…

如何实现查询附近的人?

查询附近的人或者是附近的商家是一个实用且常用的功能,比如微信中“附近的人”或是美团外卖中“附近商家”等,如下图所示: 那它是如何实现的呢?我们本文就一起来看。 我们本文的面试题是,使用 Redis 如何实现查询附近的人? 典型回答 在说如何实现地理位置查询之前,首…

英语笔记:词组句子:0712

Define sth as … 定义为…… Tie sth to sth 制约 Derive from源自于 Descend from 从……承袭下来 Divide from 分开、隔开 Distinguished from 区别于 Related to 与……有联系 Refer to 查阅、涉及 Attach to 附在……上、系在……上 Associate with 与……有联系…

第五六七章(PTA复习)

第五六七章图形界面线程IO图形界面 主要的布局管理器类包括流布局(FlowLayout)、边界布局(BorderLayout)、网格布局(GridLayout)、卡 片 布 局 (CardLayout) 、 网 格 包 布 局(CardBagLayout) 线程 答案:B IO

Eclipse jetty和plugin 的结合使用

Jetty做为一个轻量级的J2EE Web application server,它不仅小巧,而且性能也比较稳定,效率也挺高,现在也越来越得到广泛的应用。特别是eclipse平台集成了Jetty Plugin后,更是对RCP整合Web Server开发提供了极大的方便。…

python布尔运算符_Python中布尔的逻辑和按位NOT运算符

python布尔运算符In python, not is used for Logical NOT operator, and ~ is used for Bitwise NOT. Here, we will see their usages and implementation in Python. 在python中, not用于逻辑NOT运算符,而〜用于按位NOT。 在这里,我们将看…

英语笔记:作文:What elective to choose

What elective to choose 选修课的选择 Nowadays, thereexist a wide range of selective courses in college which are ready for theundergraduates to choose from. These courses make the students’ college lifemore colorful. However, as for the purpose of choosi…

Redis 有哪些数据类型?

Redis 的数据类型可谓是 Redis 的精华所在,同样的数据类型,例如字符串存储不同的值对应的实际存储结构也是不同,当你存储的 int 值是实际的存储结构也是 int,如果是短字符串(小于 44 字节)实际存储的结构为…

导出/入数据库

导出/入数据库1、以SQL文件的方式1.1导出1.2 导入2、以mdf和ldf数据库文件的方式2.1导出2.1.1 脱机2.1.2 到数据库的数据路径,拷贝出mdf,ldf文件2.1.3 将原数据库设置为online状态即可正常使用2.2导入数据库(切记导入之前要先将控制权限打开)…

arm中clz指令_JavaScript中带有示例的Math.clz32()方法

arm中clz指令JavaScript | Math.clz32()方法 (JavaScript | Math.clz32() Method) Math.clz32() is a function in math library of JavaScript that is used to find the number of leading zeroes in the 32-bit representation of the number. The method will return the n…

Oracle 创建用户 scott 例

在OracleXE中创建scott用户1、打开SQL*Plus,以 sys用户登录数据库 connect / as sysdba2、依次执行下面命令 --DROP USER scott CASCADE; CREATE USER scott IDENTIFIED BY tiger; GRANT connect,resource TO scott; GRANT CREATE DATABASE LINK, CREATE MATERIALIZ…

第八章Transact-SQL程序设计

第八章Transact-SQL程序设计8.1_变量8.1.1_局部变量8.1.2_全局变量8.2_流程控制语句8.2.1_IF...ELSE语句8.2.2_while循环语句8.1_变量 8.1.1_局部变量 局部变量的声明定义: Declare Variable_name Datatype[, Variable_name Datatype]…--举例: decla…

Redis 如何处理已经过期的数据?

上一篇我们讲了 Redis 内存用完之后的内存淘汰策略,它主要是用来出来异常情况下的数据清理,而本文讲的是 Redis 的键值过期之后的数据处理,讲的是正常情况下的数据清理,但面试者常常会把两个概念搞混,以至于和期望的工作失之交臂。我们本文的职责之一就是帮读者朋友搞清楚…

如何删除多余系统引导项

我们很多人都装过双系统,但是有时候装的当中却不想装了或者装不成功,生成的多余系统引导项怎么删除呢?下面分享下我的经验:win7(XP)下如何删除多余的系统引导项。关键词:删除多余系统引导项&…

动态规划编程面试_面试的前25大动态编程问题

动态规划编程面试Dynamic programming is one of the most asked paradigms in any product-based company interviews. You can expect DP in online assessments also if you are in touch with any product-based company. For beginner its, of course, a Tough nut to cra…

第九章存储过程

第九章存储过程9.1_游标的使用9.1.1_游标简介及使用流程9.1.2_游标的声明9.1.3_使用游标读取数据9.1.4_举例说明9.2_存储过程9.2.1_存储过程简介9.2.2_存储过程定义及执行9.2.3_重写存储过程9.2.6_删除存储过程9.2.5_举例说明9.1_游标的使用 9.1.1_游标简介及使用流程 使用游…

Oracle笔记:用户、权限及exp/imp数据

--模式(方案)逻辑概念:一个数据对象的集合,每一个用户--都有一个与之同名的模式,用于存放此用户名下的所有数据对象。select * from user_objectsselect * from dba_users;--创建用户1、给用户创建自己的数据表空间cre…

Redis 内存用完会怎样?

在某些极端情况下,软件为了能正常运行会做一些保护性的措施,比如运行内存超过最大值之后的处理,以及键值过期之后的处理等,都属于此类问题,而专业而全面的回答这些问题恰好是一个工程师所具备的优秀品质。 我们本文的面试题是 Redis 内存用完之后会怎么? 典型回答 Red…

Linux学习十七、正规表达式练习题

情境模拟题一:透过 grep 搜寻特殊字串,并配合数据流重导向来处理大量的文件搜寻问题。目标:正确的使用正规表示法;前提:需要了解数据流重导向,以及透过子命令 $(command) 来处理档名的搜寻; 我们…

ntp symmetric_Python使用示例设置symmetric_difference()方法

ntp symmetric设置symmetric_difference()方法 (Set symmetric_difference() Method) symmetric_difference() method is used to get the list of all elements which are not common in both sets, the method is called with this set (set1) and another set (set2) is sup…