STM32串口自动识别波特率

发布者:传邮万里最新更新时间:2021-01-25 来源: eefocus关键字:STM32  波特率 手机看文章 扫描二维码
随时随地手机看文章

1写在前面

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


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


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


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


2STM32硬件自动波特率检测

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  波特率 引用地址:STM32串口自动识别波特率

上一篇:你ADC采集的数据都准确吗?
下一篇:IAP+APP程序拼接方法,及相关拓展内容

推荐阅读最新更新时间:2024-11-16 22:30

剖析适合STM32的五种嵌入式操作系统的优缺点
基于STM平台且满足实时控制要求操作系统,有以下5种可供移植选择。分别为μClinux、μC/OS-II、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。 1、μClinux μClinux是一种优秀的嵌入式Linux版本,其全称为micro-control Linux,从字面意思看是指微控制Linux。同标准的Linux相比,μClinux的内核非常小,但是它仍然继承了Linux操作系统的主要特性,包括良好的稳定性和移植性、强大的网络功能、出色的文件系统支持、标准丰富的API,以及TCP/IP网络协议等。因为没有MMU内存管理单元,所以其多任务的实现需要一定技巧。
[单片机]
剖析适合<font color='red'>STM32</font>的五种嵌入式操作系统的优缺点
STM32 PWM占空比和信号周期的控制因素分析
前言 博文基于STM32F103ZET6芯片,标准固件库3.5.0和MDK5编写; 博文并不讨论PWM的基础知识,而是直接去谈对PWM灵活的控制问题;想全面了解的可以看看我写的专门针对PWM的博客: https://blog.csdn.net/wuyuzun/article/details/72851940 如有不足之处还行多多指教; PWM的两个重要参数 占空比:0~100%; 信号周期:PWM信号里一个高电平和一个低电平的时间和; 对这两个参数的设置是配置PWM输出的核心也是今天要讨论的主要任务; 是什么决定上面这两个重要参数 首先要明白一个知识:STM32的定时器输出的PWM的占空比由定时器的三个寄存器决定,分别是 定时
[单片机]
<font color='red'>STM32</font> PWM占空比和信号周期的控制因素分析
stm32 ADC的规则通道和注入通道混合使用
之前完成了规则通道DMA的数据传输了,不过平时在使用ADC的时候可能就会遇到很多情况,不可能就这样简单的按规则通道来采样,DMA存储,使用数据的;可能有时候会需要立刻采样,那样我们就需要利用到注入通道了。文档关于注入通道的解释: 1 利用外部触发或通过设置ADC_CR2寄存器的ADON位,启动一组规则通道的转换。 2 如果在规则通道转换期间产生一外部注入触发,当前转换被复位,注入通道序列被以单次扫描方式进行转换。 3 然后,恢复上次被中断的规则组通道转换。如果在注入转换期间产生一规则事件,注入转换不会被中断,但是规则序列将在注入序列结束后被执行。   将变阻器的那路ADC设置为注入通道: 1 ADC_In
[单片机]
stm32使用SDIO方式+FATFS读写内存卡
针对stm32f103zet 单片机完成对内存卡的读写操作,可以查看内存卡目录,写入文件,删除文件,更改文件,清空文件内容等,使得stm32f103zet单片机能有一个较大的外部存储空间,可跑文件系统。 内存卡分为有普通卡和高速卡SDHC卡之分 普通内存卡一般大小在2g以下 SD高速卡一般在8g~16g STM32F103ZE-EK开发板原理图 :https://pan.baidu.com/s/1smpn8VN 普通内存卡老式内存卡程序 稳定版本程序代码 :https://pan.baidu.com/s/1mjO9CDU 高速内存卡HCsdcard程序 某些程序待完善程序代码 :https://pan.baidu.co
[单片机]
STM32_ FSMC
前言: 从51学到STM32的FSMC 时候,我感觉很难,开始对着视频一顿猛刷,看的我雨里雾里。不知道这到底是个啥玩意。后来,慢慢往后学,我才顿悟了,说简单点,FSMC就是一个方便使用者来连接外挂设备的一个工具,比如你要用到TFTLCD彩屏,外扩的SRAM芯片,你当然可以用软件去配置引脚来模拟器件通信的时序,就像在51里面软件模拟IIC时序来驱动1302一样,但是这样无疑会很复杂,那么,为了方便使用,STM32就造出来个FSMC来硬件实现这个时序问题,你要做的就是配置寄存器即可。 1:FSMC的功能简介 灵活的静态存储控制器(FSMC),其主要用途: 将AHB数据通信事务转换为适当的外部器件协议 满足外部器件的访问时序要求
[单片机]
STM32_ FSMC
STM32 SysTick配置函数
之前使用SysTick滴答定时器都是通过查找内核编程手册配置寄存器让SysTick滴答定时器工作的。其实在内核相关的头文件core_cm4.h中已经有SysTick滴答定时器的相关配置了。 条件__Vendor_SysTickConfig == 0成立,配置函数才能使用。 刚好在stm32f4xx.h中定义了__Vendor_SysTickConfig = 0,所以可以使用该配置函数。 观察函数__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks),其中的寄存器和我们在Systick查询定时中用到的寄存器其实是一样的。 __STATI
[单片机]
<font color='red'>STM32</font> SysTick配置函数
STM32的16位编码器溢出问题
STM32定时器有编码器接口,但是它的计数器只有16位。当要记录的数过大时,会溢出。下文介绍了一种方法,能有效解决因计数器位数过少引起的溢出问题。 (在网上搜了好多,感觉不他们说的方法都不准。这个方法经过我自己验证,可以准确记录编码器的位置) 原理一: unsigned short int j;(j的长度为16bit) ① 当j=65535 ,运行j++后,j=0; ② 当j=0 , 运行j- -后,j=65535; 定时器的16位计数器寄存器(CNT)同样符合上面的逻辑。在编码器模式时, (一)当加计数时(up计数),加到65535后,再加1,CNT的值变为0,且溢出标志位 被置1(UIF=1),
[单片机]
基于STM32 MCU的太阳能-LED街灯解决方案
随着化石类能源的日益减少,以及温室气体的过度排放导致全球变暖问题越来越受到重视,人们一方面在积极开发各类可再生新能源,另一方面也在倡导节能减排的绿色环保技术。太阳能作为取之不尽、用之不竭的清洁能源,成为众多可再生能源的重要代表;而在照明领域,寿命长、节能、安全、绿色环保、色彩丰富、微型化的LED固态照明也已被公认为世界一种节能环保的重要途径。太阳能-LED街灯同时整合了这两者的优势,利用清洁能源以及高效率的LED实现绿色照明。 本文介绍的太阳能-LED街灯方案,能自动检测环境光以控制路灯的工作状态,最大功率点追踪(MPPT)保证最大太阳能电池板效率,恒电流控制LED,并带有蓄电池状态输出以及用户可设定LED工作时间等
[电源管理]
基于<font color='red'>STM32</font> MCU的太阳能-LED街灯解决方案
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved