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位为1write_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位为1write_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)中读取数据。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【算法】网络图中的dfs

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、单词搜索二、黄金矿工三、不同路径 |||四、图像渲染五、岛屿数量六、岛屿的最大面积七、被围绕的区域…

SSD与HDD仍然共存,并将长期共存!

在技术快速迭代的今天&#xff0c;固态硬盘&#xff08;SSD&#xff09;与传统硬盘&#xff08;HDD&#xff09;之间的竞争一直是存储领域的一大焦点。 扩展阅读&#xff1a; HDD回暖于2024&#xff0c;与SSD决战于2028 HDD的烦恼&#xff1a;HAMR会让SMR黯然失色吗&#xff…

Github 2024-05-12 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Filament: 加速Laravel开发的完美起点 创建周期:1410 天开发语言:PHP协议类型:MIT LicenseStar数量:12228 个Fork数量:1990 次关…

电路元件伏安特性的测量

实验目的&#xff1a; 1. 掌握线性电阻、非线性电阻元件伏安特性的测量方法&#xff1b; 2. 掌握伏安测量法中测量样点的选择和绘制曲线的方法&#xff1b; 3. 学习直读式仪表和直流稳压电源等设备的使用方法。 实验原理、内容及步骤&#xff1a; 电路元件的特性一般可用该元…

前端简史之崛起:Router迁鼎

引 &#x1f4a1; Ajax 的出现&#xff0c;带来了 jQuery 时代&#xff1b;Node技术的发展&#xff0c;带来了前端工程化进阶&#xff1b;如果说前面二者是带来技术的革命&#xff0c;那么前端路由方案的多样化则带来了用户体验的升级以及项目管理的优化。 课程简介 《前端简史…

train_gpt2_fp32.cu - main

llm.c/test_gpt2_fp32.cu at master karpathy/llm.c (github.com) 源码 // ---------------------------------------------------------------------------- // main training loop int main(int argc, char *argv[]) {// read in the (optional) command line argumentsco…

C语言性能深度剖析:从底层优化到高级技巧及实战案例分析

C语言以其接近硬件的特性、卓越的性能和灵活性&#xff0c;在系统编程、嵌入式开发和高性能计算等领域中占据着举足轻重的地位。本文将深入探讨C语言性能优化的各个方面&#xff0c;包括底层原理、编译器优化、内存管理和高级编程技巧&#xff0c;并结合多个代码案例来具体分析…

6大部分,20 个机器学习算法全面汇总!!建议收藏!(上篇)

前两天有小伙伴说想要把常见算法的原理 公式汇集起来。 这样非常非常方便查看&#xff01;分为上下两篇&#xff0c;下篇地址&#xff1a; 本次文章分别从下面6个方面&#xff0c;涉及到20个算法知识点&#xff1a; 监督学习算法 无监督学习算法 半监督学习算法 强化学习…

PyQt5多线程全面系统地学习

文章目录 1. 基础知识1.1 简介1.1.1 多线程与多进程的概念多线程 (Multithreading)多进程 (Multiprocessing)1.1.2 多线程与多进程的区别1.1.3 应用场景多线程应用场景多进程应用场景 1.2 Python标准库中的线程与进程库1.2.1 threading 模块基本概念1.2.2 总结 2. PyQt5的多线程…

pytorch_trick(2) 在Jupyter初始化过程中自动加载常用包的设置方法

一、在Jupyter初始化过程中自动加载常用包的设置方法 在每一节课程的开头&#xff0c;我们都要导入常用包&#xff0c;由于这项工作重复而固定&#xff0c;因此我们也可以通过配置jupyter&#xff08;准确来说应该是ipython&#xff09;的startup文件&#xff0c;来使得每次新创…

Python函数之旅专栏(导航)

Python内置函数(参考版本:3.11.8)AELRabs( )enumerate( )len( )range( )aiter( )eval( )list( )repr( )all( )exec( )locals( )reversed( )anext( )round( )any( ) ascii( )FM  filter( )map( )S float( )max( )set( )Bformat( )memoryview( )setattr( )bin( )frozenset( )…

设计模式与软件体系结构课后练习参考答案

目录 软件设计模式第二章 创建型软件设计模式1. 工厂模式2. 生成器模式3. 单例模式 第三章 结构型软件设计模式1. 组合模式2. 适配器模式3. 外观模式4. 桥接模式 第四章 行为型软件设计模式1. 迭代器模式2. 访问者模式3. 中介者模式4. 策略模式5. 状态模式 案例分析工厂模式案例…

2010-2024年各地级市社会信用体系建设匹配DID数据

2010-2024年各地级市社会信用体系建设匹配DID数据 1、时间&#xff1a;2010-2024年 2、指标&#xff1a;行政区划代码、年份、所属省份、地区、社会信用体系建设示范区 3、范围&#xff1a;310个地级市 4、来源&#xff1a;国家发改委 5、指标解释&#xff1a; 社会信用体…

USB-OTG:1、OTG原理介绍

目录 &#x1f345;点击这里查看所有博文 随着自己工作的进行&#xff0c;接触到的技术栈也越来越多。给我一个很直观的感受就是&#xff0c;某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了&#xff0c;只有经常会用到的东西才有可能真正记…

深入剖析Tomcat(八) 载入器与打破双亲委派机制的自定义类加载器

写这篇文章让我头大了好几天&#xff0c;书中描述的内容倒是不多&#xff0c;可能也是那会Tomcat的现状。如今Tomcat发展了好多代&#xff0c;加上springboot的广泛应用&#xff0c;导致现在的类加载的步骤和Tomcat资料中描述的大相径庭。可能也是由于微服务的发展&#xff0c;…

Ubuntu 安装 eclipse 的详细过程及工程创建和编译配置

目录 一、安装环境二、下载依赖 java jdk三、下载 eclipse四、安装4.1 java 环境4.2 eclipse 安装4.3 打开 eclipse 五、配置 eclipse5.1 新建 C 工程5.2 工具链 配置5.3 头文件路径5.4 链接库5.5 编译 一、安装环境 Ubuntu 版本&#xff1a;22.04.3 位数&#xff1a;64-bit 二…

CRWU凯斯西储大学轴承数据,12k频率,十分类

CRWU凯斯西储大学轴承数据&#xff0c;12k频率&#xff0c;十分类。 from torch.utils.data import Dataset, DataLoader from scipy.io import loadmat import numpy as np import os from sklearn import preprocessing # 0-1编码 from sklearn.model_selection import Str…

基于HTML5和CSS3搭建一个Web网页(一)

倘若代码中有任何问题或疑问&#xff0c;欢迎留言交流~ 网页描述 创建一个包含导航栏、主内容区域和页脚的响应式网页。 需求: 导航栏: 在页面顶部创建一个导航栏&#xff0c;包含首页、关于我们、服务和联系我们等链接。 设置导航栏样式&#xff0c;包括字体、颜色和背景颜…

Unity | Spine动画动态加载

一、准备工作 Spine插件及基本知识可查看这篇文章&#xff1a;Unity | Spine动画记录-CSDN博客 二、Spine资源动态加载 1.官方说明 官方文档指出不建议这种操作。但spine-unity API允许在运行时从SkeletonDataAsset或甚至直接从三个导出的资产实例化SkeletonAnimation和Skel…

使用JasperReport工具,生成报表模版,及通过JavaBean传参,常见问题及建议

1.下载JasperReport工具 下载地址:社区版 - Jaspersoft 社区 邮箱:lorettepatri.ckoa5434gmail.com 密码:Zx123456. 2.工具使用方法注意 1.一次参数需要在左下角Parameters中新建,直接拖转右上角的TextField不会自动新建参数,到头来还是要在Parameters中新建 2.循环参数需…