怎么使用ZYNQ PL的GPIO外设

如何在PL部分生成一个GPIO实例,并且在SDK中使用API调用相关硬件?

 

XGpio Gpio;

    Status = XGpio_Initialize(&Gpio, XPAR_AXI_GPIO_0_DEVICE_ID);

if (Status != XST_SUCCESS) {

        return XST_FAILURE;

    }

    XGpio_SetDataDirection(&Gpio, 1, 0x0);

XGpio_DiscreteWrite(&Gpio,1,0x0f);

由于C语言是面向结构的语言,在这里我们可以看到,为了维护XGPIO这样一个对象,我们在调用XGpio_Initialize/XGpio_SetDataDirection/XGpio_DiscreteWrite等函数时都要传入一个对象的结构体,用来表示当前的操作指向对象,如果这些代码用C++编写的话,那我们在实例化这个对象时,只需要指定是哪个实例,此后的所有的调用都不再需要指定对象,因为这些数据都会由对象来维护。

XPAR_AXI_GPIO_0_DEVICE_ID是文件xparameters.h中的一个宏定义:

/* Definitions for driver GPIO */

#define XPAR_XGPIO_NUM_INSTANCES 1

/* Definitions for peripheral AXI_GPIO_0 */

#define XPAR_AXI_GPIO_0_BASEADDR 0x41200000

#define XPAR_AXI_GPIO_0_HIGHADDR 0x4120FFFF

#define XPAR_AXI_GPIO_0_DEVICE_ID 0

#define XPAR_AXI_GPIO_0_INTERRUPT_PRESENT 0

#define XPAR_AXI_GPIO_0_IS_DUAL 0

这个文件是由EDK自动产生的,根本当前的硬件配置自动生成的,(具体怎么生成?)

上面的宏定义其实就是对应我们在XPS中添加的一个AXI_GPIO_0外设,所以通过传递这个参数,我们就使用XGpio_Initialize函数来得到这个外设的结构体。

XGpio_SetDataDirection设定GPIO的方向,XGpio_DiscreteWrite用于向这个对象写入数据,第2个参数是指定通道,由于PL部分的GPIO2个通道,所以这里的1表明是指定的通道1

 

在点亮PL系统的LED时出现了下面一个笔误,也许是较长时间没有写代码的原因,在调用的DELAY函数前面竟然加了一个VOID,这个运行时就没有出现延时效果,不知道为什么?    

while(1)

    {

        XGpio_DiscreteWrite(&Gpio,1,0x0);

        void delay();

        XGpio_DiscreteWrite(&Gpio,1,0x7);

        void delay();

    }

为了测试这种写法中的DELAY有没有运行,我在VS2008中新建了一个WINDOWS CONSOLE程序,测试代码如下:

    while(1)

    {

        printf("hello1");

        void delay();

        printf("hello2");

        void delay();

    }

发现"HELLO1"和"HELLO2"都有正常输出,但是DELAY函数根本没有执行,在单步调试时VS自动跳过。

查看汇编代码如下:

while(1)

00FE13CE mov eax,1

00FE13D3 test eax,eax

00FE13D5 je wmain+57h (0FE1407h)

    {

        printf("hello1");

00FE13D7 mov esi,esp

00FE13D9 push offset string "hello1" (0FE5744h)

00FE13DE call dword ptr [__imp__printf (0FE82BCh)]

00FE13E4 add esp,4

00FE13E7 cmp esi,esp

00FE13E9 call @ILT+325(__RTC_CheckEsp) (0FE114Ah)

        void delay();

        printf("hello2");

00FE13EE mov esi,esp

00FE13F0 push offset string "hello2" (0FE573Ch)

00FE13F5 call dword ptr [__imp__printf (0FE82BCh)]

00FE13FB add esp,4

00FE13FE cmp esi,esp

00FE1400 call @ILT+325(__RTC_CheckEsp) (0FE114Ah)

        void delay();

    }

可以看出,根本就没有给VOID DELAY产生汇编代码。

原文地址:https://www.cnblogs.com/dragen/p/3107810.html