[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 属性详解
-
compatible属性:
- 必须设置为"xlnx,xps-uartlite-1.00.a"以匹配Xilinx提供的驱动程序
- 多个兼容字符串可以用逗号分隔,提供向后兼容
-
reg属性:
- 第一个值表示UART控制器的基地址(示例中为0x43c00000)
- 第二个值表示寄存器映射范围大小(示例中为4KB)
- 地址必须与硬件设计中的AXI地址映射一致
-
interrupts属性:
- 三个值分别表示:
- 中断类型(0表示SPI中断)
- 中断号(示例中为29)
- 中断触发类型(1表示高电平触发)
- 三个值分别表示:
-
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节点信息。典型步骤如下:
-
编辑设备树源文件:
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
设置默认波特率
-
编译设备树:
dtc -I dts -O dtb -o system.dtb system.dts
-
更新设备树:
- 将生成的
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 具体操作步骤:
- 打开设备文件:使用
open()
系统调用打开对应的设备文件,需要指定读写权限(O_RDWR
)。 - 发送数据:使用
write()
系统调用向设备写入数据,数据可以是字符串或二进制内容。 - 接收数据:使用
read()
系统调用从设备读取数据,可以设置缓冲区接收返回的数据。 - 关闭设备:通信完成后,使用
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;
}
五、测试与调试
介绍使用 minicom
或 screen
工具测试 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
:启用日志记录
使用流程:
- 连接硬件后,先确认设备节点是否存在(
ls /dev/tty*
) - 确保当前用户有串口访问权限(需加入
dialout
用户组) - 退出时按
Ctrl+A
后按X
,选择"退出"
5.3 使用 screen 测试
screen 更适合快速测试,命令更简洁:
screen /dev/ttyUL1 115200
退出方式:Ctrl+A
然后按\
,选择"yes"
5.4 常见问题排查
-
无数据接收
- 检查硬件连接(TX/RX是否交叉连接)
- 验证设备节点权限(
ls -l /dev/ttyUL1
) - 确认对方设备已上电
-
波特率不匹配
- 典型症状:接收乱码
- 解决方法:
# 尝试常见波特率 stty -F /dev/ttyUL1 9600 stty -F /dev/ttyUL1 115200 stty -F /dev/ttyUL1 57600
- 可使用
stty -F /dev/ttyUL1
查看当前配置
-
数据截断/丢失
- 检查硬件流控设置(通常应禁用)
- 测试降低波特率
- 检查线缆质量/长度(建议不超过3米)
-
权限问题
- 永久解决方案:
sudo usermod -aG dialout $USER
- 临时解决方案:
sudo chmod 666 /dev/ttyUL1
- 永久解决方案:
备注:对于USB转串口设备,设备节点通常为/dev/ttyUSB0
,调试方法相同。
研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)