当前位置: 首页 > news >正文

[Zynq] Zynq Linux 环境下 AXI UART Lite 使用方法详解(代码示例)

Zynq Linux 环境下 AXI UART Lite 使用方法详解

文章目录

    • Zynq Linux 环境下 AXI UART Lite 使用方法详解
      • 一、硬件环境配置
      • 二、设备树(Device Tree)配置
        • 2.1 节点基本结构
        • 2.2 属性详解
        • 2.3 完整配置示例
      • 三、Linux 驱动加载与验证
        • 3.1 设备树编译与更新
        • 3.2 驱动加载验证
      • 四、用户空间通信方法
        • 4.1 具体操作步骤:
        • 4.2 代码示例
      • 五、测试与调试
        • 5.1 测试工具安装与配置
        • 5.2 使用 minicom 测试
        • 5.3 使用 screen 测试
        • 5.4 常见问题排查


一、硬件环境配置

这是zynq开发的前提,在Vivado工程中配置 AXI UART Lite IP 核,包括添加到 Block Design 并连接至 Zynq 处理器。
说明如何设置时钟、中断和寄存器空间,并生成比特流文件,导出硬件描述文件.hdf.xsa


二、设备树(Device Tree)配置

设备树是嵌入式系统中用于描述硬件配置的重要机制。对于AXI UART Lite控制器,需要在设备树中正确配置节点才能使其正常工作。本节详细介绍如何在设备树中定义AXI UART Lite节点,包括关键参数配置和示例说明。

实际上这一步骤,如果使用petalinux工具,在petalinux-config --get-hw-description后,会自动完成,但是在这里仍然描述以下手动过程

2.1 节点基本结构

AXI UART Lite节点通常包含以下关键属性:

  • compatible: 用于匹配驱动程序的兼容性字符串
  • reg: 寄存器地址和大小
  • interrupts: 中断号配置
  • current-speed: 默认波特率设置
2.2 属性详解
  1. compatible属性

    • 必须设置为"xlnx,xps-uartlite-1.00.a"以匹配Xilinx提供的驱动程序
    • 多个兼容字符串可以用逗号分隔,提供向后兼容
  2. reg属性

    • 第一个值表示UART控制器的基地址(示例中为0x43c00000)
    • 第二个值表示寄存器映射范围大小(示例中为4KB)
    • 地址必须与硬件设计中的AXI地址映射一致
  3. interrupts属性

    • 三个值分别表示:
      • 中断类型(0表示SPI中断)
      • 中断号(示例中为29)
      • 中断触发类型(1表示高电平触发)
  4. current-speed属性

    • 设置默认通信波特率(示例中为115200)
    • 支持的标准波特率包括:9600、19200、38400、57600、115200等
2.3 完整配置示例
axi_uartlite_0: serial@43c00000 {compatible = "xlnx,xps-uartlite-1.00.a";reg = <0x43c00000 0x1000>;interrupts = <0 29 1>;current-speed = <115200>;device_type = "serial";clock-frequency = <100000000>;
};

三、Linux 驱动加载与验证

3.1 设备树编译与更新

在加载AXI-Uartlite驱动前,需要确保设备树(Device Tree)包含正确的uart节点信息。典型步骤如下:

  1. 编辑设备树源文件

    axi_uartlite_0: serial@42C00000 {compatible = "xlnx,xps-uartlite-1.00.a";reg = <0x42C00000 0x1000>;interrupt-parent = <&intc>;interrupts = <0 29 4>;current-speed = <115200>;clock-frequency = <100000000>;
    };
    
    • reg属性需与硬件地址一致
    • current-speed设置默认波特率
  2. 编译设备树

    dtc -I dts -O dtb -o system.dtb system.dts
    
  3. 更新设备树

    • 将生成的system.dtb复制到目标板的/boot目录
    • 重启系统生效
3.2 驱动加载验证

因为串口驱动linux内核自带,所以不需要再继续编写驱动。
驱动加载成功后,系统会自动注册tty设备节点:

# 检查内核日志中的UART注册信息(推荐方式)
dmesg | grep -i uart# 查看具体设备节点(示例输出)
ls /dev/ttyS*

典型成功输出示例:

[    3.450000] xuartlite 42C00000.serial: at MMIO 0x42C00000 (irq = 29, base_baud = 0) is a Xuartlite
[    3.460000] console [ttyS0] enabled

四、用户空间通信方法

在 Linux 用户空间中,可以通过标准的文件 I/O 系统调用(如 open()read()write())与 AXI UART Lite 设备进行通信。这种方法利用了 Linux 的设备文件抽象,将 UART 设备映射为 /dev 目录下的一个设备文件(通常命名为 /dev/ttyULx,其中 x 是设备编号)。

4.1 具体操作步骤:
  1. 打开设备文件:使用 open() 系统调用打开对应的设备文件,需要指定读写权限(O_RDWR)。
  2. 发送数据:使用 write() 系统调用向设备写入数据,数据可以是字符串或二进制内容。
  3. 接收数据:使用 read() 系统调用从设备读取数据,可以设置缓冲区接收返回的数据。
  4. 关闭设备:通信完成后,使用 close() 关闭设备文件。
4.2 代码示例

以下是一个完整的示例,展示如何打开设备、发送数据并关闭设备:

#include <fcntl.h>      // 文件控制定义(如 open() 的 flags)  
#include <unistd.h>     // 提供 read(), write(), close() 等系统调用  
#include <stdio.h>      // 用于打印调试信息  int main() {  // 1. 打开设备文件(假设设备为 /dev/ttyUL1)  int fd = open("/dev/ttyUL1", O_RDWR);  if (fd < 0) {  perror("Failed to open UART device");  return -1;  }  // 2. 发送数据(例如发送字符串 "Hello UART")  char tx_buffer[] = "Hello UART";  ssize_t bytes_written = write(fd, tx_buffer, sizeof(tx_buffer) - 1); // 写入 10 字节  if (bytes_written < 0) {  perror("Write failed");  close(fd);  return -1;  }  // 3. 可选:读取返回数据(假设设备会回传数据)  char rx_buffer[32];  ssize_t bytes_read = read(fd, rx_buffer, sizeof(rx_buffer));  if (bytes_read > 0) {  printf("Received: %.*s\n", (int)bytes_read, rx_buffer);  }  // 4. 关闭设备  close(fd);  return 0;  
}

五、测试与调试

介绍使用 minicomscreen 工具测试 UART 通信,以及如何排查常见问题(如波特率不匹配)。

5.1 测试工具安装与配置

在开始测试前,需要确保系统已安装必要的工具:

  • minicom:Linux下常用的串口调试工具
  • screen:轻量级终端复用工具,也可用于串口通信

安装命令示例(Ubuntu/Debian):

sudo apt install minicom screen
5.2 使用 minicom 测试

minicom 提供交互式界面,适合长时间通信测试。基本命令格式:

minicom -D [设备节点] -b [波特率]

典型示例(测试/dev/ttyUL1设备,波特率115200):

minicom -D /dev/ttyUL1 -b 115200

参数说明:

  • -D:指定串口设备路径
  • -b:设置通信波特率
  • 其他常用参数:
    • -o:不初始化Modem(直接进入终端模式)
    • -C:启用日志记录

使用流程:

  1. 连接硬件后,先确认设备节点是否存在(ls /dev/tty*
  2. 确保当前用户有串口访问权限(需加入dialout用户组)
  3. 退出时按Ctrl+A后按X,选择"退出"
5.3 使用 screen 测试

screen 更适合快速测试,命令更简洁:

screen /dev/ttyUL1 115200

退出方式:Ctrl+A然后按\,选择"yes"

5.4 常见问题排查
  1. 无数据接收

    • 检查硬件连接(TX/RX是否交叉连接)
    • 验证设备节点权限(ls -l /dev/ttyUL1
    • 确认对方设备已上电
  2. 波特率不匹配

    • 典型症状:接收乱码
    • 解决方法:
      # 尝试常见波特率
      stty -F /dev/ttyUL1 9600
      stty -F /dev/ttyUL1 115200
      stty -F /dev/ttyUL1 57600
      
    • 可使用stty -F /dev/ttyUL1查看当前配置
  3. 数据截断/丢失

    • 检查硬件流控设置(通常应禁用)
    • 测试降低波特率
    • 检查线缆质量/长度(建议不超过3米)
  4. 权限问题

    • 永久解决方案:
      sudo usermod -aG dialout $USER
      
    • 临时解决方案:
      sudo chmod 666 /dev/ttyUL1
      

备注:对于USB转串口设备,设备节点通常为/dev/ttyUSB0,调试方法相同。


研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)


相关文章:

  • opencv如何在仿射变换后保留完整图像内容并自动裁剪
  • OpenCV 图像通道的分离与合并
  • elementUI点击浏览table所选行数据查看文档
  • 解决el-select选择框右侧下拉箭头遮挡文字问题
  • vue2 , el-select 多选树结构,可重名
  • 【请关注】MySQL 碎片整理提升性能
  • 在word中点击zotero Add/Edit Citation没有反应的解决办法
  • 文档处理组件Aspose.Words 25.5全新发布 :六大新功能与性能深度优化
  • 【Android基础回顾】七:内存管理机制
  • Android7 Input(十)View 处理Input事件pipeline
  • 【android bluetooth 协议分析 02】【bluetooth hal 层详解 7】【高通蓝牙hal-读流程介绍】
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice在线编辑word文件保存数据同时保存文件
  • 第46节:多模态分类(图像+文本)
  • Java在word中指定位置插入图片。
  • 如何在电脑上轻松访问 iPhone 文件
  • LabVIEW自感现象远程实验平台
  • Java编程课(一)
  • 力扣HOT100之二分查找: 34. 在排序数组中查找元素的第一个和最后一个位置
  • Android Test2 获取系统android id
  • DeepSeek 助力 Vue3 开发:打造丝滑的日历(Calendar),日历_天气预报日历示例(CalendarView01_18)
  • 北京h5网站建设报价/什么是网络整合营销
  • 做一个网站的计划书/潍坊做网站公司
  • 提供网站建设设计/seo是什么服务
  • 网订率推广技巧/windows优化大师和360哪个好
  • 梁山做网站的公司/推广运营公司哪家好
  • 关键词优化seo/seo网站推广案例