ZYNQ研究----(2)基于开发板制作串口测试程序

硬件环境:TLZ7100开发板

软件环境:Vivado 2017.4

工程功能:(1)创建工程,加入IO控制,串口通信

                   (2)IO控制方法有MIO、EMIO、AXI总线接口

                    (3)加入串口,使用串口发送指令,控制不同的LED亮灭

暂定串口指令格式:<1,on> <1,off>

IO控制路数:

LED1   A24    PS_MIO9

LED2  C7       IO_L4P_T0_34

LED3  H8      IO_L15N_T2_DQS_34

KEY1   F24   PS_MIO0

串口 

TX  PS_MIO12

RX   PS_MIO13

 

步骤:1、创建Vivado工程,芯片选择xc7z100ffg900-2

2、创建Block Design

3、添加ZYNQ

4、更改ZYNQ配置参数

 5、DDR选择

6、点击Run Block Auto

7、点击Creat HDL Wrapper

8、点击Generate Bitstream

9、点击File->Export->Export Hardware

10、点击File->Launch SDK

11、打开SDK后,选择File->New->Application project,选择helloword例程

12、可以看到加载的系统地址分配表

同时IP对应的参数配置会自动生成xparameters.h文件,如下图,此次例化了uart1,因此此处的串口收发指向串口1

13、在main.c中加入如下代码

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"

u8 u8RecData[10] = {0,};
u8 u8Cnt = 0;

#include "xgpiops.h"
#include "sleep.h"

XGpioPs GpioPs_Init()
{
    XGpioPs_Config* GpioConfigPtr;
    XGpioPs psGpioInstancePtr;

    GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
    XGpioPs_CfgInitialize(&psGpioInstancePtr, GpioConfigPtr, GpioConfigPtr->BaseAddr);

    return psGpioInstancePtr;
}


int main()
{
    init_platform();

    static XGpioPs psGpioInstancePtr;
    int iPinNumber = 9;       //MIO9,与LED相连
    u32 uPinDirection = 0x1; //1表示输出,0表示输入

    psGpioInstancePtr = GpioPs_Init(psGpioInstancePtr);   //GPIO初始化
    XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber, uPinDirection); //MIO9配置为输出
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber, 1);   //使能MIO9

    print("UART-LED Test\n\r");

    while(1)
    {
        while(XUartPs_RecvByte(STDOUT_BASEADDRESS) != '<')
        {
            ;
        }

        u8RecData[0] = '<';
        u8Cnt = 1;


        while(1)//回车
        {
            u8RecData[u8Cnt] = XUartPs_RecvByte(STDOUT_BASEADDRESS);

            if(u8RecData[u8Cnt] == 13)
            {
                break;
            }

            u8Cnt++;
        }

        if(u8RecData[1] == '1')
        {
            if(u8RecData[2] ==',')
            {
                if(u8RecData[3] == 'o')
                {
                    if(u8RecData[4] == 'n')
                    {
                        XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1); //点亮
                    }
                    else
                    {
                        XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0); //熄灭
                    }
                }
            }
        }
    }

    cleanup_platform();
    return 0;
}

14、添加RUN->Debug configurations

15、 点击Debug,进入调试模式

16、点击Debug全速运行,在SecureCRT输入<1,on>,LED1亮,输入<1,off>,LED1灭。

 

加入EMIO

1、在Vivado中双击ZYNQ核,更改为下图所示

2、右击.bd文件,选择Creat HDL Wrapper生成顶层文件

3、 加入约束,选择

4、点击creat file,生成.xdc文件

写入

set_property PACKAGE_PIN C7 [get_ports GPIO_0_0_tri_io[0]]
set_property IOSTANDARD LVCMOS15 [get_ports GPIO_0_0_tri_io[0]]

5、点击生成bit文件

6、导入到硬件,打开SDK

7、重新加载工程,删除工程(不删除bsp和plantform)

8、创建新的app proj,选择helloword,将helloword.c更改为

#include <stdio.h>
#include "platform.h"
#include "sleep.h"
#include "xgpiops.h"
#include "xil_printf.h"

u8 u8RecData[10] = {0,};
u8 u8Cnt = 0;

XGpioPs GpioPs_Init()
{
    XGpioPs_Config* GpioConfigPtr;
    XGpioPs psGpioInstancePtr;

    GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
    XGpioPs_CfgInitialize(&psGpioInstancePtr, GpioConfigPtr, GpioConfigPtr->BaseAddr);

    return psGpioInstancePtr;
}


int main()
{
    init_platform();

    static XGpioPs psGpioInstancePtr;
    int iPinNumber = 9;       //MIO9,与LED相连
    int iPinNumber_EMIO = 54;       //EMIO0,与LED相连
    u32 uPinDirection = 0x1; //1表示输出,0表示输入

    psGpioInstancePtr = GpioPs_Init(psGpioInstancePtr);   //GPIO初始化
    XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber, uPinDirection); //MIO9配置为输出
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber, 1);   //使能MIO9

    XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber_EMIO, uPinDirection); //EMIO0配置为输出
    XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber_EMIO, 1);   //使能EMIO0

    print("UART-LED Test\n\r");

    while(1)
    {
        while(inbyte() != '<')
        {
            ;
        }

        u8RecData[0] = '<';
        u8Cnt = 1;


        while(1)//回车
        {
            u8RecData[u8Cnt] = inbyte();

            if(u8RecData[u8Cnt] == 13)
            {
                break;
            }

            u8Cnt++;
        }

        if(u8RecData[1] == '1')
        {
            if(u8RecData[2] ==',')
            {
                if(u8RecData[3] == 'o')
                {
                    if(u8RecData[4] == 'n')
                    {
                        XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1); //点亮
                        XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber_EMIO, 1);//EMIO的第0位输出1
                    }
                    else
                    {
                        XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0); //熄灭
                        XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber_EMIO, 0);//EMIO的第0位输出0
                    }
                }
            }
        }
    }

    cleanup_platform();
    return 0;
}

9、将bit文件下载至FPGA

选择Debug configurations,设置如下

10、点击debug,在SecureCRT输入<1,on>,LED1、LED2亮,输入<1,off>,LED1、LED2灭。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章