基于Lemon ZYNQ的PS实验八 UART功能演示

本文用MIO的方式在主板上演示串口的hello world例程(适用于主板Type C 端口的UART资源)

  • 此章节内容适用于Lemon ZYNQ主板,如是其他板子请看对应板子目录
  • 本文在 vivado2018.3版本上演示

PS端串口的映射方式有两种,方式一 直接通过ZYNQ的PS专用串口的IO口。 方式二 PS端的UART 通过EMIO方式映射到任意PL端口进行引出,两种方式的效果是完全一样的。因为我们的硬件串口是接在MIO端的,所以这里我们用第一种方式来完成本次实验。

一、工程创建

工程创建的过程可以参考试验一中的内容,这里不再详细描述了。基于Lemon ZYNQ的PS实验一 GPIO之用EMIO方式点亮LED(完整图文)(芯片型号选XC7Z020CLG400-1)

二、Vivado 中的设置

1)创建一个BLOCK设计 :IP INTEGRATOR→Create Block Design,在弹出的对话框中输入设计名,最后点击“OK”,如下图所示

2) 在右侧的窗口里 ,点击加号,在选择框里搜索ZYNQ,并找到ZYNQ7 PROCESSING SYSTEM ,双击并打开

3)软件自动生成了一个 zynq的block 如下图所示,接下来要做一些相应的设置,双击下图中的ZYNQ核

4)依次在弹窗里找到DDR Configuration→DDR Controller Configuration→DDR3,在Memory Part下拉菜单中根据自己板子上的DDR来选择相应的DDR3,本实验所用到型号:MT41K256M16RE-125,数据位宽选择16bit 最后点击“OK”,如下图所示。

5)因为Lemon ZYNQ主板的PS时钟是50M的晶振输入的,所以这里需要把默认的PS输入时钟33.33M改成50M

6) 添加 uart功能: 由下图可知, 主板的UART功能接在 ZYNQ PS端的 C5脚和C8脚了,即 ZYNQ的TX是 连接MIO15,ZYNQ的RX是连接MIO14

使能UART 0 并在IO选项力 选择MIO方式,下拉菜单里选择MIO14-15

7)最后 点击“Run Block Automation”如下图所示。在弹出的选项中保持默认,点击“OK”,即可完成对ZYNQ7 Processing System的配置

8)用线将M_AXI_GP0_ACLK与 FCLK_CLK0连接起来

9)source→Design Source ,右键我们创建的BLOCK工程,点击create HDL wrapper,打包BLOCK文件并生成.v代码

10) 点击绿色箭头RUN 对代码进行编译

11) 因为这边用的是原生MIO 资源,并且没有使用任何PL的IO口,所以这边不需要额外创建管脚约束

12) 生成bit文件 :按下Generate Bitstream 完成综合以及生成bit文件(会弹出窗口要求保存 约束规则文件)

三、SDK程序编写

1)File→Export→Export hardware…,在弹出的对话框中勾选“include bitstream”,点击“OK”确认,如下图所示。

2)File→Lauch SDK,在弹出的对话框中,保存默认,点击“OK”,如下图所示。

系统将自动打开SDK开发环境

3)新建一个工程 file→new→Application Project,来新建一个“Application Project”,如下图所示。

4)在新建工程名中输入自己的工程名称(UART),点击NEXT

5) 选择一个空工程,点击完成

6) 在空工程中创建我们自己的代码

展开我们创建的工程,在src目录上右键,选择New->Source File,如下图所示:

在弹出的窗口中创建一个main.c文件

7)书写自己的代码

7.1小贴士:

在初次写PS部分的代码时,如GPIO代码 和UART代码,不知道怎么写的情况下,其实可以通过打开 BSP工程下的 system.mss文件, 然后在右边导入需要的参考例程, 然后将例程中自己需要的部分(如GPIO初始化,或者UART的写和读代码COPY到自己工程的main函数中)再进行修改。

7.2 复制 下列代码 到 main.c

#include "xparameters.h"
#include "xuartps.h"
#include "xil_printf.h"

XUartPs Uart_Ps_0;		/* The instance of the UART Driver */

int UART_init(){
	XUartPs_Config *Config;
	int Status;

	Config = XUartPs_LookupConfig(XPAR_XUARTPS_0_DEVICE_ID);
	Status = XUartPs_CfgInitialize(&Uart_Ps_0, Config, Config->BaseAddress);
	XUartPs_SetBaudRate(&Uart_Ps_0, 115200);

	return Status;
}

void UartPs_HelloWorld()
{
	u8 HelloWorld[] = "Hello World  ";
	int SentCount = 0;

	while (SentCount < (sizeof(HelloWorld) - 1)) {
		 XUartPs_Send(&Uart_Ps_0, &HelloWorld[SentCount], 1);
		SentCount++;
	}
}

int main(void)
{
	int Delay;
	UART_init();
	while(1){
		UartPs_HelloWorld();
		for (Delay = 0; Delay < 100000000; Delay++);
	}
}

我这边参考了官方的代码, 并做了一定的删减(删除了不必要的初始化验证等),将UART 0进行了初始化, 并且在helloworld的代码中,端口进行helloworld的字符串输出,反复循环。

8.代码下载验证

先对 RUN AS 的环境进行配置

在弹出的窗口中 对4个 方框都进行勾选操作,以确保每次运行都会重新启动系统,并且重新编程FPGA, 这样就不会出现下载程序debug的时候概率性不工作的问题了(不勾选情况下,板子本身运行程序的时候,再重新debug会概率性出现下载报错的情况)PS没有出现 下图对话框,可以先点绿色箭头DEBUG一下 ,再重新 点选上图RUN CONFIGURATIONS 的选项

设置好之后,选择Run As -> Launch on Hardware (System Debugger) 

经过上述操作后,串口就会正常输出数据了,此时用串口助手去查看,可以看到 系统在不停的发送 hello world字符串(串口波特率 115200)

备注 ZYNQ芯片功能非常强大,上述仅进行简单的helloworld演示, 实际串口功能还可以调用中断,调用FIFO等,这个各自自行学习尝试了。

  • 本文的完整工程下载:08_PS_UART_TEST
  • VIVADO的版本:2018.3
  • 工程创建目录:E:\Lemon_ZYNQ\SDK\08_PS_UART_TEST

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注