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

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


一、硬件环境配置

这是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,调试方法相同。


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值