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

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

3天内不再提示

STM32的串口自动识别波特率

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 作者:黄工的嵌入式技术 2020-03-04 09:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

最近有朋友问关于UART串口自动识别波特率的问题,今天就在这里写点相关内容。

1写在前面

关于自动识别UART串口波特率的这个问题,相信有项目经验,或者认真研究过串口的朋友都应该多多少少知道一点自动识别的方法。

可能绝大部分知道的就是通过波特率一一匹配来实现,这种方法也是最常见,而且还比较有效的一种方法。

上面这种方法就是大家熟知的通过软件来检测波特率的方法,其实,还有一种方法就是通过硬件自身完成波特率来检测。

针对STM32,在ST官方其实在应用笔记和参考手册文档中都有提到。下面,我结合文档简单讲下硬件自动波特率检测的内容。

2

STM32硬件自动波特率检测

ABR:Auto Baud Rate,自动波特率检测使接收设备能够接受来自各种以不同速率工作的发送设备的数据,无需事先建立数据速率。

1.ABR应用地方

事先不知道系统的通信速度。

系统正在使用精确度相对较低的时钟源且该机制允许在不测量时钟偏差的情况下获得正确的波特率。

2.支持ABR系列

在STM32中,支持硬件自动波特率检测的只有部门系列才支持,之前出来比较早的系列不支持(如F1 F4),这后面推出来的系列都支持这个功能,包含最新才出来的STM32H7、G0系列都支持。

当然,对于内置ABR的STM32系列设备而言,并非所有实例化USART接口均支持自动波特率检测。

3.自动波特率检测模式

ABR是指接收设备通过检查第一个字符(通常是预先选择的标志字符)确定传入数据速率的过程。

STM32产品上的自动波特率检测功能内置的各种模式基于不同字符模式:

模式0:以“1”位为开头的任意字符;

模式1:以10xx模式开头的任何字符;

模式2:0x7F;

模式3:0x55;

提示:

A.在所有ABR模式下,都会在同步数据接收期间多次检测波特率,并将每一次的检测值与上一次的检测值进行比较。

B.在7位数据长度模式下,不支持0x7F和0x55帧检测ABR模式。

4.代码配置

相关代码,官方提供有基于(标准外设库、HAL库的)参考例程,比如F0标准外设库参考代码:

static void AutoBauRate_StartBitMethod(void){ /* USART enable */ USART_Cmd(EVAL_COM1, ENABLE); /* Configure the AutoBaudRate method */ USART_AutoBaudRateConfig(EVAL_COM1, USART_AutoBaudRate_StartBit); /* Enable AutoBaudRate feature */ USART_AutoBaudRateCmd(EVAL_COM1, ENABLE); /* Wait until Receive enable acknowledge flag is set */ while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_REACK) == RESET) {} /* Wait until Transmit enable acknowledge flag is set */ while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TEACK) == RESET) {} /* Loop until the end of Autobaudrate phase */ while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_ABRF) == RESET) {} /* If AutoBaudBate error occurred */ if (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_ABRE) != RESET) { /* Turn on LED3 */ STM_EVAL_LEDOn(LED3); } else { /* Turn on LED2 */ STM_EVAL_LEDOn(LED2); /* Wait until RXNE flag is set */ while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_RXNE) == RESET) {} /* Wait until TXE flag is set */ while(USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TXE) == RESET) {} /* Send received character */ USART_SendData(EVAL_COM1, USART_ReceiveData(EVAL_COM1)); /* clear the TE bit (if a transmission is on going or a data is in the TDR, it will be sent before efectivelly disabling the transmission) */ USART_DirectionModeCmd(EVAL_COM1, USART_Mode_Tx, DISABLE); /* Check the Transfer Complete Flag */ while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET) {} } /* USART Disable */ USART_Cmd(EVAL_COM1, DISABLE);}

5.ABR误差计算

由USART时钟源( fCK)决定通信速率范围(尤其是最大通信速率)。接收器采用不同的用户可配置过采样技术,可区分有效输入数据和噪声,从而用于恢复数据。这可以在最大通信速率与抗噪声/时钟不准确性之间实现平衡。

可通过编程USARTx_CR1寄存器中的OVER8位来选择过采样方法,可以是波特率时钟的16倍或8倍。

USART时钟源频率必须与预期通信速率兼容:

• 16倍过采样时,波特率介于fCK/65535与fCK/16之间。

• 8倍过采样时,波特率介于fCK/65535与fCK/8之间。

波特率误差取决于USART时钟源、过采样方法和ABR模式。

其中:

• 预期波特率取决于发送设备

• 实际波特率是USART接收器使用自动波特率检测操作确定的波特率。

6.误差

下图来自官方测试数据,基于:fCK = 72 MHz时ABR的误差计算,115200 bits/s预期波特率

从上图可以看出:ABR模式2和3的精确度高于模式0和1;它们的波特率误差值更低。

不过,由于预期波特率与实际波特率之间的误差小于1%,因此所有模式的结果均正常。

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

    关注

    2305

    文章

    11121

    浏览量

    371164
  • uart
    +关注

    关注

    22

    文章

    1304

    浏览量

    106116
  • 波特率
    +关注

    关注

    2

    文章

    319

    浏览量

    35444
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

    决定串口波特率的寄存器有BRR(Bite Rate Rigister),SEMR(Serial Extended Mode Rigister)和MDDR(Modulation Duty
    的头像 发表于 10-17 09:51 2391次阅读
    UART<b class='flag-5'>波特率</b>计算及UART收发回显实验

    ATClient配合USART_V2使用时,无法开at_client_init后修改串口波特率是怎么回事?

    。 AT_SW_VERSION_NUM为0x10301,RTTHREAD的版本为0x50002。 有另一个项目用的串口是V1版本则正常,感觉是ATClient和串口V2在波特率修改的使用上有些地方不太兼容
    发表于 10-09 09:10

    串口波特率设置1200用不了是怎么回事?

    mcu:stm32f407zg 调试时,设置波特率为1200,而串口输出为乱码,电脑设置波特率19200来接收mcu的数据,却能接收正确; (我以前没有用RTT时,用
    发表于 09-23 07:19

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

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

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

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

    波特率是什么

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

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

    Software”在“System Configuration”→“Serial Port”中调整波特率。 3. 通过SCPI命令设置(适用于自动化测试系统) 步骤: 使用终端工具(如PuTTY、Tera
    发表于 07-07 15:01

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

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

    STM32U575串口接收+GPDMA波特率不匹配怎么解决?

    我用CubeMX配置的串口+GPDMA接收,115200波特率正常能用, 然后如果波特率设置错误为9600,再改回来115200,接收就不能用了,调试好像时DMA出错了,然后启用HAL_UARTEx_ReceiveToIdle_
    发表于 03-07 07:59

    STM32G070 UART串口,低波特率传送数据时,TIMER出现严重延时现象如何解决?

    STM32G070, UART串口,低波特率传送数据时,TIMER出现严重延时现象,传送数据长的话,导致系统重启。如何解决?
    发表于 03-07 07:07

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

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

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

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

    垃圾短信?手机自动识别垃圾短信逻辑的分析

    作者:京东科技 贾玉龙 1 背景 随着智能手机的普及和移动互联网的发展,短信作为一种传统的通讯方式,仍然保持着其独特的地位。然而,随着垃圾短信的泛滥,手机自动识别垃圾短信的技术也在不断进步。对于提供
    的头像 发表于 12-16 10:19 1471次阅读

    RS232通信的波特率设置说明

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