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滅。

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