0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

波特率是什么?波特率设计

冬至子 来源:两猿社 作者:IC猿 2023-06-05 15:19 次阅读

01 波特率是什么

从宏观理解,波特率表征了串口的 传输速度

从微观上,波特率是指在系统中 单位时间内传输的码元个数 。对于UART而言,码元是二进制的,都是用高低电平传输,所以波特率和比特率在数值上是相等的。例如,当波特率为115200时,实质就是UART串口每秒传输115200个bit的数据量,传输一个bit的时间等于1/115200秒。常见的UART串口波特率为300、600、1200、4800、9600、19200、34800等。

串口传输中一个bit数据的周期即传输一个bit的时间,即可以表示为:

1.jpg

在串口传输中,一帧数据由起始位(1bit)、数据位(典型8bit)、校验位(1bit)和停止位(1bit)组成,在通常情况下一帧数据有11bit。那么可以算出1帧数据传输所需的时间为11x1/bps。

串口通信的双方需要设置相同的波特率 ,由波特率约定数据传输的周期。决定了应该多久读取一次电平值。

02 模块接口与描述

1.jpg

  • 26MHz功能时钟主要用于波特率的产生与计算,由外部输入。
  • 接收波特率使能信号由接收数据模块中产生,UART_RX线检测到起始位后使能接收波特率。
  • 发送波特率使能信号由发送数据模块中产生,需要发送数据时即可使能。
  • 波特率分频系数是配置模块产生,由APB总线配置。
  • 接收和发送波特率时钟根据配置由26MHz时钟产生的用接收和发送数据的信号。

03 功能时钟与波特率设计

本项目使用的功能时钟为26MHz,波特率可通过波特率分频系数BAUD_DIV进行配置。波特率分频系数BAUD_DIV与波特率之间的关系为:

1.jpg

为了方便计算和设计,我们将N固定为16,只配置BAUD_DIV来调整波特率,波特率可配置如下:

1.jpg

波特率计算公式中,分母即为一个数据周期所需要计26MHz时钟的个数。已知波特率和功能时钟频率,即可计算一个波特率周期所需的功能时钟数。公式中的乘N操作使用左移实现(默认波特率为9600)。

always@(posedge clk26m ornegedge rst26m_) begin
    if(!rst26m_) begin
        cnt_value <= 10'd169 < < 4;
    end
    elsebegin
        cnt_value <= (baud_div + 1'b1) < < 4;
    end
end

在产生接收数据的波特率时钟时,需要注意,接收模块是根据所产生的这个波特率时钟来进行数据接收,数据采集如果都在“ 每位数据的中间 ”,那么采样出的数据是最稳定的。

图片

接收数据采样

所以在产生波特率时钟时,RX波特率计数器累加到一半时就应使产生接收波特率时钟。而发送数据时则不必这样,只需保证波特率正确即可。

波特率模块实现如下:

`timescale 1ns/1ps
module    UART_BAUD(
   // inputs
    clk26m,
    rst26m_,
    tx_bps_en,
    rx_bps_en,
    baud_div,
    // outputs
    rx_bpsclk,
    tx_bpsclk
);

input            clk26m;             // 26M function clock
input            rst26m_;            // function clk's rst_
input            rx_bps_en;          // baud enable signal
input            tx_bps_en;
input  [9:0]     baud_div;           // baud frequency divide factor
output           rx_bpsclk;          // receive bps clk
output           tx_bpsclk;          // send bps clk

reg  [13:0]     cnt_value;           // bps count value
reg  [13:0]     cnt_baud_rx;         // receive baud counter
reg  [13:0]     cnt_baud_tx;         // send baud counter


// produce receive bpsclk
always@(posedge clk26m ornegedge rst26m_) begin
    if(!rst26m_) begin
        cnt_baud_rx <= 14'd0;
    end
    elsebegin
        if(rx_bps_en) begin
            if(cnt_baud_rx > cnt_value - 1'b1) begin
                cnt_baud_rx <= 14'd0;
            end
            elsebegin
                cnt_baud_rx <= cnt_baud_rx + 1'b1;
            end
        end
        elsebegin
            cnt_baud_rx <= 14'd0;
        end
    end
end
assign  rx_bpsclk = (cnt_baud_rx == (cnt_value >>1))? 1'b1:1'b0;

// produce send bpsclk
always@(posedge clk26m ornegedge rst26m_) begin
    if(!rst26m_) begin
        cnt_baud_tx <= 14'd0;
    end
    elsebegin
        if(tx_bps_en) begin
            if(cnt_baud_tx > cnt_value - 1'b1) begin
                cnt_baud_tx <= 14'd0;
            end
            elsebegin
                cnt_baud_tx <= cnt_baud_tx + 1'b1;
            end
        end
        elsebegin
            cnt_baud_tx <= 14'd0;
        end
    end
end
assign  tx_bpsclk = (cnt_baud_tx == (cnt_value >>1))? 1'b1:1'b0;

always@(posedge clk26m ornegedge rst26m_) begin
    if(!rst26m_) begin
        cnt_value <= 10'd169 < < 4;
    end
    elsebegin
        cnt_value <= (baud_div + 1'b1) < < 4;
    end
end

endmodule

波特率模块虽然理解和实现起来比较简单,但也是比较重要的,是接收和发送数据的依据。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接收机
    +关注

    关注

    8

    文章

    1122

    浏览量

    52643
  • 计数器
    +关注

    关注

    32

    文章

    2123

    浏览量

    92987
  • 串口通信
    +关注

    关注

    32

    文章

    1577

    浏览量

    54865
  • 时钟域
    +关注

    关注

    0

    文章

    49

    浏览量

    9455
  • Uart串口
    +关注

    关注

    0

    文章

    28

    浏览量

    6715
收藏 人收藏

    评论

    相关推荐

    STM32单片机的串口波特率计算方法

    不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。下面以STM
    的头像 发表于 01-05 09:59 2.7w次阅读
    STM32单片机的串口<b class='flag-5'>波特率</b>计算方法

    STM32G4的外部晶振设置can通信波特率波特率均不正常无法通信怎么解决?

    目前使用G4配置CAN,波特率500k,在选择内部晶振为外设时钟时,可以通过计算配置500k正常通信,但是使用外部24M晶振时,只有把APB1设置为16M时可以正常通信,一旦采用其他频率时,波特率
    发表于 04-11 06:23

    #硬声创作季 #CAN #PLC 总线设计的波特率应该如何选择?

    CAN波特率波特率发生器
    学习电子知识
    发布于 :2022年11月02日 20:00:29

    单片机原理及应用: 波特率#单片机

    单片机波特率波特率发生器
    学习硬声知识
    发布于 :2022年11月06日 15:02:57

    单片机原理与应用: 波特率计算#单片机

    单片机波特率波特率发生器
    学习硬声知识
    发布于 :2022年11月08日 19:07:59

    STM32+CUBE+HAL库+CAN+无法通信

    STM32+CUBE+HAL库+CAN+无法通信问题解决要解决这个问题最需要注意的波特率其他的跟着网上其他资料配就好了波特率波特率波特率重要的事情说三遍这个是can的配置注意这个APB
    发表于 08-19 07:21

    STC8a8k单片机串口波特率倍速后发送和接收就不对了是为什么?

    STC8a8k单片机串口波特率的倍速是干什么用的,什么时候用什么时候不用,什么作用,为什么我设置的同样的波特率波特率倍速后串口发送和接收的就不对了,TH和TL都有更改过,而且是从isp助手上复制的,这是怎么回事,还需要设置什么
    发表于 10-27 06:48

    什么是波特率_波特率9600是什么意思_串口通信为什么要设置波特率

    波特率(Baud Rate) 单位 bps -- 每秒传送的字节数 Byte Per Second.。
    发表于 08-23 11:54 45.6w次阅读

    STM32单片机的串口通信波特率计算方法

    不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。
    的头像 发表于 05-10 11:49 2.2w次阅读
    STM32单片机的串口通信<b class='flag-5'>波特率</b>计算方法

    STM32单片机串口波特率的计算方法解析

    不管是什么单片机,在使用串口通信的时候,有一个非常重要的参数:波特率。什么是波特率波特率就是每秒传送的字节数。双方在传输数据的过程中,波特率一致,这是通讯成功的基本保障。
    发表于 08-15 15:30 5906次阅读
    STM32单片机串口<b class='flag-5'>波特率</b>的计算方法解析

    一文了解波特率、比特率、通信速度的区别

    在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率波特率是传输通道频宽的指标。
    的头像 发表于 04-06 14:46 4975次阅读

    什么是波特率?为什么要设置波特率

    欢迎来到东用知识小课堂!一、什么是波特率波特率(BaudRate)单位bps是用于衡量串口通信速度的单位,它表示每秒钟发送的比特数。如果一个串口的波特率为9600,就表示该串口在一秒钟内可以发送
    的头像 发表于 04-08 00:00 3813次阅读
    什么是<b class='flag-5'>波特率</b>?为什么要设置<b class='flag-5'>波特率</b>?

    什么是波特率波特率是如何影响CAN总线长度的?

    信息在通信通道中传输的速率被称为波特率。通俗地说,波特率是数据在网络上传输的速度/速率。这是以比特/秒表示的。因此,一秒钟内在通信网络上传输的比特数就是波特率
    的头像 发表于 08-14 15:23 2915次阅读
    什么是<b class='flag-5'>波特率</b>?<b class='flag-5'>波特率</b>是如何影响CAN总线长度的?

    什么是串口波特率?串口通信为什么要设置波特率

    在电子设备的世界中,数据是通过各种方式进行传输的。其中,串口通信是一种常见的数据传输方式,它以其简单、可靠和广泛的特性,成为了电子设备间通信的重要手段。而在串口通信中,有一个非常重要的参数——波特率
    的头像 发表于 11-03 08:21 1606次阅读
    什么是串口<b class='flag-5'>波特率</b>?串口通信为什么要设置<b class='flag-5'>波特率</b>?

    为啥要转换波特率 波特率和传输速率的关系

    对于串行多主 CAN 总线,如果波特率被称为“500000波特”,则 CAN 上的该端口每秒最多可传输500000位。
    的头像 发表于 03-06 17:38 1178次阅读
    为啥要转换<b class='flag-5'>波特率</b> <b class='flag-5'>波特率</b>和传输速率的关系