UART 16550 IP核使用详解

AXI UART 16550是Xilinx FPGA中提供的一个UART IP核,它允许通过AXI接口与UART设备进行通信。本文描述了如何使用Xilinx的Vivado Design Suite环境中的工具来定制和生成 UART 16550 IP核,以及如何配置和使用该IP核。

1 UART 16550 IP核的使用

以下是针对如何定制IP核的步骤的简要概述:

(1)打开或新建一个工程。

(2)如下图所示,找到UART 16550 IP核。

(3) 双击IP,或从工具栏或右键菜单中选择“Customize IP”命令,打开该IP核的配置页。

在AXI UART 16550 Vivado IDE中,以下是默认选项的描述:

AXI CLK Frequency (AXI时钟频率)

这是驱动AXI UART 16550外设的系统时钟频率(以MHz为单位)。

注意:当IP与IP Integrator一起使用时,此参数会自动更新。

UART Mode (UART模式)

选择UART的模式,具体是16550模式还是16450模式。这两种模式代表了不同的UART版本和功能集。通常,16550模式提供更多的功能和更好的性能。

Use External CLK for BAUD Rate (使用外部时钟计算波特率)

勾选此选项后,AXI UART 16550会使用外部时钟来计算波特率。此时,xin端口会被外部驱动。

不勾选此选项时,UART可能会使用内部的时钟分频器来生成波特率时钟。

Enable External Receiver CLK (启用外部接收器时钟)

勾选此选项后,rclk(接收器时钟)将由外部驱动。这通常用于同步接收操作,确保数据在正确的时钟边界上被采样。

(4)时钟

系统时钟(System Clock)

AXI UART 16550 IP核的异步微处理器接口是与UART的系统时钟输入同步的。这意味着UART的所有内部操作,如数据发送、接收、波特率生成等,都是基于这个系统时钟来进行的。系统时钟(通常标记为S_AXI_ACLK或类似的名称)的频率是UART操作的基础。

XIN时钟(XIN Clock)

如下图所示,在选择了Use  External CLK for BAUD Rate选项时,IP核会出现Xin时钟引脚。

如果xin输入被外部驱动(即使用外部时钟源),那么这个外部时钟(XIN时钟)必须满足特定的要求。特别是,它必须小于或等于系统时钟的一半(即 xin ≤ (S_AXI_ACLK/2))。这个要求是AXI UART 16550 IP核正确运行的必要条件。

这个限制的原因是UART内部的一些操作(如波特率生成器)需要在一个时钟周期内完成特定的任务。如果XIN时钟太快(即超过系统时钟的一半),UART可能无法在一个时钟周期内完成这些任务,从而导致数据丢失或错误。

(5)复位

AXI UART 16550 IP核使用s_axi_aresetn信号进行复位操作,并且该信号是低电平有效的。

2 编程序列

以下是使用AXI UART 16550 IP核时配置为16550模式的一般步骤:

(1)指定异步数据通信交换的格式

例如:写入线控制寄存器来设置数据位(5、6、7或8)、打开奇偶校验并选择偶校验或奇校验、设置传输的停止位数。

通过编程线控制寄存器(Line Control Register)来设置除数锁存访问位(Divisor latch access bit)。

(2)激活中断

向中断使能寄存器(Interrupt Enable register)写入值,以允许特定的中断条件(如数据接收、发送缓冲区空等)生成中断。

(3)配置FIFO

写FIFO控制寄存器(FIFO Control register)以启用FIFOs、清除FIFOs和设置接收FIFO(RCVR FIFO)的触发级别。

(4)设置UART波特率

写除数锁存(Divisor Latch),首先写入最低有效字节,然后写入最高有效字节,以正确设置UART的波特率。

(5)处理中断

当AXI UART 16550触发中断时,您的软件必须读取相关的寄存器(如接收缓冲区寄存器),处理数据,并清除中断标志。

3.1 16550模式下的编程序列

设置目标:

波特率:56kbps

系统时钟:100Mhz

使能FIFO接收缓冲区FIFO

异步数据传输格式:8数据位(data bits)、偶校验(Even parity)和2停止位(stop bits)

设置流程

(1)写0x0000_0080到线控制寄存器

设置DLAB(Divisor Latch Access Bit)位为1,允许写入Divisor Latch的值。

//假设UART的LCR寄存器地址是0x<some_address> 

uint16_t lcr_value = 0x0080; // 设置DLAB位为1

write_to_register(0x<some_address> , lcr_value); // 写入线控制寄存器
(2)写Divisor Latch以配置波特率

根据计算出的分频值设置Divisor Latch的最低有效字节(LSB)和最高有效字节(MSB)。分频器的值是通过AXI时钟频率和期望的波特率计算得出的。

divisor = (AXI CLK frequency/(16 × Baud Rate))
代码实现为:
// 假设UART的 Divisor Latch LSB和MSB的地址分别是0x<lsb_address>和0x<msb_address> 
uint8_t divisor_lsb = 0x6F; // 分频器锁存器最低有效字节 
uint8_t divisor_msb = 0x00; // 分频器锁存器最高有效字节(对于56 Kbps,可能不需要这个字节,取决于UART的具体实现) 


write_to_register(0x<lsb_address>, divisor_lsb); // 写入分频器锁存器最低有效字节 
write_to_register(0x<msb_address>, divisor_msb); // 写入分频器锁存器最高有效字节(如果需要的话)
(3)写0x0000_001F到线控制寄存器以设置数据格式
// 重新设置线控制寄存器  
uint16_t new_lcr_value = 0x001F; // 8数据位,2停止位,偶校验,DLAB=0  
write_to_register(0x<some_address>, new_lcr_value); // 写入新的线控制寄存器值
(4)启用中断
// 假设中断使能寄存器的地址是0x<ier_address> 
uint8_t ier_value = 0x11; // 启用THRE(Transmitter Holding Register Empty)和RDA(Receive Data Available)中断 
write_to_register(0x<ier_address>, ier_value); // 写入中断使能寄存器
(5)通过中断进行数据传输和接收
  • 当THRE中断触发时,意味着发送缓冲区为空,可以写入新的数据到发送保持寄存器(Transmitter Holding Register)。
  • 当RDA中断触发时,意味着接收缓冲区有新的数据可读,可以从接收缓冲区寄存器(Receiver Buffer Register)中读取数据。
// 此代码表示如何处理中断  
void uart_isr() {  
    if (is_interrupt_set(THRE_INTERRUPT)) { // 检查THRE中断是否设置  
        // 清除THRE中断标志(如果需要的话)  
        // 写入数据到Transmitter Holding Register  
    }  
  
    if (is_interrupt_set(RDA_INTERRUPT)) { // 检查RDA中断是否设置  
        // 清除RDA中断标志(如果需要的话)  
        // 从Receiver Buffer Register读取数据  
    }  
  
    // 其他中断处理...  
}

3.2 使用外部XIN时钟时16550模式下的编程序列

设置目标:

波特率:56kbps

系统时钟:100Mhz

外部xin时钟:1.8432 MHz

使能FIFO接收缓冲区FIFO

异步数据传输格式:8数据位(data bits)、偶校验(Even parity)和2停止位(stop bits)

设置流程

(1)写0x0000_0080到线控制寄存器

设置DLAB(Divisor Latch Access Bit)位为1,允许写入Divisor Latch的值。

//假设UART的LCR寄存器地址是0x<some_address> 

uint16_t lcr_value = 0x0080; // 设置DLAB位为1

write_to_register(0x<some_address> , lcr_value); // 写入线控制寄存器
(2)写Divisor Latch以配置波特率

根据计算出的分频值设置Divisor Latch的最低有效字节(LSB)和最高有效字节(MSB)。分频器的值是通过AXI时钟频率和期望的波特率计算得出的。

divisor = (AXI CLK frequency/(16 × Baud Rate))
代码实现为:
// 假设UART的 Divisor Latch LSB和MSB的地址分别是0x<lsb_address>和0x<msb_address> 
uint8_t divisor_lsb = 0x02; // 分频器锁存器最低有效字节 
uint8_t divisor_msb = 0x00; // 分频器锁存器最高有效字节(对于56 Kbps,可能不需要这个字节,取决于UART的具体实现) 


write_to_register(0x<lsb_address>, divisor_lsb); // 写入分频器锁存器最低有效字节 
write_to_register(0x<msb_address>, divisor_msb); // 写入分频器锁存器最高有效字节(如果需要的话)
(3)写0x0000_001F到线控制寄存器以设置数据格式
// 重新设置线控制寄存器  
uint16_t new_lcr_value = 0x001F; // 8数据位,2停止位,偶校验,DLAB=0  
write_to_register(0x<some_address>, new_lcr_value); // 写入新的线控制寄存器值
(4)启用中断
// 假设中断使能寄存器的地址是0x<ier_address> 
uint8_t ier_value = 0x11; // 启用THRE(Transmitter Holding Register Empty)和RDA(Receive Data Available)中断 
write_to_register(0x<ier_address>, ier_value); // 写入中断使能寄存器
(5)通过中断进行数据传输和接收
  • 当THRE中断触发时,意味着发送缓冲区为空,可以写入新的数据到发送保持寄存器(Transmitter Holding Register)。
  • 当RDA中断触发时,意味着接收缓冲区有新的数据可读,可以从接收缓冲区寄存器(Receiver Buffer Register)中读取数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[数据集][目标检测]蕃茄核桃桔子龙眼青枣5种水果检测数据集VOC+YOLO格式270张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;270 标注数量(xml文件个数)&#xff1a;270 标注数量(txt文件个数)&#xff1a;270 标注类别…

logger使用,解决中文乱码问题,重复缓存问题

目的 在模型训练过程中&#xff0c;想把控制台内容输出的内容缓存起来&#xff0c;以便后期检查使用&#xff0c;就用起了logger。用的时候遇到过中文乱码问题以及重复缓存问题&#xff08;即后面的logger对象将前面的logger对象缓存内容也缓存下来了&#xff09;。 解决方法…

SerDes系列之电路技术概述

现在的高速电路设计中&#xff0c;SerDes的应用几乎无处不在&#xff0c;如下图所示的一款SoC&#xff0c;其外设接口除了少量普通的IO&#xff0c;几乎都是SerDes专用接口&#xff0c;因此&#xff0c;电路设计中对于SerDes接口电路的熟知程度&#xff0c;几乎就决定了设计的成…

小米电脑管家-非小米电脑安装教程

​​第一步&#xff1a;去浏览器搜索小米跨终端智联官网 下载小米电脑管家 如果是小米电脑&#xff0c;直接安装就行了 这里主要讲的是不是小米电脑&#xff0c;怎么去安装&#xff1f; 不是小米电脑就需要下载免检测机型插件&#xff0c;不然安装不了的 第二步&#xff1a;…

[Algorithm][回溯][字母大小写全排列][优美的排列][N皇后]详细讲解

目录 1.字母大小写全排列1.题目链接2.算法原理详解3.代码实现 2.优美的排列1.题目链接2.算法原理详解3.代码实现 3.N 皇后1.题目链接2.算法原理详解3.代码实现 1.字母大小写全排列 1.题目链接 字母大小写全排列 2.算法原理详解 本题逻辑与子集大致相同 思路一&#xff1a;每…

STM32-08-串口

文章目录 STM32 串口1. 数据通信的基本概念2. 串口通信协议3. 串口4. 相关寄存器5. MSP回调机制6. HAL库中断回调机制7. USART/UART异步通信配置步骤8. IO引脚复用功能9. 代码实现 STM32 串口 1. 数据通信的基本概念 通信方式&#xff1a; 数据传输方向&#xff1a; 数据同…

革命性GPT-4o:重塑人机交互体验

OpenAI 发布的 GPT-4o 模型无疑是一个巨大的突破&#xff0c;特别是在其能够处理多种输入媒介&#xff08;文本、音频、图像&#xff09;并生成相应输出方面。这种能力使得人机交互更加自然和直观&#xff0c;极大地提升了 AI 的实用性和可用性。GPT-4o 的几个关键亮点包括&…

Springboot+Vue项目-基于Java+MySQL的火锅店管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

【Linux:环境变量】

环境变量一般是指在操作系统中用来指定操作系统环境的一些参数 常见的环境变量&#xff1a; PATH 指定可执行程序的搜索路径 系统级的文件&#xff1a;/etc/bashrc 用户级文件&#xff1a;~/.bashrc ~/.bash_profile HOME 指定用户的主要工作目录&#xff08;当前用…

如何下载小米壁纸到本地分享给他人

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 操作方法 📒🚥 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 你是否曾被小米主题壁纸软件中的精美壁纸所吸引,却苦于无法将其下载到本地或与朋友分享?本文将为你揭晓如何将小米壁纸下载到本地分享给他人! 🏡 演示环境 �…

UVM寄存器模型——手写Ralf问题debug

寄存器模型是UVM中至关重要的一部分&#xff0c;如果没有寄存器模型&#xff0c;那么验证平台对于DUT内寄存器的访问方式将十分有限&#xff0c;对DUT运行状态的把控也会变得更为复杂。 在验证过程中&#xff0c;scoreboard或者其他验证组件经常需要了解当前时间某个寄存器的值…

【Python】图像批量合成视频,并以文件夹名称命名合成的视频

一个文件夹中有多个子文件夹&#xff0c;子文件夹中有多张图像。如何把批量把子文件夹中的图像合成视频&#xff0c;视频名称是子文件夹的名称&#xff0c;生成的视频保存到指定文件夹&#xff0c;效果记录。 代码 import os import cv2def create_video_from_images(image_f…

位运算概述

首先 位运算这个东西在考试中十分容易考&#xff0c;所以要多多看一看位运算的相关知识&#xff0c;多刷一刷题之类的。 位运算的概念 位运算就是二进制数据进行运算的运算符。 注意&#xff1a;通常我们用二进制补码来表示&#xff0c;补码的符号位也是要参与运算的。 通常的…

番外篇 | 一文读懂卷积神经网络(CNN)的基础概念及原理

前言:Hello大家好,我是小哥谈。卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,主要用于图像识别和计算机视觉任务。本文旨在对卷积神经网络进行详细的讲解,从基本原理到实际应用,帮助读者全面了解CNN的工作原理、优势和基本组成等,以及其在现实生…

HNU-算法设计与分析-作业3

第三次作业【动态规划】 文章目录 第三次作业【动态规划】<1>算法实现题 3-1 独立任务最优解问题<2>算法实现题 3-4 数字三角形问题<3>算法实现题 3-8 最小m段和问题<4>算法实现题 3-25 m处理器问题 <1>算法实现题 3-1 独立任务最优解问题 ▲问…

巴伦电路的原理及设计

本文档是针对Appcad帮助文档及si4468等电路设计内容的整合&#xff0c;参考了其中的内容。 1.巴伦的传输线与集总电路转换简述 巴伦是一种在平衡和非平衡电路连接之间进行转换的电路。balun 一词是由 BALanced 和UNbalanced 两个词的缩写衍生而来的首字母缩写词。不平衡连接也…

svn如何远程访问?

svn&#xff08;Subversion&#xff09;是一种版本控制系统&#xff0c;广泛应用于软件开发领域。它能够追踪文件和目录的变化&#xff0c;记录每个版本的修改内容&#xff0c;并允许多人协同开发。svn的远程访问功能允许开发人员可以在不同的地点访问和管理代码&#xff0c;提…

AIGC时代已至,你准备好抓住机遇了吗?

一、行业前景 AIGC&#xff0c;即人工智能生成内容&#xff0c;是近年来人工智能领域中发展迅猛的一个分支。随着大数据、云计算、机器学习等技术的不断进步&#xff0c;AIGC已经取得了显著的成果&#xff0c;并且在广告、游戏、自媒体、教育、电商等多个领域实现了广泛应用。…

24年湖南三支一扶报名流程图及报名照片要求

24湖南三支一扶报名流程图&#xff0c;照片要求☑️ ✔️报名时间&#xff1a;5月15日9:00至5月23日17:00 ✔️报名方式 报考人员登录市州人力资源社会保障局官网、市州人事考试网等查看各地公告&#xff0c;按要求报名。 ✔️报名流程&#xff08;湖南各地市单独报名&…

EtherCAT通信特点_7

一个 EtherCAT 数据帧足以完成所有节点控制数据的发送和接收。 question&#xff1a;数据会不会超过限制&#xff1f; 一个 EtherCAT 数据帧足以完成所有节点控制数据的发送和接收&#xff0c;这种高性能的运行模式克服了前面章节描述的各种问题&#xff01; EtherCAT 主站发送…