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

[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.xdnf.cn/news/12129.html

相关文章:

  • ArcGIS Pro 3.4 二次开发 - 宗地
  • HarmonyOS:如何在启动框架中初始化HMRouter
  • 【前端】vue3性能优化方案
  • 【Linux】Linux基础指令1
  • RPA+AI:自动化办公机器人开发指南
  • 基于值函数的强化学习算法之Double Q-Learning详解
  • 129、QT搭建FFmpeg环境
  • vue3+ts实现百度地图鼠标绘制多边形
  • 【websocket】安装与使用
  • 在word中点击zotero Add/Edit Citation没有反应的解决办法
  • 前端js获取当前经纬度(H5/pc/mac/window都可用)
  • 腾讯云V3签名
  • php apache构建 Web 服务器
  • 【Rust宏编程】Rust有关宏编程底层原理解析与应用实战
  • 【Linux】POSIX信号量
  • uniapp运行在微信开发者工具中流程
  • 佳易王钟表手表维修养护管理系统:高效便捷的维修管理解决方案
  • 使用cephadm离线部署reef 18版并配置对接openstack
  • 传统足浴行业数字化转型:线上预约平台的技术架构与商业逻辑
  • 今日行情明日机会——20250604
  • FTP 和 SFTP 介绍及 C/C++ 实现分析
  • 如何流畅播放体育电竞赛事?
  • Web开发主流前后端框架总结
  • Java 进程大对象分析与优化指南
  • Nginx 安全设置配置
  • leetcode 455. Assign Cookies和2410. Maximum Matching of Players With Trainers
  • 双栈共享一个栈空间
  • 解决docker运行zentao 报错:ln: failed to create symbolic link ‘/opt/zbox/tmp/mysq
  • sifli 52 反馈standby待机rc10k 15秒校准起来后,底电流会变大
  • 【openEuler】openEuler通过route-eth0配置网卡启用后创建一条特定路由表