昨天做了一个PS端利用EMIO对LED灯进行控制的实验,在XPS进行完系统的配置导出到SDK中后,发现EMIO口的映射地址为:0xe000a000,如下图

    PS利用EMIO控制LED灯

  此时想起sheldon此前说过的xmd命令,可以利用命令行的模式,直接向地址中写入数据,从而对外设进行控制,于是,在烧写了FPGA后,没有编写应用程序,利用命令

  mwr 0xe000a000 0xFF 进行LED灯的点亮,但是结果却并没有变化,此时考虑可能是没有对PS端应用程序编写的原因。由于本工程内还添加了一个自定义的IP核同样用于LED灯的控制,即上图中的axi_gpio_0,于是利用命令 mwr 0x41200000 0xFF进行测试,结果同样灯没亮,这样断定应该为没有进行应用程序编写的原因,于是,根据教程,敲入代码。具体代码如下:

/*
 * Copyright (c) 2009-2012 Xilinx, Inc.  All rights reserved.
 *
 * Xilinx, Inc.
 * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A
 * COURTESY TO YOU.  BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS
 * ONE POSSIBLE   IMPLEMENTATION OF THIS FEATURE, APPLICATION OR
 * STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION
 * IS FREE FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE
 * FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION.
 * XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO
 * THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO
 * ANY WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
 * FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE.
 *
 */

/*
 * helloworld.c: simple test application
 *
 * This application configures UART 16550 to baud rate 9600.
 * PS7 UART (Zynq) is not initialized by this application, since
 * bootrom/bsp configures it to baud rate 115200
 *
 * ------------------------------------------------
 * | UART TYPE   BAUD RATE                        |
 * ------------------------------------------------
 *   uartns550   9600
 *   uartlite    Configurable only in HW design
 *   ps7_uart    115200 (configured by bootrom/bsp)
 */

#include <stdio.h>
#include "platform.h"
#include "xparameters.h"
#include "xuartps.h"
#include "xgpio.h"
#include "xgpiops.h"

XUartPs Uart_Ps;

int main()
{
    XUartPs_Config* Config;
    int Status;
    int SentCount = 0;
    int RecvCount = 0;
    u8 HelloZynq[] = "Hello Zynq!\n";
    u8 RecvBuf[3];

    XGpio Gpio;        /* 通过axi总线控制LED */
    XGpioPs Gpiops;    /* 通过EMIO控制LED */
    XGpioPs_Config* ConfigPtr;
    u8 axi_Gpio_Data, ps_Gpio_Data;


    init_platform();

    /* Look up the configuration in the config table and the initialize it*/
    Config = XUartPs_LookupConfig(XPAR_PS7_UART_1_DEVICE_ID);
    if(NULL == Config)
    {
        return XST_FAILURE;
    }

    Status = XUartPs_CfgInitialize(&Uart_Ps, Config, Config->BaseAddress);
    if(Status != XST_SUCCESS)
    {
        return XST_FAILURE;
    }

    /* Send Hello Zynq*/

    while(SentCount < (sizeof(HelloZynq) - 1))
    {
        SentCount += XUartPs_Send(&Uart_Ps, &HelloZynq[SentCount], 1);
    }

    /* initialize the GPIO driver */
    Status = XGpio_Initialize(&Gpio, XPAR_AXI_GPIO_0_DEVICE_ID);
    if(Status != XST_SUCCESS)
    {
        return XST_FAILURE;
    }

    /* Set the direction for all signals to be output */
    XGpio_SetDataDirection(&Gpio, 1, 0x0);

    /* Initialize the PS GPIO driver */
    ConfigPtr = XGpioPs_LookupConfig(XPAR_XGPIOPS_0_DEVICE_ID);
    Status = XGpioPs_CfgInitialize(&Gpiops, ConfigPtr, ConfigPtr->BaseAddr);
    if(Status != XST_SUCCESS)
    {
        return XST_FAILURE;
    }

    /* Set the direction for all signals to be outputs and Enable the Output enable for the LED pins */

    XGpioPs_SetDirection(&Gpiops, 2, 0xF);
    XGpioPs_SetOutputEnable(&Gpiops, 2, 0xF);

    while(1)
    {
        /* Receive data and display data */
        RecvCount = 0;
        while(RecvCount < 3)
        {
            while(!XUartPs_IsReceiveData(Config->BaseAddress));
            XUartPs_Recv(&Uart_Ps, &RecvBuf[RecvCount], 1);
            if(RecvBuf[RecvCount] == 'r')
            {
                RecvBuf[RecvCount] = '\n';
                XUartPs_Send(&Uart_Ps, &RecvBuf[RecvCount], 1);
                break;
            }
            XUartPs_Send(&Uart_Ps, &RecvBuf[RecvCount++], 1);
        }
        /* Change ASCII char to number */
            if(RecvBuf[0] >= '0' && RecvBuf[0] <= '9')
                axi_Gpio_Data = RecvBuf[0] - '0';

            if(RecvBuf[0] >= 'a' && RecvBuf[0] <= 'z')
                axi_Gpio_Data = RecvBuf[0] - 'a' + 10;

            if(RecvBuf[0] >= 'A' && RecvBuf[0] <= 'Z')
                axi_Gpio_Data = RecvBuf[0] - 'A' + 10;

            XGpio_DiscreteWrite(&Gpio, 1, axi_Gpio_Data);

            if(RecvBuf[1] >= '0' && RecvBuf[1] <= '9')
                ps_Gpio_Data = RecvBuf[1] - '0';

            if(RecvBuf[1] >= 'a' && RecvBuf[1] <= 'z')
                ps_Gpio_Data = RecvBuf[1] - 'a' + 10;

            if(RecvBuf[1] >= 'A' && RecvBuf[1] <= 'Z')
                ps_Gpio_Data = RecvBuf[1] - 'A' + 10;

            XGpioPs_Write(&Gpiops, 2, ps_Gpio_Data);

    }

    cleanup_platform();
    return 0;
}
View Code

相关文章: