当前位置: 首页 > 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,调试方法相同。


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


http://www.lqws.cn/news/153703.html

相关文章:

  • 免费wordpress模板下载
  • ES 学习总结一 基础内容
  • MPNet:旋转机械轻量化故障诊断模型详解python代码复现
  • electron主进程和渲染进程之间的通信
  • mysql跨库关联查询及视图创建
  • IDEA 开发PHP配置调试插件XDebug
  • 人脸识别技术应用备案材料详细解析
  • 【数据集】MODIS 8日合成1公里地表温度LST产品
  • 虎扑正式易主,迅雷完成收购会带来什么变化?
  • 理解电池的极化:极化内阻与欧姆内阻解析
  • 第一章:数据结构概述
  • uniapp运行在微信开发者工具中流程
  • 云服务器Xshell登录拒绝访问排查
  • std::conditional_t一个用法
  • HikariCP数据库连接池原理解析
  • 智能照明系统:具备认知能力的“光神经网络”
  • Python-内置函数
  • 【SSM】SpringBoot笔记2:整合Junit、MyBatis
  • 「Java教案」选择结构
  • 解决 Git 访问 GitHub 时的 SSL 错误
  • 软考 系统架构设计师系列知识点之杂项集萃(81)
  • 大陆4D毫米波雷达ARS548调试
  • 线程的基础知识
  • 基于eclipse进行Birt报表开发
  • MySQL间隙锁入手,拿下间隙锁面试与实操
  • python变量
  • Java-IO流之转换流详解
  • 基于51单片机的温控电机系统
  • Liunx进程替换
  • 面试心得 --- 车载诊断测试常见的一些面试问题