完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
最近有朋友问关于UART串口自动识别波特率的问题,今天就在这里写点相关内容。
1写在前面 关于自动识别UART串口波特率的这个问题,相信有项目经验,或者认真研究过串口的朋友都应该多多少少知道一点自动识别的方法。 可能绝大部分知道的就是通过波特率一一匹配来实现,这种方法也是最常见,而且还比较有效的一种方法。 上面这种方法就是大家熟知的通过软件来检测波特率的方法,其实,还有一种方法就是通过硬件自身完成波特率来检测。 针对STM32,在ST官方其实在应用笔记和参考手册文档中都有提到。下面,我结合文档简单讲下硬件自动波特率检测的内容。 2 STM32硬件自动波特率检测 ABR:Auto Baud Rate,自动波特率检测使接收设备能够接受来自各种以不同速率工作的发送设备的数据,无需事先建立数据速率。 1.ABR应用地方
2.支持ABR系列 在STM32中,支持硬件自动波特率检测的只有部门系列才支持,之前出来比较早的系列不支持(如F1 F4),这后面推出来的系列都支持这个功能,包含最新才出来的STM32H7、G0系列都支持。 [img]https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/ju1DzqX8iaOlSuicx6hnpeBZMHRUvn2ZAPzBibePABXCnPzlhaibpbpFjTCcokszibbRkqibKIiaQL3JQb736CnkVVCsA/640?wx_fmt=png[/img] 当然,对于内置ABR的STM32系列设备而言,并非所有实例化USART接口均支持自动波特率检测。 [img]https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/ju1DzqX8iaOlSuicx6hnpeBZMHRUvn2ZAPOgDz1EXKGssnZlnSn3OgbjfKHQDkzS1sE4lrHBib4qcHxmu5du0sROw/640?wx_fmt=png[/img] 3.自动波特率检测模式 ABR是指接收设备通过检查第一个字符(通常是预先选择的标志字符)确定传入数据速率的过程。 STM32产品上的自动波特率检测功能内置的各种模式基于不同字符模式: 模式0:以“1”位为开头的任意字符; 模式1:以10xx模式开头的任何字符; 模式2:0x7F; 模式3:0x55; [img]https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/ju1DzqX8iaOlSuicx6hnpeBZMHRUvn2ZAPoHQEcxObl4mzzaunjPQeCp9hGY6mfkHsaHWANgC5MiaofBz1mVkYpbg/640?wx_fmt=png[/img] 提示: 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模式。 [img]https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/ju1DzqX8iaOlSuicx6hnpeBZMHRUvn2ZAPmKapn32FdPE1f1ib7ub9rs2k6Ts7947LE36oR9cCLyicxC9Ric3w2m6RA/640?wx_fmt=png[/img] 其中: • 预期波特率取决于发送设备 • 实际波特率是USART接收器使用自动波特率检测操作确定的波特率。 6.误差 下图来自官方测试数据,基于:fCK = 72 MHz时ABR的误差计算,115200 bits/s预期波特率 [img]https://ss.csdn.net/p?https://mmbiz.qpic.cn/mmbiz_png/ju1DzqX8iaOlSuicx6hnpeBZMHRUvn2ZAP1CIyRsOfScuXqfrWSEdcgWRaibKwFMmaDNzgy9soraoleydYaUrnY2A/640?wx_fmt=png[/img] 从上图可以看出:ABR模式2和3的精确度高于模式0和1;它们的波特率误差值更低。 不过,由于预期波特率与实际波特率之间的误差小于1%,因此所有模式的结果均正常。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1614 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1541 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
682 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1592 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 00:48 , Processed in 0.568366 second(s), Total 46, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号