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

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

3天内不再提示

关于STM32自动识别UART串口波特率的问题

5RJg_mcuworld 来源:lq 2019-01-24 16:23 次阅读

最近有朋友问关于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
    +关注

    关注

    2239

    文章

    10671

    浏览量

    348720
  • 波特率
    +关注

    关注

    2

    文章

    280

    浏览量

    33758
  • ABR
    ABR
    +关注

    关注

    1

    文章

    11

    浏览量

    9671

原文标题:关于STM32硬件自动波特率检测知识,项目中会用到!

文章出处:【微信号:mcuworld,微信公众号:嵌入式资讯精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32串口波特率大小计算案例

    波特率的计算 STM32下的波特率串口外设时钟息息相关,USART 1的时钟来源于APB2,USART 2-5的时钟来源于APB1。在STM32
    的头像 发表于 10-23 14:19 7518次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b><b class='flag-5'>波特率</b>大小计算案例

    什么是串口波特率串口波特率的分类及应用详解

    什么是串口波特率串口波特率是指串口通信系统中传输数据的速率。在UART
    的头像 发表于 08-08 10:09 3249次阅读
    什么是<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>?<b class='flag-5'>串口</b><b class='flag-5'>波特率</b>的分类及应用详解

    工程师实战经验笔记:STM32F0的USART自动识别问题

    本文来自ST工程师实战经验笔记,供大家参考,希望对大家STM32开发有帮助一.前言 某客户用 STM32F051的芯片做了一个自动波特率的实验(代码是仿照 ST库里面的例子写的),用串口
    发表于 11-22 14:47

    基于stm32自动识别波特率的设计

    某设备是以某个波特率发送固定已知数据的,用f4串口接收数据,怎么判别这个设备的波特率是多少呢
    发表于 09-14 14:12

    【个人经验分享】STM32ISP与STM32波特率自动识别技术理解

    STM32之ISP也同其他ISP一样采用从机(STM32)波特率自动识别技术.它采用非常“不理智”的偶校验(一个字节前面加一位校验位使得“1”的个数保持为偶数),菜农对其不 慎满意
    发表于 08-29 09:43

    29035串口刷写程序波特率自动识别DSP是怎么实现的

    有用的程序数据,那么对于没有程序数据的地址上面的数据应该都是FF,那么这个FF是否也要用数据流传送给DSP芯片2、对于串口刷写时,波特率自动识别DSP是怎么实现的,对于这个过程,上位机需要做哪些动作
    发表于 12-07 11:35

    UART_EDMA3波特率怎么设置?

    6748给的UART2_EDMA3例程中,程序中我没找到关于波特率的设置。与PC通信,当串口助手设置波特率115200的时候,接收数据不正确
    发表于 03-20 09:56

    【每日一知识点】STM32F0 的 USART 自动识别问题

    本帖最后由 张飞电子学院蔡琰 于 2021-4-12 16:55 编辑 问题:用 STM32F051 的芯片做了一个自动波特率的实验(代码是仿照 ST 库里面的例子写的),用串口发送数字键
    发表于 04-12 16:54

    关于UART串口自动识别波特率的问题汇总,错过绝对后悔

    关于UART串口自动识别波特率的问题汇总,错过绝对后悔
    发表于 12-15 06:19

    如何实现嵌入式里串口(UART)自动波特率识别程序设计?

    如何实现嵌入式里串口(UART)自动波特率识别程序设计?
    发表于 02-08 06:34

    基于SCI/UART输入信号的自动校准波特率

    本文档概述了一种基于 SCI/UART 输入信号,可以自动校准本设备SCI/UART波特率的方法,该方法适用与所有第三代C2000芯片,比如F2807x/37x,F28004x,F28
    发表于 11-04 07:16

    单片机有没有串口波特率自动识别算法?

    单片机有没有串口波特率自动识别算法
    发表于 09-21 07:09

    STM32串口自动识别波特率

    STM32串口自动识别波特率
    的头像 发表于 03-04 09:53 8368次阅读

    痞子衡嵌入式:嵌入式里串口(UART)自动波特率识别程序设计与实现(轮询)

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是嵌入式里串口(UART)自动波特率识别程序设计与实现。  本篇是 《串口
    发表于 12-05 12:51 10次下载
    痞子衡嵌入式:嵌入式里<b class='flag-5'>串口</b>(<b class='flag-5'>UART</b>)<b class='flag-5'>自动波特率</b><b class='flag-5'>识别</b>程序设计与实现(轮询)

    STM32F0的USART波特率自动识别问题

    电子发烧友网站提供《STM32F0的USART波特率自动识别问题.pdf》资料免费下载
    发表于 08-01 11:00 0次下载
    <b class='flag-5'>STM32</b>F0的USART<b class='flag-5'>波特率</b><b class='flag-5'>自动识别</b>问题