[X]关闭

[米联客-XILINX-H3_CZ08_7100] LINUX驱动篇连载-14 PL UART-Lite实验

文档创建者:LINUX课程
浏览次数:390
最后更新:2024-09-10
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-SOC » 2_LINUX应用开发
本帖最后由 LINUX课程 于 2024-9-11 10:40 编辑

软件版本:vitis2021.1(vivado2021.1)
操作系统:WIN10 64bit
硬件平台:适用XILINX Z7/ZU系列FPGA
登录“米联客”FPGA社区-www.uisrc.com视频课程、答疑解惑!

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 系统框图
image.jpg
3 AXI-UartLite IP概述
image.jpg
3.1 特性
-AXI-Lite接口接到MPSOC
-全双工模式
-16个字符的发送和接收fifo
-可配置的数据位宽5~8bits
-可配置奇偶校验或无校验
-波特率可配置
3.2 寄存器概述
image.jpg
1:RX FIFO寄存器(offset=0h)
image.jpg
image.jpg
2:TX FIFO寄存器(offset=04h)
image.jpg
image.jpg
3:CTRL_REG控制寄存器(offset=0CH)
image.jpg
image.jpg
4:STAT_REG控制寄存器(offset=08H)
image.jpg
image.jpg
4 硬件电路分析
本实验需要使用FEP-BASE功能拓展卡
注意:MZ7035使用的FEP扩展IO默认是3.3V,所以默认选择3.3V 的BASE卡完成本实验。
image.jpg
UART_TXD为CP2104的发送所以接到代码的RX
UART_RXD为CP2104的接收所以接到代码的TX
image.jpg
5 搭建SOC系统工程
详细的搭建过程这里不再重复,对于初学读者如果还不清楚如何创建SOC工程的,请学习“01Vitis Soc开发入门”这篇文章。
5.1 SOC系统工程
image.jpg
1:中断和复位设置
image.jpg
image.jpg
2:设置AXI HPM Master接口
对于低速的设置LPD低功率域接口
image.jpg
3:设置PL时钟
image.jpg
4:UART-Lite IP
image.jpg
5.2 设置AXI外设地址分配
只要添加的AXI总线外设都要正确分配地址,这一步不能遗漏。
image.jpg
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平台。
image.jpg
5:打开vitis,并添加设备树模板。
6:创建工程文件,选择device tree创建,创建完成后编译工程。
7:获得设备树以及启动文件,打开虚拟机将文件拷贝到开发包的指定位置。
5.4 设备树修改及系统编译
1:设备树修改
对应的设备树文件在对应demo的soc_dts文件夹内,新手请直接使用而非自行修改。若要自行修改,则修改主要体现在增加pl节点上,分为两步。
在aliases里添加pl串口位置:
1725938331626.jpg
添加pl串口节点,即pl.dtsi里的内容:
image.jpg
2:编译烧录系统
拷贝上一步写好的设备树到指定路径,拷贝其他文件后,编译uboot,编译kernel,制作镜像并烧录系统。具体步骤参考[米联客-XILINX-H3_CZ08_7100] LINUX基础篇连载-04 vitis移植Ubuntu实现二次开发”
6 程序分析
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <fcntl.h>
  4. #include <termios.h>

  5. int main(int argc, char **argv)
  6. {
  7.     int fd = open("/dev/ttyUL0", O_RDWR | O_NOCTTY);
  8.     if (fd < 0)
  9.     {
  10.         //打开串口失败,退出
  11.         printf("open failed\n");
  12.         return -1;
  13.     }

  14.     while (1)
  15.     {
  16.         unsigned char buffer[1024] = {0};
  17.         int ret = read(fd, buffer, sizeof(buffer));
  18.         if (ret > 0)
  19.         {
  20.             printf("Printf: %s", buffer);

  21.             int n = write(fd, buffer, ret);
  22.             if (n != ret)
  23.                 printf("send failed\n");

  24.             if (buffer[0] == 81 || buffer[0] == 113)
  25.                 break;
  26.         }
  27.         else
  28.             usleep(1000 * 50);
  29.     }

  30.     close(fd);
  31.     return 0;
  32. }
复制代码
可以看到这个程序和第13章的demo几乎一样,唯一的区别为行8,打开设备变成了pl的串口。
7 演示结果
将与资料对应的demo拷贝至sd卡文件系统的/home/uisrc/内。
1725938776062.jpg
弹出sd卡插入开发板。
SD2.0 启动 01 而模式开关为 ON OFF(7100 需要先将系统烧录进qspi,然后才能从qspi启动sd卡,“[米联客-XILINX-H3_CZ08_7100] LINUX基础篇连载-04 从vitis移植Ubuntu实现二次开发”)
2f5038eb9880afd532753935815b079.jpg
将 PS 端串口线连接电脑,如果要使用 ssh 登录,将网口线同样连接至电脑,最后给开发板通电。每次重新上电,需要重新插拔 PS 串口,否则会登录失败。
1725938841004.jpg
接入12V直流电源开机。
登录板卡后,cd至demo的位置:
image.jpg
运行sudo ./pluart查看结果,密码为root:
image.jpg
这时切换到pl串口的窗口:
image.jpg
输入一些字符测试,输入完毕按回车。这里输入了test作为测试,test立马作为输出又被输出了一次:
image.jpg
这时候回到ps串口的串口可以看到printf的结果:
image.jpg
在pl串口输入Q、q或者在ps串口使用ctrl+c可退出程序。
若想自己编译,可使用gcc命令:
image.jpg
可以看到编译完多了一个文件,gcc编译的默认输出名称为a.out。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则