zoukankan      html  css  js  c++  java
  • 怎么使用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产生汇编代码。

  • 相关阅读:
    uva 562
    uva 624
    hdu 3826
    CF 89 div2 A
    看视屏学编程之接口、抽象类
    看视频学编程之SQL数据库基础
    看视频学编程之WinForm
    看视频学编程之骑士飞行棋—自己做(单机版)
    看视频学编程之继承
    看视频学编程之C#中的类
  • 原文地址:https://www.cnblogs.com/dragen/p/3107810.html
Copyright © 2011-2022 走看看