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

    文章

    6121

    浏览量

    113139
  • STM32F
    +关注

    关注

    1

    文章

    42

    浏览量

    18706
  • 学习笔记
    +关注

    关注

    1

    文章

    28

    浏览量

    7919
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    UART波特率计算及UART收发回显实验

    Register)。波特率与寄存器的值的公式如图19_8 所示。N表示BRR寄存器的值,B是波特率,PCLK 是外设时钟的频率(单位:MHz)。BGDM(Baud Rate Generator
    的头像 发表于 10-17 09:51 2376次阅读
    UART<b class='flag-5'>波特率</b><b class='flag-5'>计算</b>及UART收发回显实验

    115200的波特率,为啥实际速度只有11KB/s?

    波特率≠真实速度! 这几个概念确实容易混淆,但它们描述的是通信过程中不同层面的速率指标。让我们一起来理清楚它们的区别和联系↓ 主要区别解析 比特 (Bit Rate): 指每秒传输的二进制比特数量
    的头像 发表于 09-10 11:18 391次阅读

    请问如何使用低功耗 UART (LP UART) 波特率补偿?

    如何使用低功耗 UART (LP UART) 波特率补偿?
    发表于 08-21 07:05

    波特率是什么

    波特率是串行通信中的一个核心参数,用于描述数据在传输线路上的传输速率。以下从定义、单位、与比特的关系、实际应用及设置注意事项等方面进行详细说明: 一、定义与本质 波特率(Baud Rate)指单位
    的头像 发表于 07-22 11:11 5677次阅读

    可编程电源的通信波特率应如何设置?

    可编程电源的通信波特率设置需综合考虑设备兼容性、通信稳定性、实时性需求及抗干扰能力,推荐根据设备支持的最高波特率、通信距离、环境干扰等因素,优先选择标准波特率(如9600、19200、38400
    发表于 07-07 15:01

    基于瑞萨64位MPU RZ/G2L的uboot串口多波特率支持介绍

    本文主要介绍基于瑞萨64位MPU RZ/G2L,讨论uboot下非常规波特率115200的支持方法,用于解决客户对uboot下特殊波特率的需求,供客户参考。
    的头像 发表于 07-04 15:54 2753次阅读
    基于瑞萨64位MPU RZ/G2L的uboot串口多<b class='flag-5'>波特率</b>支持介绍

    第十四章 USART——串口通讯

    本章介绍了USART串口通讯,含物理层(RS-232、TTL电平)、协议层(波特率、数据帧),及W55MH32的USART功能与应用。
    的头像 发表于 06-14 16:30 1507次阅读
    第十四章 <b class='flag-5'>USART</b>——串口通讯

    如何选择合适的水位流量计算公式?

    的适用场景、参数测量方法及公式选择要点,帮助用户精准匹配计算公式。一、第一步:明确堰型结构选择公式前,需通过现场检查或设计图纸确认堰的几何形状:注意:若堰口形状与上
    的头像 发表于 04-02 16:32 1093次阅读
    如何选择合适的水位流量<b class='flag-5'>计算公式</b>?

    压敏电阻型号及电感计算公式

    )) + ( 40 * 圈长(吋))}] ÷ 圈直径 (吋) 圈数 = [8.116 * {(18*2.047) + (40*3.74)}] ÷ 2.047 = 19 圈 空心电感计算公式空心
    发表于 04-01 14:09

    CAN总线十万个为什么 | CAN自定义波特率有什么用?

    导读CAN总线通信中,波特率一致并不总能保证通信顺畅。本文将揭秘自定义波特率的原理和应用,探讨如何通过优化采样点和提高容忍度解决通信问题,助力工程师提升通信稳定性。通常情况下,CAN总线通信只需确保
    的头像 发表于 02-07 11:36 1096次阅读
    CAN总线十万个为什么 | CAN自定义<b class='flag-5'>波特率</b>有什么用?

    电工常用的计算公式

    电工常用的计算公式,帮助大家更好地理解和解决这些问题。 1、欧姆定律、焦耳定律、电功率、电能 首先,我们来看看欧姆定律。欧姆定律是电学的基础定律之一,它描述了电流、电压和电阻之间的关系。欧姆定律的公式为:I=V/R,
    的头像 发表于 01-21 09:32 2628次阅读
    电工常用的<b class='flag-5'>计算公式</b>

    AN-891: ADuC703x系列LIN波特率计算

    电子发烧友网站提供《AN-891: ADuC703x系列LIN波特率计算.pdf》资料免费下载
    发表于 01-14 15:53 0次下载
    AN-891: ADuC703x系列LIN<b class='flag-5'>波特率</b><b class='flag-5'>计算</b>

    请问MSC1210串口UART1如何设置波特率

    如题,MSC1210的手册上面有提到,UART0的波特率可以进行选择,可选择为T1的溢出作为波特率的设置,但是UART1的波特率如何设置?是和UART0的波特率一样吗?还是需要其他
    发表于 01-02 08:27

    RS232通信的波特率设置说明

    RS232通信的波特率设置是确保数据正确传输的关键参数之一。以下是对RS232通信波特率设置的说明: 一、波特率的概念 波特率是指每秒传输的比特数(bps),是衡量数据传输速度的重要指
    的头像 发表于 12-10 16:26 6377次阅读

    TDC1000的测量范围计算公式是什么?

    TDC1000的测量范围计算公式是什么
    发表于 12-10 06:19