精华内容
下载资源
问答
  • 2022-01-13 20:31:46

    背景

      本篇文章不涉及任何Verilog代码,仅仅只是对UART通信过程中产生的误差进行分析
      最近在写UART的Verilog的时候,因为没涉及同步通信和兼容各种其他协议所以很快就写完了。但是在做验证的时候遇到疑惑了,记录一些碰到的疑惑与大家分享。

    误差来源

    此处以9600bps举例
      例如,发送端和接收端都预期设定9600bps运行,但是两端实际已9800bps运行(时钟误差等原因造成),这样发送端和接收端依旧可以正常通信且不会造成误差。
    中间采样
    中间采样
      首先如果接收端以9600运行,但发送端以9800运行,这样势必会造成原来在数据中间的采样点逐渐偏移到数据转换节点。如图
    采样逐渐偏移采样逐渐偏移

      其次,在量化时钟数据周期的时候势必也会造成误差,例如时钟为25M,9600bps,技数周期为2,604.166666666667,量化成整数就为2604了,此处我们来计算一下误差((25M/2604)-9600)/9600*10 = 0.064%。故经过量化传输之后每个字节误差为0.064%
      综上,UART传输误差来源有两处:

    • 确定波特率之后,确定计数周期时bps_clock=clock/bps,此时bps带有小数点,在量化的时候去除小数点就会跟笔者在误差来源分析的一样有误差。
    • 发射端和接收端波特率不一致,这样每bit的采样并不是采样在最中间点上,误差从起始位累计到结束位

    计算最大误差允许值-简洁版

      首先我们假设可以容忍停止位采样误差,传输位为8位,不带奇偶校验位,且容忍余量为10%,只计算传输bit的误差,即在最后一位停止位处刚好采到90%。
      Tx设备的位周期定义如下:
    T t x = 1 b a u d r a t e Ttx=\frac{1}{baudrate} Ttx=baudrate1
    我们这里使用E来表示接收波特率和发送波特率的百分比差值,那么公式如下;
    T r x = T t x + T t x E 100 Trx=Ttx+Ttx\frac{E}{100} Trx=Ttx+Ttx100E
    Δ T r x = T t x E 100 \Delta Trx=Ttx\frac{E}{100} ΔTrx=Ttx100E
      对于初始分析,我们假设起始位采样到了50%处简化计算流程,因此对于一个8位的数据接口,采样时间为最后一个数据位8ΔTrx关闭RX
    因此,我们在足够准确的情况下得出计算公式:
    8 Δ T r x < 0.4 T t x 8\Delta Trx<0.4Ttx 8ΔTrx<0.4Ttx
    E < 5 E<5 E<5
    因此,基于这种简化分析,只要发送端和接收端之间的波特率误差小于5%,8位数据位的UART通信是可靠的

    计算最大误差允许值-完整版

      相信看到这,读者已经笔者的分析比较感兴趣了。
    接下来分析中包含的变量有:

    • 起始位采样误差
    • 可变数量的数据位
    • 对于停止位进行采样的可变余量
    • 帧误差容限

      现在我们的停止位采样余量是一个变量,我们将使用M(在简洁版中我们取10%代替的)。
    8 Δ T r x < ( ( 1 − M ) − 0.5 ) T t x 8\Delta Trx<((1-M)-0.5)Ttx 8ΔTrx<((1M)0.5)Ttx
    8 Δ T r x < ( 0.5 − M ) T t x 8\Delta Trx<(0.5-M)Ttx 8ΔTrx<(0.5M)Ttx
    我们在前面的8位数据位到这里成了变量,现在数据位的数量(用N表示)是一个变量,我们还包括奇偶校验位§和停止位(S)的变量。此处如果有奇偶校验则P=1否则P=0;同理,如果要保持停止位正确采样则S=1,否则就为0。

    • N:数据位的数量
    • P:奇偶校验位
    • S:停止位

    ( N + P + S ) Δ T r x < ( 0.5 − M ) T t x (N+P+S)\Delta Trx<(0.5-M)Ttx (N+P+S)ΔTrx<(0.5M)Ttx
    此处还忽略的起始采样的实际误差:DsbTrx
    D s b T r x + ( N + P + S ) Δ T r x < ( 0.5 − M ) T t x DsbTrx+(N+P+S)\Delta Trx<(0.5-M)Ttx DsbTrx+(N+P+S)ΔTrx<(0.5M)Ttx
    将上述的 T r x = T t x + T t x E 100 Trx=Ttx+Ttx\frac{E}{100} Trx=Ttx+Ttx100E
    Δ T r x = T t x E 100 \Delta Trx=Ttx\frac{E}{100} ΔTrx=Ttx100E带入到最后的式子中即可得到
    D s b ( ( 1 + E 100 ) T r x ) + ( N + P + S ) ( E 100 ) T r x < ( 0.5 − M ) T t x Dsb((1+\frac{E}{100})Trx)+(N+P+S)(\frac{E}{100})Trx<(0.5-M)Ttx Dsb((1+100E)Trx)+(N+P+S)(100E)Trx<(0.5M)Ttx
    综合此不等式,读者只需将进行传输的数据位,停止位,奇偶校验位和余量数值,初始采样误差代入式子中即可算出整体误差。

    解决办法

    笔者查询了不少文章,真对上面误差的解决办法有两种

    1. 自适应波特率检测,采样连续两个Byte的起始位,根据起始位计算发送端的波特率,然后校准自身波特率进行改变
    2. 接收端停止位采样只采一半,留下半位为余量作校准
    更多相关内容
  • UART 波特率选择的认识与理解

    千次阅读 2021-09-24 20:33:46
    UART 波特率的认识与理解

    笔者前几天碰到了串口波特率的问题,想要1M以上的波特率,发现波特率总是乱码,常用标准的几种波特率也不是很好用。

    1、UART时钟情况说明

    ch340G模块,时钟为12MHZ。
    在这里插入图片描述

    某PMC开发板,ARM Coretex A53内核,主频为1.6G,串口时钟为6.25MHZ,理论最大支持2Mbit/s。
    该开发板的串口波特率是通过分频而来。

    Baud Rate = 625000/(UDLH <<8+UDLL)
    在这里插入图片描述

    2、理论计算

    当选择常用的波特率时,开发板分出的波特率时钟的偏差

    波特率总时钟分频系数误差计算
    1152006250000540.47%
    1280006250000481.7%
    2304006250000270.47%
    2560006250000241.7%
    468000625000013 4.3%
    5120006250000121.7%
    921600625000073.1%
    1000000625000064.1%
    1024000625000061.7%
    2000000625000034.1%

    波特率误差计算说明:由于波特率是由总时钟分频而来,所以分频系数必须是整数。(由上面寄存器可知,总不能向寄存器写入小数吧)

    误差率 = (总时钟/分频系数 – 波特率)/波特率。
    分频系数 = int(总时钟/波特率)。最好取4舍5入,可以减少误差。

    选择上述的波特率范围原因是:串口转USB的模块支持上述波特率,

    正常波特率的接收误差范围要小于2%,为了稳定通信要小于1%,(因为)且当前串口线较长,超过15cm

    3、实际测试

    双方通信测试(乱码测试),基于CH340测试。
    921600 测试乱码
    1000000 测试乱码
    1024000 测试乱码 (256000*4)
    2000000 测试乱码

    示波器采用KeySight(是德MSO X3054T),带宽为500MHZ,采样率5GSa/s,
    在这里插入图片描述

    对于板子的时钟,是否与实际的符合也做了测试。
    发送和接收均是针对Host端来说的。
    频率的抓取位置均是通过示波器自动完成的。
    (1)115200波特率的测试抓取。(发送)
    在这里插入图片描述

    115200波特率的测试抓取。(接收)
    在这里插入图片描述

    6250000/54 = 115740HZ,和抓到的波形频率一致。
    (2)1562500波特率测试(6250000/4 = 1562500 恰好整除)(接收,即开发板生成)
    在这里插入图片描述

    串口工具设置的频率若为1562500,(发送),选择那种可以自己设置波特率的串口工具。
    比如Mobaxterm以及SecureCRT。
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    抓取的发送频率为:1.4966MHZ,误差率为:4.2%.
    两个波特率的测试,基本可以确定开发板的波特率总时钟是OK的。
    但是无法支持1M以上的波特率。

    4、最大波特率问题

    不太好确定双方都支持的最大波特率。即双方的波特率目前512000(误差率低于2%,可能误码率交高)是找到最大的且符合误差范围的波特率值。

    • 串口工具上常见的波特率,512000之上的开发板都不支持,即计算出来的误差率较高。

    • 1024000波特率是因为串口模块支持能力有限,虽然说得支持2MHz,但是实际测试下来误差较大。
      (CH340G与PL2302 在相同波特率下(1M以上)测试,无法正常通信)。

    • 其实我们经常看到51单片机或者串口模块的晶振选择11.05625MHZ,其实原因是特定晶振分出的串口波特率时钟偏差小。

    由下表可以看到11.0592MHZ的时钟偏差比12MHZ要小。

    时钟波特率分频系数误差
    11.0592MHZ/12MHZ96001152/12500%/0%
    11.0592MHZ/12MHZ11520096/1040%/0.16%
    11.0592MHZ/12MHZ23040048/520%/0.16%
    11.0592MHZ/12MHZ25600043/470.47%/0.26%
    11.0592MHZ/12MHZ46080024/260%/0.16%
    11.0592MHZ/12MHZ92160012/130%/0.16%

    假如我们不选择这种串口模块,其实可以配置成任意的波特率,只要符合一定范围内的误差就行。

    5、波特率提高

    再选择另外一种串口模块之后(CMSIS DAPLink 支持虚拟串口),波特率在1.5625Mhz可以成功通信。因为开发板4分频正好为1.5625Mhz。
    发送时钟频率(串口模块)
    在这里插入图片描述
    接收时钟频率(开发板发送时钟频率,相对概念)
    在这里插入图片描述
    误差计算为:0.064%,符合范围,可以正常通信。
    在这里插入图片描述

    6、总结

    0、发送乱码原因:模块支持M级别波特率的问题。
    1、选择常用固定的波特率是因为:ch340或者其他模块的时钟可以对这些常见波特率进行整分频。
    2、发现PL2302和CH340G在1M以上的波特率无法通信。
    3、如果需要较高的波特率(比如1M以上),需要看看模块是否满足,可以通过示波器来看,计算一下误差
    4、选择用一些可以自己设置波特率的串口工具,比如SecureCRT、Mobaxterm等。
    5、下次测试一下STM32的波特率支持情况
    6、波特率以及比特率的理解增加

    展开全文
  • 文章目录 串口通信 1. 什么叫串口 ...串行接口 (Serial Interface)是指数据一位一位地顺序传送。 与并行接口相比,其优点也非常明显: 成本低,最少需要一根线就...在讲波特率之前我们要区分两个概念:波特率和比特率
  • uart 波特率发生器

    2011-04-01 15:59:27
    串口协议的波特率发生器 来源于资料及自己编写
  • MSP432波特率与时钟频率对应关系 msp432在进行串口通讯时,都会进行波特率的设置,在MSP432中如何快速设置波特率??1.首先确定时钟频率2.串口配置参数结构体设置 msp432在进行串口通讯时,都会进行波特率的设置,在...

    MSP432波特率与时钟频率对应关系 msp432在进行串口通讯时,都会进行波特率的设置,在MSP432中如何快速设置波特率??


    msp432在进行串口通讯时,都会进行波特率的设置,在MSP432中如何快速设置波特率??

    1.首先确定时钟频率

    在这里插入图片描述
    下面是可选项(一般选用12MHZ/24MHZ)

    在这里插入图片描述

    2.串口配置参数结构体设置

    在这里插入图片描述
    在这里插入图片描述
    最主要设置这三项
    这是如何计算来的???
    这里直接打开应用技术手册905页,可以看到以下两张表

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    这里可以看到在不同频率下对应波特率设置
    举个例子:

    在设置频率为12Mhz时候,波特率设置为115200
    找到对用应用手册
    在这里插入图片描述在这里插入图片描述
    设置如下
    在这里插入图片描述

    在这里插入图片描述

    实测可用

    展开全文
  • NXP JN5169 UART 波特率设置一、系统时钟介绍1、高速(32MHz)系统时钟1、32MHz 晶体振荡器2、高速RC振荡器2、低速(32kHz)系统时钟1、32 kHz RC 振荡器2、32 kHz 晶体振荡器3、32 kHz 外部时钟二、UART 时钟三、串口...



    一、系统时钟介绍

            两个系统时钟用于驱动 JN5169 的片上子系统。 唤醒定时器由低频时钟(通常为 32kHz )驱动。 所有其他子系统(收发器,处理器,存储器以及数字和模拟外围设备)均由高速时钟(名义上为 32MHz )或其分频出来的时钟驱动。
            高速时钟要么由精确的晶体控制振荡器(32 MHz)产生,要么由精度较差的高速RC振荡器(已校准27 MHz至32 MHz)产生。 低速时钟要么由精确的晶体控制振荡器(32 kHz至768 kHz)产生,要么由精度较低的RC振荡器(以32 kHz为中心)产生,或者可以从外部提供。

    1、高速(32MHz)系统时钟

            JN5169 外接 32MHz 晶振,经过时钟源选择,32MHz 二分频输出 16MHz 到外设,外设使用 16MHz 的时钟

    在这里插入图片描述

            晶体振荡器通常启动缓慢。因此,为了在休眠周期或复位后提供快速启动,快速 RC 振荡器始终被用作高速系统时钟的初始源。振荡器启动非常快,将在 25MHz 至 32MHz(未校准)或 32MHz ± 5%(已校准)下运行。
            这意味着系统时钟将以不确定的频率运行(比正常频率稍慢或更快),但这并不妨碍 CPU 和内存子系统正常运行,因此可以执行程序代码。但是,无法使用无线电或 UART,因为即使在校准之后(由调用API函数的用户软件启动),在电压和温度范围内,时钟速率仍具有±5%的容差。
            可以使用其他数字外围设备(例如 SPI 总线主/从设备),但由于时钟频率不准确,如果使用定时器,则必须小心,因为不能确定系统时钟的频率。
            唤醒时使用快速 RC 振荡器意味着无需等待 32MHz 晶体振荡器稳定下来。 因此,应用代码将使用高速 RC 振荡器的时钟开始快速执行。

    1、32MHz 晶体振荡器

            JN5169 外部晶振电路如下图所示。 两个电容器C1和C2通常应为12 pF,并使用C0G电介质。 由于这些电容器的尺寸很小,因此必须使到外部组件的走线尽可能短。 片内跨导放大器可补偿温度变化,并通过内部电阻器 R1 自偏置。
            该振荡器具有一个功能,当振荡的振幅达到令人满意的水平以进行完全操作时,该功能会进行标记,并在将高速系统时钟的源更改为 32MHz 晶体振荡器之前进行检查。

    在这里插入图片描述

    2、高速RC振荡器

            JN5169 除了 32MHz 晶体振荡器以外,还提供了一个片上高速 RC 振荡器,用于两个目的:

    • 方便从复位或休眠状态快速启动
    • 为非定时关键应用提供了一种较低电流的替代晶体振荡器

            默认情况下,振荡器将以 27MHz 的频率运行,通常具有宽容差。 可以使用软件 API 函数进行校准,这将导致 32MHz 的标称频率在 3V 和 25℃ 时具有 ±1.6% 的容差。 但是,应注意,在电压和温度的整个工作范围内,这将增加至 5%。 在整个速度周期中以及在禁用振荡器时都会保留校准信息,因此通常只需调用一次校准功能。 该振荡器不需要任何外部组件。

    2、低速(32kHz)系统时钟

            32 kHz 系统时钟用于计时睡眠时间。 可以通过应用软件从以下三种来源之一选择时钟:

    • 32 kHz RC 振荡器
    • 32 kHz 晶体振荡器
    • 32 kHz 外部时钟

            芯片复位或上电时,JN5169 默认使用内部 32 kHz RC 振荡器。 如果选择了另一个时钟源,则它将在所有 32 kHz 时序中保持使用状态,直到执行芯片复位为止。

    1、32 kHz RC 振荡器

            内部 32kHz RC 振荡器不需要任何外部组件。 由于制造工艺的变化,振荡器的内部定时组件具有宽容差,因此振荡器的标称工作频率为 32 kHz -10% + 40%。
            为了使它可用作从睡眠中准确唤醒的定时源,可以应用从更准确的 16 MHz 时钟中导出的频率校准因子。 校准系数是通过软件得出的。
            在使用之前,软件必须检查 32kHz RC振荡器是否正在运行。 振荡器的默认电流消耗约为0.5μA。 可选地,可以将其减小至0.375μA。 但是,校准的精度和温度系数将因此变差。

    2、32 kHz 晶体振荡器

            为了获得更准确的睡眠时间,JN5169 可以外接 32.768 kHz 晶振。 晶振应连接在 32KXTALIN 和 32KXTALOUT(DIO9和DIO10)之间,并且两个相等的电容器接地,每个引脚一个。 由于电容器的尺寸小,重要的是要使到外部组件的走线尽可能短。振荡器单元非常灵活,可以与一系列常见的 32.768 kHz 晶体一起工作,负载电容为 6 pF 至 12.5 pF。

    在这里插入图片描述

    3、32 kHz 外部时钟

            可以将 32KIN 输入(DIO9)上的外部提供的 32 kHz 参考时钟提供给 JN5169。 这样就可以从非常稳定的外部振荡器模块获得 32 kHz 系统时钟,与内部RC振荡器相比,可以提供更准确的睡眠周期时序。



    二、UART 时钟

    UART 时钟来源框图:

    在这里插入图片描述

            如上图,复位后,JN516x 器件从内部高速 RC 振荡器获取系统时钟。默认情况下,一旦晶体振荡器稳定下来(大概需要 1ms 的时间),就会自动切换到外部 32MHz 晶体振荡器。 复位后立即执行应用代码。一旦设备和系统时钟完全启动并运行,即可使用函数 vAHI_SelectClockSource() 更改系统时钟源。 当前源时钟的标识可以通过调用函数bAHI_GetClkSource() 获得。

            如果要将外部晶体振荡器用作系统时钟的源,则一旦自动切换到晶体振荡器(bAHI_GetClkSource() == FALSE),就应调用函数 vAHI_OptimiseWaitStates()。 此功能根据系统时钟频率优化 JN516x 内部闪存和 EEPROM 的等待状态,以最大程度地缩短访问时间。

    bool_t bAHI_GetClkSource(void)
    功能:此功能获取JN516x器件上系统时钟的时钟源标识。如果高速RC振荡器是系统时钟源,则 bAHI_GetClkSource() 不表示振荡器的工作频率。
    返回值:时钟源。TRUE - RC振荡器,FALSE - 晶体振荡器。

    void vAHI_OptimiseWaitStates(void)
    更改系统时钟源或 CPU 时钟频率以最大程度地缩短闪存访问时间后,此功能将重新计算内部闪存和 EEPROM 设备的等待状态设置。 在调用vAHI_SelectClockSource() 或bAHI_SetClockRate() 之后会自动调用该函数,但最好在以下两种情况下由应用程序调用:
    1、在应用程序启动(冷启动或热重启)时,系统时钟由内部高速RC振荡器运行
    2、从内部高速RC振荡器切换到外部32MHz晶振后

    因此,系统时钟初始化函数如下:

    /*等待系统时钟切换为外部32MHz晶振*/
    while (bAHI_GetClkSource() == TRUE);
    /*优化闪存等待状态*/
    vAHI_OptimiseWaitStates();
    

            但是,在默认情况下,一旦晶体振荡器稳定下来(大概需要 1ms 的时间),系统时钟源就会自动切换到外部 32MHz 晶体振荡器,复位后立即执行应用代码,所以在非 RTOS 应用下,一般可以不检测系统时钟源。

            JN-UG-3087 JN516x Integrated Peripherals API User Guide 提供的 UART API 假设外设时钟以16MHz运行,并且来自外部晶体振荡器。 不建议从任何其他时钟运行UART。



    三、串口波特率设置

    UART 收发功能实现: NXP JN5169使用UART发送数据

    UART 外设API函数:NXP JN5169 UART集成外设API函数

    JN-UG-3087 JN516x Integrated Peripherals API User Guide 提供了两种方法设置波特率:

    • 使用 vAHI_UartSetBaudRate() 接口设置波特率
    • 使用 Divisor 和 ClocksPerBit 设置波特率

    JN516x UART 可设置的波特率最高为 4 Mbits/s

    1、使用 vAHI_UartSetBaudRate() 接口设置波特率

    vAHI_UartSetBaudRate() 接口提供了 6 个常用波特率的宏定义,需要哪个波特率直接传入相应的宏定义即可

    在这里插入图片描述

    vAHI_UartSetBaudRate(E_AHI_UART_1, E_AHI_UART_RATE_115200); //波特率 115200
    



    查看 vAHI_UartSetBaudRate() 接口,这个接口最后调用的是 vAHI_UartSetClockDivisor() 接口,从这个接口看,这里设置波特率是通过设置时钟除数计算出来的,由于无法查看源码,无法得知该接口设置的波特率的误差。

    在这里插入图片描述



    2、使用 Divisor 和 ClocksPerBit 设置波特率

    JN-UG-3087 JN516x Integrated Peripherals API User Guide 提供了两个 API 设置波特率。

    vAHI_UartSetBaudDivisor(),该函数设置一个整数除数,以从指定 UART 的 1MHz 频率得出波特率。 该功能允许设置通过函数 vAHI_UartSetBaudRate() 无法获得的波特率。

    vAHI_UartSetClocksPerBit(),该功能将指定 UART 使用的波特率设置为从16MHz外设时钟得出的值。 其中在此函数中设置了 Cpb,在 vAHI_UartSetBaudDivisor() 中设置了 Divisor。 因此,在调用 vAHI_UartSetClocksPerBit() 之前,必须先调用函数 vAHI_UartSetBaudDivisor() 来设置 Divisor。

    波特率计算公式(单位 Mbits/s):
    在这里插入图片描述

    这里提供一个计算 Divisor 和 Cpb 参数的 C 语言代码,还可以计算出当前参数设置的波特率的误差。

    #include <stdio.h>
    #include <math.h>
    
    #define ERROR			0.007	//宏定义波特率最大误差
    #define DIVISOR_SIZE	1000	//宏定义除数范围 1 - 1000
    #define	CPB_SIZE		15		//时钟位范围0 - 15,不可更改,不推荐值0-2 
    
    int main(void) {
    	unsigned short len, Divisor;	//除数
    	unsigned char  i, Cpb;		//ClocksPerBit,时钟位
    	double baud_rate;		//波特率
    	//常用波特率
    	unsigned long normal_rate[16] = {
    		1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 56000,
    		57600, 76800, 115200, 128000, 500000, 1000000, 4000000
    	};
    
    	double deviation;		//波特率误差
    
    	len = 0;																//有效的波特率设置个数 
    	for(i = 0; i < 16; i++) {												//16个常用波特率 
    		for(Divisor = 1; Divisor <= DIVISOR_SIZE; Divisor++) {				//除数取值范围 
    			for(Cpb = 3; Cpb <= CPB_SIZE; Cpb++) {							//时钟位取值范围,不推荐值0-2 
    				baud_rate = (16.0 / (Divisor * (Cpb + 1.0))) * 1000000.0;	//当前除数和时钟位算出来的波特率 
    				deviation = abs(baud_rate - normal_rate[i]) / baud_rate;	//与目标波特率的误差 
    				if(deviation <= ERROR) {									//误差小于最大误差
    					len++;
    					printf("Divisor = %4d\tCpb = %2d\tbaud_rate = %7.4f bits/s\ttarget baud_rate = %7d\tdeviation = %1.5f\n", Divisor, Cpb, baud_rate, normal_rate[i], deviation);
    				}
    			}
    		}
    	}
    	printf("\nlen = %5d\n", len);
    
    
    
    	return 0;
    }
    

    当最大误差为 0.007,Divisor 范围为 1-1000 时,控制台输出:

    在这里插入图片描述
    设置 115200 波特率,当 Divisor = 23,Cpb = 5 时,波特率为 115942.0290,与目标波特率 115200 误差为 0.0064

    vAHI_UartSetBaudDivisor(E_AHI_UART_1, 23);//波特率 115200,误差0.0064
    vAHI_UartSetClocksPerBit(E_AHI_UART_1, 5);
    

    当最大误差为 0.01,Divisor 范围为 1-10000 时,控制台输出如下图,从这里可以知道,当 Divisor = 23,Cpb = 5 时设置 115200 波特率,最少误差为 0.0064

    在这里插入图片描述

    当最大误差为 0.001,Divisor 范围为 1-10000 时,控制台输出如下图,从这里可以知道,当 Divisor = 119,Cpb = 13 或者当 Divisor = 238,Cpb = 6 时设置 9600 波特率,最少误差为 0.00031

    在这里插入图片描述

    展开全文
  • 71-UART波特率设计.7z

    2021-04-16 23:35:01
    UART波特率设计,Vivado仿真工程。
  • 接口缺少外部时钟,只有当内部波特率相等时,Tx和Rx器件才能可靠地共享数据。 但当然“相等”并不是一个真正的工程词 - 我们总是要考虑噪声,误差和变化,而对于微控制器的内部振荡器,我们不是在谈论百万分之几。...
  • UART波特率自适应Verilog程序

    热门讨论 2011-07-28 09:29:29
    用Verilog写的串口自适应的程序,可以适应在110,300,600,900,1200,2400,4800,9600,1440,19200,15600,115200等多种串口模式下实现通信,其中包括波特率发生模块,端口波特率侦测模块,老外写的,值得借鉴
  • 结合自己调试的经验,这里做一个总结,uart波特率参数需要通过计算来得到的,具体方法如下: void scic_echoback_init() { // Note: Clocks were turned on to the Scib peripheral // in the InitSysCtrl() ...
  • 6657 设置串口波特率 以614400为例 (1)根据公式计算分频系数 (2)1GHz主频下UART输入频率166666666Hz。(1/6) (3)16倍采样率下分频系数是16.95取整16,实际波特率为651042。 10^9 /6 / 614400 /16 =...
  • STC单片机UART通信波特率误差容忍范围研究
  • uart的发送代码,带有可配置的奇偶校验,波特率可配置,三段式状态机,文学功底差.
  • ARM linux 内核更改uart波特率方法

    千次阅读 2015-12-22 17:42:53
    在内核目录/kernel/drivers/tty/serial/ 里面更改波特率
  • UART-FPGA整理-波特率

    2020-11-04 13:24:42
    波特率的定义,和比特率的混析,模块描述
  • 1.1UART接口波特率是多少?以及异步采样时钟是多少频率? 1.1.1 本节目录 1)本节目录; 2)本节引言; 3)FPGA简介; 4)UART接口波特率是多少?以及异步采样时钟是多少频率?; 5)结束语。 1.1.2 本节引言...
  • 通讯原理 UART(Universal Asynchronous Reciver/Transmitter),通用异步收发器,异步通讯说明无时钟信号,通过检测数据包中的起始位和停止位来接收数据,数据通信...波特率:在1个单位时间内能传输的数据量(单位bit
  • UART通信协议(一)比特率和波特率

    千次阅读 2019-11-06 16:22:49
    比特率和波特率的关系: 错误理解:波特率 = 比特率 x 传送一个码元需要的比特数 比如:假设在UART中,以9600的波特率进行数据调制,其中传送每个字节含1个起始位,8个数据位,2个停止位,无校验位,那么传送一个...
  • STC单片机UART通信波特率误差容忍范围研究.pdf
  • UART串口通讯框图、波特率计算方法 Mantissa=USA
  • DW UART波特率配置

    2019-09-06 09:06:05
    20MHz 115200波特率 set *0x5001000c=0x83 set *0x50010000=0xb set *0x5001000c=0x3 set *0x50010000='a'
  • mtk UART 波特率设置

    千次阅读 2013-04-26 18:15:07
    1. 在两个文件中: cust_bldr.h #define CFG_UART_LOG (UART1) // 配置LOG输出端口  #define CFG_LOG_BAUDRATE (921600) //波特率设置 2. ubconfigs.h
  • MSP430F149 Uart 波特率9600 工程文件
  • c8051f020定时器2作为波特率发生器
  • uart默认波特率修改

    千次阅读 2018-11-20 10:56:14
    刚开始以为 UART波特率会在dts里面配置,结果没找到,虽然在终端可以通过 stty去配置,但stty -a 里面默认的波特率从哪来的呢? 于是去看了看源码。 int uart_register_driver(struct uart_driver *drv) normal ...
  • 关于自动识别UART串口波特率的这个问题,相信有项目经验,或者认真研究过串口的朋友都应该多多少少知道一点自动识别的方法。 可能绝大部分知道的就是通过波特率一一匹配来实现,这种方法也是最常见,而且还比较有效...
  • msp430的串口波特率设置在很多资料里都说是有两种方式,所谓的低频波特率设置和高频波特率设置。 “如果N大于过等于16,可以通过置位UCOS16选择过采样波特率产生模式” “在高频输入或高分频设置下,使用(低频波特...
  • 今天痞子衡给大家分享的是嵌入式里串口(UART)自动波特率识别程序设计与实现。  串口(UART)是嵌入式里最基础最常用也最简单的一种通讯(数据传输)方式,可以说是工程师入门通讯领域的启蒙老师,同时串口打印也是...
  • 2、定时器1波特率有4种可选择,默认9600bps。另外还有1个字节的发送函数,字符串发送函数。 3、增添:定时器2波特率有5种可选择,默认9600bps。 3、有几个寄存器默认的reg52.h里面没有,我也给添加进去了,但是我...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,258
精华内容 9,303
关键字:

uart波特率