精华内容
下载资源
问答
  • STC51单片机串口波特率设置之BRT设置

    千次阅读 2019-07-12 15:19:02
    SCON寄存器设置波特率的方法有四种,如下图: 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独立波特率发生器的溢出率
    公式如上:用到的参数有T1x12BRTx12SMOD

    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的学习汇总如下:

    https://github.com/GreyZhang/g_s32k144

    展开全文
  • 求得: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

     

    展开全文
  • 华大低功耗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%

    image-20201117215922561

    对比9600抓取的可以正常打印的波形,最小脉宽103.83us,误差率不到0.33%

    image-20201117215731250

    如此对比,发现实测的115200bps和实际配置的差别太远

    在HC32L13x用户手册上看到了相关说明,在PCLK=4MHz的条件下说明了各波特率的误差情况(注:PCLK字面意思也就是外设时钟)

    image-20201117220557691

    另外PCLK=24MHz条件下对各波特率误差就相对友好,居然还有0误差的。

    image-20201117224607474

    那么问题来了,当前工程配置的PCLK为多少呢,虽然根据表格明显应该是4MHz,查看时钟结构图如下

    关注SYSCTRL0寄存器即可,BIT7:5是选择SystemCLK哪个时钟源,BIT10:8选择SystemCLK到HCLK的分频值,BIT12:11选择HCLK到PCLK的分频值

    image-20201117221102730

    进入Keil仿真,查看SYSCTRL寄存器组,其中SYSCTRL0为0x0000 0001 ,解释为选择内部高速时钟,SystemCLK到HCLK不分频,HCLK到PCLK也不分频,也就是PCLK = RCH。

    image-20201117221700349

    问题是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,直接替换地址

    image-20201117225544332改后,跟踪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

    image-20201117230322777

    总结

    HC32L13x 串口例程PCLK给的是4MHz,默认串口波特率也是9600,要正常使用115200bps通信,需调高PCLK的值。

    也许这就是低功耗MCU吧,时钟跑这么低,PLL也不用。

    展开全文
  • 1. 本次使用ACLK,就是辅助时钟(32.768KHZ)作为串口的时钟源,那么使用波特率9600的时候,分频系数=32768/9600=3.41,所以是有小数位的,设置代码如下 UCA0CTLW0 |= UCSWRST; UCA0CTLW0 |= UCSSEL__ACLK; //...
  • 晶振频率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官方为方便用户开发所做的...
  • 最近这几天准备用串口实现DMA的传输数据,刚开始研究三天DMA,结果是一脸懵逼,无奈之下,只能跑去研究串口,结果发现Linux系统串口和DMA是真的难(小白,而且没人一起...二、串口波特率设置与SDMA传输 三、测试 ...
  • Linux设置串口波特率等参数

    万次阅读 2016-03-18 10:55:07
    嵌入式系统经常会通过串口打印调试信息,在Linux环境下,可以使用stty设置串口波特率等参数,然后使用cat就可以正确捕获串口输出的调试信息。
  • ARM7 串口波特率设置

    千次阅读 2018-02-08 14:40:58
    UARTn除数锁存是波特率发生器的一部分,它保存了用于产生波特率时钟的APB时钟(PCLK)分频值,波特率时钟必须是目标波特率的16倍。UnDLL和UnDLM寄存器一起构成一个16位除数。其中,UnDLL包含的是除数的低8位,UnDLM...
  • STM8串口波特率寄存器踩坑记录

    千次阅读 2019-08-24 18:53:39
    stm8串口波特率设置需要配置寄存器BRR1和BRR2.编程需要注意的是对BRR1进行幅值操作会更新波特率计数器,所以编程一般先对BRR2进行幅值,如下 UART1->BRR2=0x00; //波特率设置 UART1->BRR1=0x0D; //2M 9600...
  • STM32单片机修改串口波特率

    千次阅读 2020-11-03 10:32:43
    对于STM32F1系列的开发板,串口波特率设置之后,就开始进行通信了,一般情况下是不需要修改的,但是在实际的项目开发中,我们可能需要通过串口对模块进行配置等操作,配置完模块之后进行数据之间的通信,又需要更改...
  • 嵌入式Linux系统中,应用程序设置串口波特率代码示例,有需要的可以参考。
  • msp430的串口波特率设置在很多资料里都说是有两种方式,所谓的低频波特率设置和高频波特率设置。 “如果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单片机各种串口通信的类型和波特率的设置说明,及各种应用例子,资料很全
  • 想一进入程序,有默认的串口参数设置:1.把参数值设定死在OnInitDialog()函数里添加:if(m_ctrlComm.GetPortOpen())m_ctrlComm.SetPortOpen(FALSE);m_ctrlComm.SetCommPort(1);//选择com1if(!m_ctrlComm.GetPortOpen...
  • 网络上查找原因,得知是波特率不对,当串口波特率是38400,程序上是115200时,串口才开始正常通信 原因: 把stm32f4xx.h中的HSE_VALUE 设根据外部实际晶振的标称值进行更改。 #if !defined (HSE_VALUE) #define ...
  • 串口波特率计算方式

    万次阅读 2018-10-05 23:19:55
    STM32下波特率计算方式解释: 波特率的计算  STM32下的波特率和串口外设时钟... STM32串口波特率通过USART_BRR进行设置,STM32的波特率寄存器支持分数设置,以提高精确度。USART_BRR的前4位用于表示小数,后...
  • 首先我用板子是imx6dl的,然后运行的系统是linux,我这里要调试出一个串口波特率在256000,遇到问题是在对应的应用程序头文件里面并没有定义这个波特率,现在也不知道该怎么添加?现在调试的波特率只能到115200,...
  • 在STM32中,有个波特率寄存器USART_BRR,如下:STM32串口波特率通过USART_BRR进行设置,STM32的波特率寄存器支持分数设置,以提高精确度。USART_BRR的前4位用于表示小数,后12位用于表示整数。但是它还不是我们想要...
  • STC89C51 串口通信波特率设置 //9600 T2L = 0xE0; //设定定时初值 T2H = 0xFE; //设定定时初值 //115200 T2L = 0xE8; //设定定时初值 T2H = 0xFF; //设定定时初值`
  • 串口助手波特率设置为38400后,发现正常打印。 思索一番之后,发现CubeMX生成代码时,外部晶振默认为25MHz。而板载晶振为8MHz。讲HSE的外部晶振改为8MHz后,主机与从机在相同的波特率下可以正常通信。 ...
  • 由于某个器件的初始波特率是9600,我需要在初始化的时候把它设置为115200,再把串口波特率设置为115200. Ser->begin(9600); unsigned char t[8] = {0x03, 0x08, 0xC7, 0x20, 0x07, 0x00, 0x00, 0x14}; Ser->...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,232
精华内容 892
关键字:

串口波特率设置