本帖最后由 LINUX课程 于 2024-9-11 10:40 编辑
软件版本:vitis2021.1(vivado2021.1) 操作系统:WIN10 64bit 硬件平台:适用XILINX Z7/ZU系列FPGA
1 概述 工业场合RS232/RS422/RS485这种低速接口往往大量实用,但是对于ARM一般只能支持2个PS串口,如果需要更多的串口扩展起来就比较困难了。但是对于SOC来说,通过AXI-UART就能非常方便扩展串口。理论上,只要FPGA的资源够用,可以扩展任意路串口。 本文不再对UART串口通信协议做介绍,如果有不清楚的读者,可以阅读前面的实验“PS UART串口通信”。 本文实验目的: - 通过阅读pg142-axi-uartlite.pdf熟悉AXI-UartLite控制器的硬件资源(配套工程的zu_prj/06_doc路径)
- 通过VIVADO搭建axi-uartlite的SOC工程
- 编写axi-uartlite测试程序,实现类似PS-UART中断接收的环路测试程序
2 系统框图 3 AXI-UartLite IP概述 3.1 特性 -AXI-Lite接口接到MPSOC -全双工模式 -16个字符的发送和接收fifo -可配置的数据位宽5~8bits -可配置奇偶校验或无校验 -波特率可配置 3.2 寄存器概述 1:RX FIFO寄存器(offset=0h) 2:TX FIFO寄存器(offset=04h) 3:CTRL_REG控制寄存器(offset=0CH) 4:STAT_REG控制寄存器(offset=08H) 4 硬件电路分析 本实验需要使用FEP-BASE功能拓展卡 注意:MZ7035使用的FEP扩展IO默认是3.3V,所以默认选择3.3V 的BASE卡完成本实验。 UART_TXD为CP2104的发送所以接到代码的RX UART_RXD为CP2104的接收所以接到代码的TX 5 搭建SOC系统工程 详细的搭建过程这里不再重复,对于初学读者如果还不清楚如何创建SOC工程的,请学习“01Vitis Soc开发入门”这篇文章。 5.1 SOC系统工程 1:中断和复位设置 2:设置AXI HPM Master接口 对于低速的设置LPD低功率域接口 3:设置PL时钟 4:UART-Lite IP 5.2 设置AXI外设地址分配 只要添加的AXI总线外设都要正确分配地址,这一步不能遗漏。 5.3 编译并导出平台文件 以下步骤简写,有不清楚的看“[米联客-XILINX-H3_CZ08_7100] LINUX基础篇连载-04 从vitis移植Ubuntu实现二次开发”。 1:打开soc_prj内工程。 2:生成Bit文件。 3:导出到硬件: FileàExport HardwareàInclude bitstream 4:导出完成后,对应工程路径的soc_hw路径下有硬件平台文件:system_wrapper.xsa的文件。根据硬件平台文件system_wrapper.xsa来创建需要Platform平台。 5:打开vitis,并添加设备树模板。 6:创建工程文件,选择device tree创建,创建完成后编译工程。 7:获得设备树以及启动文件,打开虚拟机将文件拷贝到开发包的指定位置。 5.4 设备树修改及系统编译 1:设备树修改 对应的设备树文件在对应demo的soc_dts文件夹内,新手请直接使用而非自行修改。若要自行修改,则修改主要体现在增加pl节点上,分为两步。 在aliases里添加pl串口位置: 添加pl串口节点,即pl.dtsi里的内容: 2:编译烧录系统 拷贝上一步写好的设备树到指定路径,拷贝其他文件后,编译uboot,编译kernel,制作镜像并烧录系统。具体步骤参考“[米联客-XILINX-H3_CZ08_7100] LINUX基础篇连载-04 从vitis移植Ubuntu实现二次开发”。 6 程序分析 - #include <stdio.h>
- #include <unistd.h>
- #include <fcntl.h>
- #include <termios.h>
- int main(int argc, char **argv)
- {
- int fd = open("/dev/ttyUL0", O_RDWR | O_NOCTTY);
- if (fd < 0)
- {
- //打开串口失败,退出
- printf("open failed\n");
- return -1;
- }
- while (1)
- {
- unsigned char buffer[1024] = {0};
- int ret = read(fd, buffer, sizeof(buffer));
- if (ret > 0)
- {
- printf("Printf: %s", buffer);
- int n = write(fd, buffer, ret);
- if (n != ret)
- printf("send failed\n");
- if (buffer[0] == 81 || buffer[0] == 113)
- break;
- }
- else
- usleep(1000 * 50);
- }
- close(fd);
- return 0;
- }
复制代码可以看到这个程序和第13章的demo几乎一样,唯一的区别为行8,打开设备变成了pl的串口。 7 演示结果 将与资料对应的demo拷贝至sd卡文件系统的/home/uisrc/内。 弹出sd卡插入开发板。 SD2.0 启动 01 而模式开关为 ON OFF(7100 需要先将系统烧录进qspi,然后才能从qspi启动sd卡,“[米联客-XILINX-H3_CZ08_7100] LINUX基础篇连载-04 从vitis移植Ubuntu实现二次开发”) 将 PS 端串口线连接电脑,如果要使用 ssh 登录,将网口线同样连接至电脑,最后给开发板通电。每次重新上电,需要重新插拔 PS 串口,否则会登录失败。 接入12V直流电源开机。 登录板卡后,cd至demo的位置: 运行sudo ./pluart查看结果,密码为root: 这时切换到pl串口的窗口: 输入一些字符测试,输入完毕按回车。这里输入了test作为测试,test立马作为输出又被输出了一次: 这时候回到ps串口的串口可以看到printf的结果: 在pl串口输入Q、q或者在ps串口使用ctrl+c可退出程序。 若想自己编译,可使用gcc命令: 可以看到编译完多了一个文件,gcc编译的默认输出名称为a.out。 |