cubemx串口的发送与接收_串口收发模块设计

串口收发模块设计

作者:巩文宏 公众号:数字积木

该串口收发模块有串口发送模块,串口接收模块,波特率生成模块,发送数据fifo模块,接收数据的fifo模块组成。
默认配置下,要求输入的参考时钟为50MHz,输入输出的波特率默认配置为115200.该设置体现在波特率生成模块中。
整体的设计框架如下:

f31776d17b6a850b77be9dcae90d2ffe.png


端口定义如下:端口名方向描述ClkInput主时钟,默认频率为50MHzRst_nInput复位信号,低有效RsRxInput串口接收端口RSTxOutput串口发送端口Tx_data_in[7:0]Inputtx端要发送的1字节数据Rx_data_out[7:0]outputrx端口接收到的1字节数据Tx_wenInput发送数据的写入使能信号Rx_renInput接收数据的读取使能信号Uart_irqoutput串口中断信号,为高时标志着rx接收到了有效的数据该模块的使用:发送数据
将要发送的数据放置到Tx_data_in[7:0]总线上,同时将Tx_wen置为高,下一个时钟时,该数据会写进tx_fifo中。如要发送多字节数据,则重复上述步骤,每个时钟向TX_FIFO中发送一个字节的数据,tx_fiof的默认深度为256,可以储存256个字节的数据,则一次最多可以发送256字节数据。接收数据
接收到一个字节的有效数据时,该字节立即在Rx_data_out[7:0]端口输出,此时中断信号Uart_irq为高时,读取输出端口的数据,同时将Rx_ren置一个时钟的高电平即可 。 。1,波特率计数模块在波特率生成模块中,生成发送和接收数据的采样时钟,该采样时钟为波特率的16倍频时钟。count_reg 是分频计数器。27为波特率设置为115200时的时钟分频参数。

c9311e1bd4513b51eeae259ce00bf2c2.png


设置一个可配置参数 Baud_rate,便可以再顶层例化模块中通过该参数来改变串口的波特率。参数值和对应的波特率如下表所示。默认情况下,配置参数为6,对应的波特率设置为115200.

b5062d2cee435f0be3e74561dbda7ffc.png


分频计数器的参数计算如下:
分频参数 = 主时钟频率/(波特率*16)。
设置为其他常用波特率时,该参数的值为下表:波特率计算的分频参数实际的分频参数配置参数12002604.22604124001302.1130224800651.065139600325.532543840081.481511520027.1276 2,fifo模块 tx_fifo和rx_fifo 都是例化的自定义的fifo模块。该fifo模块预留有参数接口,可以通过改变该参数来改变fifo的深度和数据宽度。
fifo模块用于临时储存串口发送和接收的数据,进行跨时钟预的数据储存。若不使用fifo来暂存数据,由于串口发送数据相对缓慢,则要连续发送多个字节的数据时,必须等待上一个字节发送完成后才能发送下一个字节,则主模块便要不断等待。使用fifo后,便可以将连续多个字节的数据一次性发送到fifo中,发送模块便会自动读取fifo中的数据进行发送,主模块便可以空闲。
接收模块的fifo同理。将接收到的多个数据暂时储存在fifo中,在读取时便可以一次性连续读取多个字节的数据。
当往fifo中写入数据时,写入的第一个字节的数据就会在R_out[7:0]端口输出。将rd信号置高时,读指针指向下一个地址,在下一个时钟将输出下一个字节数据。fifo模块的配置参数和端口定义如下:

077451124c04c91cc19feee0e2c57a75.png


定义了一个名为array_reg的内存阵列,该内存阵列的储存深度由参数AWIDTH决定,储存的深度等于 2^AWIDTH.fifo的数据宽度等于DWIDTH。

3f02a1c7018637a4c3b96c5d1f3400c4.png


在串口模块例化该fifo模块时,将AWIDTH配置为8,DWIDTH也配置为8。即例化了一个数据宽度为8,储存深度为256的fifo模块。

9d9070839f7d7d7eb57a559ac069ecc0.png

发送数据fifo:
要通过tx端口向其他串口设备发送数据,首先将要发送的数据放置到Tx_data_in[7:0]总线上,同时将Tx_wen置为高,下一个时钟时,该数据会写进tx_fifo中。如要发送多字节数据,则重复上述步骤,每个时钟向TX_FIFO中发送一个字节的数据,tx_fiof的默认深度为64,可以储存64个字节的数据,则一次最多可以发送64字节数据。当数据储存到TX_FIFO中后,fifo的空标志位(empty)不等于零,令发送模块的开发发送标志位(tx_start)等于 ~empty,则当fifo内储存有要发送的数据时,tx_start信号为1,此时,发送模块从TX_FIFO中读取一字节的数据。待这一字节的数据发送完成后,继续读取fifo内储存的下一个发送数据。直至将fifo内储存的数据全部读取完后,empty等于1,tx_start等于0,发送模块不再发送数据。 接收数据fifo:
当接收到rx端口的有效数据时,接收到的数据会临时储存在rx_fifo中,第一个字节的数据就会在Rx_data_out[7:0]端口输出。中断信号 uart_irq 时rx_fifo的空标志位的取反,此时中断信号 uart_irq 为高,标志这接收到了有效的数据。此时将Rx_ren置为高,读指针指向下一个数据的地址,在下一个时钟将输出下一个字节数据。连续将Rx_ren置为高,则可读出储存在rx_fifo中的接收到的数据,并从Rx_data_out[7:0]端口输出,直到fifo中的数据被读完。
故当tx_fifo里每接收到一个数据时,中断信号为高即标志着接收到了数据,同时在接收到的数据就在Rx_data_out[7:0]端口输出。如果每接收到一个有效数据就立即读取,则必须同时发送一个周期的Rx_ren高信号,使得读地址指针指向下一个读地址,以便当接收到新的数据时,也能立即输出。
如果等待接收多个字节的数据才读取的话,此时输出端口直接输出第一个字节的地址,当将Rx_ren信号置高时,每一个时钟输出一个接收到的数据,直到fifo中的数据被读完。3,发送模块
发送模块的端口如下:

d0b81b2f350585db76fbc4a6a518f652.png


当 信号 tx_start 为高时,该模块将此时端口 d_in[7:0]输入的数据按照预定的波特率将该字节的数据从端口tx发送出去, 波特率时钟 b_tick 指定了该模块的波特率。等到该字节数据发送完成后,tx_done信号被置为一个时钟的高电平。tx_done信号连接到tx_fifo的读端口,当tx_done为高时,fifo的读指针指向下一个地址,如果下一个地址还储存有数据,输出端口输出储存在下一个地址中的数据,同时empty信号为0,串口发送模块将继续发送数据。当下一个地址还没有数据时,empty输出为高,数据发送停止。4,接收模块接收模块的端口如下:

a7007c432cfd1eb57d2f53c8aef22d16.png


当该模块从rx端口接收到一个有效的字节数据后,rx_done会置高一个时钟,同时接收到的数据从端口dout[7:0]输出。rx_done连接到rx_fifo的写使能端口,接收到的数据将写入到rx_fifo中。5,模块测试通过电脑端串口向FPGA发送数据,FPGA端RX模块接收到数据后再将该数据通过串口在发送到电脑端。
我们连续发送了字符串“123”,在接收端也同样接收到了字符串“123”。

5744dbb1145ba829cb3713b67c1b942f.png


这是接收到的三个字符采样得到的时序图。

04b09ec049f2a08a258c61cd0820ba0b.png


如下图,当接收到一个字节数据后,uart_irq信号会置高,同时接收到的数据就立刻在rx_data_out[7:0]端口输出。然后将rx_ren信号置高一个时钟,让读地址指针指向下一个地址,则当再次接收到一个新的数据时,该数据也能马上输出。

7965abada1b0d74fe7e4b8ed94fdbfbc.png

关注公众号:“数字积木”,获取更多精彩内容,技术干货。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字段类型 sqoop_数据迁移工具Sqoop

熬过去,出众。熬不过,出局。这是最真实的人生,人都是熬过来的。Sqoop 是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,它是Hadoop环境下连接关系数据库与Hadoop存储系统的桥梁,支持多种关系型数据源和Hive、…

git 删除tag_git使用教程9pycharm 使用 tag 打标签

前言当我们的代码完成了第一阶段的需求,版本稳定后,希望能出个稳定版本。于是在 commit 后需要打个 tag 标签,也就是我们平常说的版本号,如v1.0版本本篇讲解如何使用 pycharm 打 tag 标签,并推送到 github 上&#xff…

模块 python_Python入门基础:模块基础

模块是一个文件(.py文件),包含变量,类定义语句和与特定任务相关的功能。预先装有Python的Python模块称为标准库模块。创建我们的模块我们将创建一个名为tempConversion.py的模块,该模块将值从F转换为C,反之亦然。# tempConversion…

hash地址_深入浅出一致性Hash原理

一、前言在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用。但是普通的余数hash(hash(比如用…

go语言io reader_Go语言中的io.Reader和io.Writer以及它们的实现

在使用Go语言的过程中,无论你是实现web应用程序,还是控制台输入输出,又或者是网络操作,不可避免的会遇到IO操作,使用到io.Reader和io.Writer接口。也也许对这两个接口和相关的一些接口很熟悉了,但是你脑海里…

hive 开窗函数_Hive的架构剖析

本文主要介绍Hive的架构和以及HQL的查询阶段,主要内容包括:Hive的架构架构中的相关组件介绍HQL的查询阶段Hive的架构hive的基本架构图如下图所示:相关组件介绍数据存储Hive中的数据可以存储在任意与Hadoop兼容的文件系统,其最常见…

ntr模式_ntr什么意思?求详细解释。。。

展开全部是俚语,表示环境的意32313133353236313431303231363533e59b9ee7ad9431333433623738思。1、语法:(1)可指影响人们生活的各种抽象和具体的“状况,环境”。可以接由that引导的主语从句,从句中的谓语动词一般要用虚拟式(多为动…

小程序switch内部加上文字_文字游戏大全:模拟游戏会长经营公会的小程序,你会管理公会吗?...

40000游戏爱好者已加入我们!每天推荐好玩游戏!加入我们,沐沐带你发现好游戏!《游戏会长》游戏小程序好玩吗?《游戏会长》小游戏怎么玩?只有你想不到,没有我找不到的好游戏!「良心好游…

php实现第三方邮箱登录_JavaScript实现第三方登录网站原理在这呢

点关注,不迷路,每天更新大量前端资料前端实现第三方登录之OAuth2.0协议OAuth 2.0 规定了四种获得令牌的流程。我们可以选择最适合自己的那一种,向第三方应用颁发令牌。下面就是这四种授权方式。授权码模式(authorization-code)简化模式(impli…

pfx证书密码怎么查询_网站是HTTP?10分钟变成HTTPS!域名免费添加配置SSL证书,变成https//环境...

对于小程序request请求需要https域名、navigator.geolocation定位也需要在https环境下才可以生效等问题;前端开发越来越需要https环境来来测试一下API接口和各类问题,今天来讲解一下怎么免费快速把普通的http网站配置升级成https协议。首先向大家介绍一下…

define定义的是什么类型_为什么Django 3后建议使用Field.choices枚举类型定义choices选项...

Django 3.0的主要新增功能之一是对模型字段选择的枚举。它是一种定义和约束模型Field.choices的更好方法。以前在Django模型中通常会通过定义一些“常量”和元组来定义choices,如下所示:from django.db import modelsclass Book(models.Model):UNPUBLISH…

linux卸载openjdk_Linux系列(七)——linux其他指令【rpm、yum、sudo】

1、rpm和yum1.1、介绍rpm: rpm 是由 Red Hat 公司开发的一种软件包管理方式,使用 rpm 我们可以方便的进行软件的安装、查询、卸载等工作,但是使用 rpm 命令安装 rpm 软件包,不能自己解决软件包之间的依赖性问题,需要自己一个一个去…

postgresql 客户端_一款功能强大的数据库客户端:DataGrip

前言在我们日常的程序开发中,很大一部分时间是在与数据库打交道。查数据,导数据,检查SQL执行计划,优化SQL等,是我们数据库开发工作的重要组成部分,而且很多时候我们会使用到多款数据库,如Oracle…

mysql主从同步报错_mysql主从同步报错

主从不同步,经查看发现如下报错Last_Errno: 1666​Last_Error: Error executing row event: Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOG_FORMAT STATEMENT.问题原因:主从复制&#xff…

java 等待几秒_问懵逼:请站在 JVM 角度谈谈 Java 的锁?

存在的问题自旋锁自适应自旋Java 对象的内存布局(重要)synchronized 锁升级流程偏向锁轻量级锁重量级锁可重入悲观锁(互斥锁、排他锁)《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解…

mysql 创建新用户权限_MySQL创建新用户以及权限授予

1.通过mysql数据库的user表查看用户相关信息mysql> use mysql;mysql> select host,user from user;查看用户相关信息2.创建数据库mysql> create database [databasename] default character set utf8 collate utf8_general_ci;3.创建新用户mysql> create user user…

中秋祝福网页_中秋客户维系关怀,该送客户什么礼品?

企业节日礼品是企业间或者商务伙伴之间相互传达美好情意的一种体现,无论是送领导、送员工、还是送合作伙伴,礼品定制都需要根据不同赠送对象来细心选择。如果想要礼品有创意同时又能表达企业理念,进而达到宣传推广或者品牌认知提升的效果&…

浏览器svg插件_Archer-svgs: 异步加载svg方案

Github地址: ShanaMaid/archer-svgs哇哦!无限的svgs!你可以使用archer-svgs去异步加载svg并将它缓存在localStorage里,当你再次使用已经加载过的svg时将不需要再发起http请求。将svgs从你的js-bunlde里移除,并且永远减小js-bunlde的体积。&am…

php打开网页执行即执行bat程序_CVE202011107:XAMPP任意命令执行漏洞复现

0x00简介XAMPP是一个把Apache网页服务器与PHP、Perl及MariaDB集合在一起的安裝包,允许用戶可以在自己的电脑上轻易的建立网页服务器。该软件与phpstudy类似。2020年4月1日ApacheFriends官方发布了XAMPP新版本,该更新解决了Windows Platforms CVE-2020-11…

阿里云rocketmq_云原生时代消息中间件的演进路线

作者 | 周礼(不铭) 阿里巴巴集团消息中间件架构师导读:本文整理自作者于 2020 年云原生微服务大会上的分享《云原生时代的消息中间件演进》,主要探讨了传统的消息中间件如何持续进化为云原生的消息服务。关注阿里巴巴云原生公众号…