-
STC51单片机串口波特率设置之BRT设置
2019-07-12 15:19:02SCON寄存器设置波特率的方法有四种,如下图: SCON寄存器的BIT6-7位设置了4种方式。 我们常用的格式是数据位8位,波特率需要根据实际情况进行调整,所以是可变的,所以需要SCON寄存器的BIT6=1,BIT7=0。 另外,串口...以串口1控制寄存器SCON为例,串口2控制寄存器S2CON同理。
SCON寄存器设置波特率的方法有四种,如下图:
SCON寄存器的BIT6-7位设置了4种方式。
我们常用的格式是数据位8位,波特率需要根据实际情况进行调整,所以是可变的,所以需要SCON寄存器的BIT6=1,BIT7=0。
另外,串口一般都是有发有收,所以也需要使能接收。
所以SCON寄存器的BIT4也需要置1。
关于寄存器的其他描述,https://wenku.baidu.com/view/91a925de31126edb6e1a1088.html 讲解的很清楚。下面来说一下可变的波特率是怎么计算出来的。
需要先算出:溢出率,溢出率分为 定时器1的溢出率 和 BRT独立波特率发生器的溢出率。
公式如上:用到的参数有T1x12 、BRTx12、SMOD。SMOD在PCON寄存器的BIT7位:
如果SMOD=1,波特率=(2^1)/32 * 溢出率,即溢出率/16。
如果SMOD=0,波特率=(2^0)/32 * 溢出率,即溢出率/32。T1x12 、BRTx12在AUXR寄存器的BIT6和BIT2位。
这里有很重要的一个位BIT4,如要要使用BRT独立波特率发生器,一定要把AUXR寄存器的BIT4置1。
溢出率的计算:
SYSCLK为当前MCU使用的时钟频率,单位是HZ。
比如使用外部晶振8Mhz,计算时SYSCLK=8000000。
到了这里,我们只要在手动更改BRT的值,即可设置出不同的波特率了。 -
263_S32K144串口波特率设置
2020-02-21 22:06:31完整的S32K144的学习汇总如下: ... 继续学习S32K144,似乎有SDK的情况下很多功能... 按照手头一个串口工具可以支持的几种串口波特率,做一下测试。首先,我先配置了一个300的波特率,做一下代码对比。 以上是代...完整的S32K144的学习汇总如下:
https://github.com/GreyZhang/g_s32k144
继续学习S32K144,似乎有SDK的情况下很多功能的实现很简单。上一次,简单实现了一个串口的通信功能,打印出来了一个字符串。
按照手头一个串口工具可以支持的几种串口波特率,做一下测试。首先,我先配置了一个300的波特率,做一下代码对比。
以上是代码的变化,看起来只需要修改这个数值就可以改变波特率。
300波特率测试失败。
1200的波特率测试成功。这样看,难道是波特率太低的时候配置不了?为了解决300问题,尝试了关于时钟、时间、发送方式几个选择,没有成功,暂时认定为是一个BUG吧!
波特率2400。
波特率4800。
波特率9600,这似乎是一个很常用的波特率,原因是什么我暂时就没有弄明白了。
波特率19200。
波特率38400。
波特率57600。
74880。
115200
230400
250000,做这个测试的时候发现一个很有意思的现象,其实230400的波特率发送,使用250000的上位机解析结果完全正确。看起来,这个串口的时序似乎不是很严格。
500000。
1M,看起来,这个波特率的支持还是可以很高的。但是,尝试2M的时候,一直不成功。也做了几种尝试,没有成功调试出来结果。或许这个芯片不是那种最高可以支持到4M的那种串口?不过,可以做到1M的话似乎也有很大的作用了。
完整的S32K144的学习汇总如下:
-
stm32串口波特率设置记录
2020-12-11 10:48:00求得:USARTDIV = 468.75, 因为STM32的波特比率寄存器USART_BRR分为整数部分和小数部分,所以分开计算。 则有,小数部分:DIV_Fraction = 16*0.75 =12注:这里是将10进制小数转换成16进制的小数所以乘以16 ...求得:USARTDIV = 468.75,
因为STM32的波特比率寄存器USART_BRR分为整数部分和小数部分,所以分开计算。
则有,小数部分:DIV_Fraction = 16*0.75 =12
注:这里是将10进制小数转换成16进制的小数所以乘以16 -
华大HC32L13x 串口波特率设置为115200打印乱码问题
2020-11-17 23:10:28华大低功耗MCU HC32L13x在设置串口波特率为115200时,串口打印乱码,而设置9600串口打印ok。官方例程也是9600bps,然而平常串口打印习惯性还是配置为115200-8-N-1(8bit数据位,无校验位,1停止位) 标准的115200bps...问题描述
华大低功耗MCU HC32L13x在设置串口波特率为115200时,串口打印乱码,而设置9600串口打印ok。官方例程也是9600bps,然而平常串口打印习惯性还是配置为115200-8-N-1(8bit数据位,无校验位,1停止位)
标准的115200bps的最小脉宽应该为8.68us,标准的9600bps的最小脉宽应该为104.17us
现象分析
配置115200打印乱码而不是没有打印说明有数据出来,但是不满足要求,软件在串口输出字符“123”,用逻辑分析仪抓取的乱码波形,关键,可以看到最小脉宽是7.99us,远小于8.68us,误差率7.95%
对比9600抓取的可以正常打印的波形,最小脉宽103.83us,误差率不到0.33%
如此对比,发现实测的115200bps和实际配置的差别太远
在HC32L13x用户手册上看到了相关说明,在PCLK=4MHz的条件下说明了各波特率的误差情况(注:PCLK字面意思也就是外设时钟)
另外PCLK=24MHz条件下对各波特率误差就相对友好,居然还有0误差的。
那么问题来了,当前工程配置的PCLK为多少呢,虽然根据表格明显应该是4MHz,查看时钟结构图如下
关注SYSCTRL0寄存器即可,BIT7:5是选择SystemCLK哪个时钟源,BIT10:8选择SystemCLK到HCLK的分频值,BIT12:11选择HCLK到PCLK的分频值
进入Keil仿真,查看SYSCTRL寄存器组,其中SYSCTRL0为0x0000 0001 ,解释为选择内部高速时钟,SystemCLK到HCLK不分频,HCLK到PCLK也不分频,也就是PCLK = RCH。
问题是RCH标称为4M-24M,RCH具体为多少呢,事实上RCH最多为24M也就决定了PCLK最多为24M,(也可选择PLL,可以把RCH倍频上去到48MHz,这样PCLK也可以得到48MHz)
调试-改SystemCLK为RCH 24M
查看main入口前的SystemInit函数
void SystemInit(void) { M0P_SYSCTRL->RCL_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C22ul))); M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C08ul))); SystemCoreClockUpdate(); _HidePinInit(); } uint32_t SystemCoreClock = 4000000; //add clock source. void SystemCoreClockUpdate (void) // Update SystemCoreClock variable { SystemCoreClock = Sysctrl_GetHClkFreq(); }
结合下图解释选择的正是4M,要改为24M,直接替换地址
改后,跟踪SystemCoreClock的值由4M变为了24M,该值也就是HCLK,也就是PCLK(没有分频)
M0P_SYSCTRL->RCH_CR_f.TRIM = (*((volatile uint16_t*) (0x00100C00ul)));
验证
串口部分确认配置为115200-8-N-1
//串口模块配置 void App_UartCfg(void) { stc_uart_cfg_t stcCfg; stc_uart_baud_t stcBaud; DDL_ZERO_STRUCT(stcCfg); DDL_ZERO_STRUCT(stcBaud); Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE); ///<使能UART0外设时钟门控开关 ///<UART Init stcCfg.enRunMode = UartMskMode1; ///<模式1 stcCfg.enStopBit = UartMsk1bit; ///<1bit停止位 stcCfg.enMmdorCk = UartMskDataOrAddr; //无校验 stcCfg.stcBaud.u32Baud = 115200; ///<波特率115200 stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<通道采样分频配置 stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///</<获得外设时钟(PCLK)频率值 Uart_Init(M0P_UART0, &stcCfg); ///<串口初始化 ///<UART中断使能 Uart_ClrStatus(M0P_UART0,UartRC); //清接收请求 Uart_ClrStatus(M0P_UART0,UartTC); //清发送请求 Uart_EnableIrq(M0P_UART0,UartRxIrq); //使能串口接收中断 //Uart_EnableIrq(M0P_UART0,UartTxIrq); //使能串口发送中断 //EnableNvic(UART0_IRQn, IrqLevel3, TRUE); ///<系统中断使能 }
再次抓取波形,123轻松识别,脉宽8.65us,误差不到0.35%,验证ok
总结
HC32L13x 串口例程PCLK给的是4MHz,默认串口波特率也是9600,要正常使用115200bps通信,需调高PCLK的值。
也许这就是低功耗MCU吧,时钟跑这么低,PLL也不用。
-
MSP430FR6972的串口波特率设置代码
2019-03-18 16:35:001. 本次使用ACLK,就是辅助时钟(32.768KHZ)作为串口的时钟源,那么使用波特率9600的时候,分频系数=32768/9600=3.41,所以是有小数位的,设置代码如下 UCA0CTLW0 |= UCSWRST; UCA0CTLW0 |= UCSSEL__ACLK; //... -
C8051串口波特率设置问题
2013-10-09 10:03:03晶振频率22.1184M,想得到115200的波特率,端口方面是这样设的: P0MDIN = 0x3F; P0MDOUT = 0x18; P0SKIP = 0xC8; XBR0 = 0x01; XBR1 = 0x40 晶振的设置如下: OSCXCN = 0x67; // External 22... -
12M晶振下,STM32串口波特率设置问题
2017-11-28 16:35:49使用外接12MHz的晶振,会造成很多的问题,如USART的波特率不正确,Systick走时不准等问题,在无论是在实际调试还是在软件模拟中都会发现这个情况,其实,这不能怪ST官方,我们必须肯定ST官方为方便用户开发所做的... -
linux 串口波特率的修改与sdma的设置
2020-08-26 14:28:25最近这几天准备用串口实现DMA的传输数据,刚开始研究三天DMA,结果是一脸懵逼,无奈之下,只能跑去研究串口,结果发现Linux系统串口和DMA是真的难(小白,而且没人一起...二、串口波特率设置与SDMA传输 三、测试 ... -
Linux设置串口波特率等参数
2016-03-18 10:55:07嵌入式系统经常会通过串口打印调试信息,在Linux环境下,可以使用stty设置串口波特率等参数,然后使用cat就可以正确捕获串口输出的调试信息。 -
ARM7 串口波特率的设置
2018-02-08 14:40:58UARTn除数锁存是波特率发生器的一部分,它保存了用于产生波特率时钟的APB时钟(PCLK)分频值,波特率时钟必须是目标波特率的16倍。UnDLL和UnDLM寄存器一起构成一个16位除数。其中,UnDLL包含的是除数的低8位,UnDLM... -
STM8串口波特率寄存器踩坑记录
2019-08-24 18:53:39stm8串口波特率设置需要配置寄存器BRR1和BRR2.编程需要注意的是对BRR1进行幅值操作会更新波特率计数器,所以编程一般先对BRR2进行幅值,如下 UART1->BRR2=0x00; //波特率设置 UART1->BRR1=0x0D; //2M 9600... -
STM32单片机修改串口波特率
2020-11-03 10:32:43对于STM32F1系列的开发板,串口波特率设置之后,就开始进行通信了,一般情况下是不需要修改的,但是在实际的项目开发中,我们可能需要通过串口对模块进行配置等操作,配置完模块之后进行数据之间的通信,又需要更改... -
嵌入式Linux系统中设置串口波特率
2014-08-22 13:46:48嵌入式Linux系统中,应用程序设置串口波特率代码示例,有需要的可以参考。 -
MSP430串口(UART)波特率设置问题求助
2020-09-01 19:51:17msp430的串口波特率设置在很多资料里都说是有两种方式,所谓的低频波特率设置和高频波特率设置。 “如果N大于过等于16,可以通过置位UCOS16选择过采样波特率产生模式” “在高频输入或高分频设置下,使用(低频波特... -
STM8 串口波特率与设置值不一致问题
2019-09-05 22:49:08最近调试STM8L串口通讯,发现设置了波特率115200,实际波特率却是57600。心想这种问题一般是串口的时钟分频设置不对,找了半天没有找到单独设置串口时钟的地方,费了不少时间。 void Uart1_Configer(void) { CLK_... -
Linux设置串口波特率
2020-12-09 15:27:06其中speed就是我们想要修改的波特率 stty -F /dev/ttyO0 ispeed 115200 ospeed 115200 cs8 该命令将串口1(/dev/ttyO0)设置成115200波特率,8位数据模式。一般情况下设置这两个参数就可以了,如果显示数据乱码,... -
51单片机串口和波特率设置及应用
2011-08-30 17:07:02单片机串口通信及波特率设置,里面有51单片机各种串口通信的类型和波特率的设置说明,及各种应用例子,资料很全 -
imx6 配置串口波特率_MSComm串行通讯控件设置 串口、波特率等参数方法
2020-12-21 04:42:16想一进入程序,有默认的串口参数设置:1.把参数值设定死在OnInitDialog()函数里添加:if(m_ctrlComm.GetPortOpen())m_ctrlComm.SetPortOpen(FALSE);m_ctrlComm.SetCommPort(1);//选择com1if(!m_ctrlComm.GetPortOpen... -
程序设置波特率和串口调试助手波特率设置不同才能通信
2020-04-21 21:57:32网络上查找原因,得知是波特率不对,当串口的波特率是38400,程序上是115200时,串口才开始正常通信 原因: 把stm32f4xx.h中的HSE_VALUE 设根据外部实际晶振的标称值进行更改。 #if !defined (HSE_VALUE) #define ... -
串口波特率计算方式
2018-10-05 23:19:55STM32下波特率计算方式解释: 波特率的计算 STM32下的波特率和串口外设时钟... STM32串口波特率通过USART_BRR进行设置,STM32的波特率寄存器支持分数设置,以提高精确度。USART_BRR的前4位用于表示小数,后... -
imx6 配置串口波特率_串口非标准波特率调试
2020-12-21 04:42:18首先我用板子是imx6dl的,然后运行的系统是linux,我这里要调试出一个串口,波特率在256000,遇到问题是在对应的应用程序头文件里面并没有定义这个波特率,现在也不知道该怎么添加?现在调试的波特率只能到115200,... -
串口通信中在仿真中可以设置波特率的元器件_干货 | STM32串口波特率大小计算...
2020-12-10 22:57:06在STM32中,有个波特率寄存器USART_BRR,如下:STM32串口波特率通过USART_BRR进行设置,STM32的波特率寄存器支持分数设置,以提高精确度。USART_BRR的前4位用于表示小数,后12位用于表示整数。但是它还不是我们想要... -
STC89C51 串口通信波特率设置
2020-08-13 09:21:43STC89C51 串口通信波特率设置 //9600 T2L = 0xE0; //设定定时初值 T2H = 0xFE; //设定定时初值 //115200 T2L = 0xE8; //设定定时初值 T2H = 0xFF; //设定定时初值` -
单片机串口波特率和上位机波特率相同为何依旧乱码
2021-03-04 00:32:47将串口助手波特率设置为38400后,发现正常打印。 思索一番之后,发现CubeMX生成代码时,外部晶振默认为25MHz。而板载晶振为8MHz。讲HSE的外部晶振改为8MHz后,主机与从机在相同的波特率下可以正常通信。 ... -
Arduino在程序运行的时候切换串口波特率
2020-07-07 23:41:20由于某个器件的初始波特率是9600,我需要在初始化的时候把它设置为115200,再把串口波特率设置为115200. Ser->begin(9600); unsigned char t[8] = {0x03, 0x08, 0xC7, 0x20, 0x07, 0x00, 0x00, 0x14}; Ser->...