昨天做了一个PS端利用EMIO对LED灯进行控制的实验,在XPS进行完系统的配置导出到SDK中后,发现EMIO口的映射地址为:0xe000a000,如下图
此时想起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; }