0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

USART的波特率的计算公式

电子设计 来源:电子设计 作者:电子设计 2022-02-16 15:57 次阅读

使用开发板的USART作为UART通信,在前调用BSP_Init()函数初始化开发板,串口上传输的数据出错:‘a’变成0xfa或0xfe;

【在这个问题解决之后,回头总结下,在解决问题时:

1.预计有可能造成出错的原因(这个可能需要一些经验,但是思维方式需要这样的猜测,从系统内外,可以先罗列出尽可能有的原因,后面再一一排除)

2.尽可能的定位出错的地方(比如这里通过在线调试,确定在修改时钟后,可以解决数据发送的不正确)

3.推测并排除次因,找出主因,往深一步探测 】

1:猜测原因。

外因:串口接收的过程受干扰

内因:A.端口设置有问题 B.USART的波特率设置有问题

2:定位错误

在刚开始时通过屏蔽BSP_Init()发现功能正常,再具体定位到BSP_Init()里面的SYSCLK_Frequency时钟设置,发现例程中默认的是72M,但是改为36M,就没有问题,应该是时钟方面的设置问题,具体的问题做何解析?

3:推测排除,深究

外因内因很好排除,数据既然在波特率低时能正常通信,可能不是端口设置的问题,应该是波特率的问题,常看用户手册该节的资料

注:

1.CPU 的时钟频率越低,则某一特定波特率的误差也越低。可以达到的波特率上限可以由这组数据得到。

2.只有USART1 使用PCLK2(最高72MHz)。其它USART使用PCLK1(最高36MHz)。

USART的波特率的计算公式:

USARTDIV是一个无符号的定点数。这12位的值设置在USART_BRR寄存器。那么USARTDIV与USART_BRR的关系又是怎么样的?

加入USARTDIV=27.75;那么USART_BRR=0x1B(27)+0XC(0.75*16)=0X1BC;同理可以从USART_BRR推出USARTDIV的值;

假设fck=36000000;Tx=115200;=》USARTDIV=19.53125;所以0x13+(0.53125*16=8.5)=》0x13+0x9=0x139;所以实际上是0x139产生的波特率:115015.97(误差率为0.15%);

===》理论最大波特率:36000000/(16*1.0)=2.25M(USARTDIV最小为1.0)

继续往下查,对于SYSCLK_Frequency最高72M,运行应该没有问题,但是目前有问题;顺藤摸瓜,查看各个时钟控制器,发现时钟设置路径:HSE--》PREDIV2--》PLL2--》PREDIV1--》PLL--》SYSCLK;

发现其中有问题:HSE(25M),PREDIV2(源代码设置是2分频),PLL2(8倍频),PREDIV1(9倍频),SYSCLK是算不出72M的,这时72M的算法其实已经超过72M,所以给USART2时,波特率计算时会出现问题;将PREDIV2(改为5分频就对了);

这就是为什么调用BSP_Init()或者SystemInit会出问题,他们都调用SetSysClock(),再调用SetSysClockTo72()【宏定义72M】,同时将系统时钟改为36M时不会出问题,因为此时调用的不是出问题的SetSysClockTo72(),而在之前用的是出错的SetSysClockTo72()却没有发现问题,是因为系统时钟虽没有在预设值,但是系统还足以正常工作,但是一旦添加串口,波特率设置就会有很大的偏差,数据传输就出错。

1:参考代码其实里面是有很多问题的

2:我们应该尽可能的多阅读参考代码,利用其中的资源,避免重复造轮子。

2:用串口终端软件显示字符串,连续发送几个字符串时,“xxxx/n”,包含了换行转义字符,但是就是不会换行?

通过调试,发现在存储空间,转义字符‘/n’是正确的0x0a,

USART_SendString(USART2,Menu[0]);

USART_SendString(USART2,Menu[1]);

USART_SendString(USART2,Menu[2]);

USART_SendString(USART2,Menu[3]);

但是不连续发送就不会出现这种现象,或者一句句调试打印也不会出现不换行的现象,断定是连续发送的时间间隔太短,软件还没来得及换行,就又重新显示新数据,那么就在USART_SendString的尾部加了延时,就解决问题了。

来源:http://www.51hei.com/stm32/4117.html

审核编辑:何安

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开发板
    +关注

    关注

    25

    文章

    4945

    浏览量

    97200
  • STM32F
    +关注

    关注

    1

    文章

    40

    浏览量

    18289
  • 学习笔记
    +关注

    关注

    1

    文章

    28

    浏览量

    7714
收藏 人收藏

    评论

    相关推荐

    波特率与串行通信的关系 各种设备波特率转换的方法

    波特率(Baud Rate)是串行通信中的一个重要参数,它指的是信号传输的速率,即单位时间内传输的符号(或信号状态)的数量。在串行通信中,波特率决定了数据传输的速度,因此对于通信效率和设备兼容性
    的头像 发表于 11-22 10:01 94次阅读

    常见的波特率标准和协议

    波特率是指在数据通信中,每秒钟传输的符号数(或比特数),是衡量数据通信速度的重要指标。在不同的通信协议和场景中,常见的波特率标准和协议有所不同。以下是一些常见的波特率标准和协议: 一、串口通信
    的头像 发表于 11-22 09:56 151次阅读

    波特率的定义和计算方法 波特率与数据传输速度的关系

    。符号可以是数字、字母、声音、图像等,根据不同的符号来确定每个符号占据多长时间。 波特率计算方法 波特率计算方法通常有两种: 基于传输速率和符号位数 :
    的头像 发表于 11-22 09:49 150次阅读

    波特率9600和115200的区别

    限性。 1. 波特率的定义与计算 波特率,或称为波特,是衡量数据传输速率的单位,它表示每秒钟传输的信号单元数。在串行通信中,一个信号单元可以是一个比特(bit),也可以是多个比特组成的
    的头像 发表于 10-18 14:56 906次阅读

    波特率与比特有何关系 波特率与数据传输速率的关系

    波特率(Baud Rate)和比特(Bit Rate)是衡量数据通信系统性能的两个重要参数,它们之间有着密切的关系,但并不完全相同。 波特率(Baud Rate): 波特率是指在数据
    的头像 发表于 10-18 14:55 444次阅读

    uart波特率和传输频率的关系 UART串口的常用波特率为多少

    UART(Universal Asynchronous Receiver/Transmitter)是一种广泛使用的异步串行通信技术,它允许两台设备之间进行双向数据传输。在UART通信中,波特率和传输
    的头像 发表于 10-06 16:12 1790次阅读
    uart<b class='flag-5'>波特率</b>和传输频率的关系 UART串口的常用<b class='flag-5'>波特率</b>为多少

    比特波特率计算公式及举例说明

    比特(Bit Rate)和波特率(Baud Rate)的计算方法分别涉及数据传输的不同方面,下面将分别进行说明。 比特计算 比特
    的头像 发表于 08-05 15:18 1042次阅读

    如何使用示波器测量串口波特率

    详细介绍如何使用示波器测量串口波特率,包括准备工作、设置示波器、测试步骤、结果计算及注意事项等方面,旨在为读者提供一份详尽的指南。
    的头像 发表于 05-27 16:25 4480次阅读

    芯海应用笔记:通用 MCU USART 自动波特率检测

    本文档介绍和说明芯海科技旗下 CS32 系列 MCU 的自动波特率检测功能,并为不具备硬件自动波特率检测的 MCU 产品提供替代软件方法 。*附件:应用笔记:芯海通用MCU USART自动波特
    发表于 05-16 11:42

    波特率有什么危害尼?又该如何避免?

    深入探讨了波特率过高可能带来的危害,并提供了一些实用建议来保护设备不受影响。在通信领域,波特率是决定数据传输速度的重要参数。然而,波特率设置不当可能会对设备造成严重的影响。本文旨在揭示波特率
    的头像 发表于 04-03 16:45 1270次阅读

    为啥要转换波特率 波特率和传输速率的关系

    对于串行多主 CAN 总线,如果波特率被称为“500000波特”,则 CAN 上的该端口每秒最多可传输500000位。
    的头像 发表于 03-06 17:38 4621次阅读
    为啥要转换<b class='flag-5'>波特率</b> <b class='flag-5'>波特率</b>和传输速率的关系

    波特率发生器使用哪个定时器 波特率发生器的时钟来源是什么

    波特率发生器是一种用于控制串行数据通信速率的设备,它可以生成特定波特率的时钟信号。在嵌入式系统、通信设备和计算机硬件中,波特率发生器的使用十分常见。
    的头像 发表于 01-24 09:56 1903次阅读

    什么是串口波特率?串口通信为什么要设置波特率

    什么是串口波特率?串口通信为什么要设置波特率波特率与比特的关系 如何选择串口波特率?  串口波特率
    的头像 发表于 01-22 16:10 1975次阅读

    电机扭矩的计算公式和转速计算公式

    在电机学中,电机转速和扭矩是非常重要的参数,在实际应用中,电机转速和扭矩的计算公式也使用得非常频繁,本文详细介绍扭矩的计算公式和转速计算公式
    发表于 12-25 09:41 4714次阅读

    单片机的各个通信协议的波特率

    下面是一些常见的波特率数值,这些波特率通常被用于串口通信,SPI、I2C、CAN等接口的实际波特率可能有所不同:USART:110bps300bps600bps1200bps2400b
    的头像 发表于 12-09 08:00 2823次阅读
    单片机的各个通信协议的<b class='flag-5'>波特率</b>