Buscar este blog

jueves, 13 de noviembre de 2014

PRACTICA # 16 INTERRUPT GPIO -> PS (Processing System)


  • El objetivo de esta práctica es utilizar la interrupción GPIO por medio del banco 0 del ARM como se muestra en la siguiente figura marcada en círculo rojo:


  • Para esta práctica utilizaremos 2 push buttom y un led. Dichos componente están identificados de acuerdo al manual de la ZedBoard en:


  • El código para el SDK en eclipse es el siguiente:

#include <stdio.h>


#include "platform.h"
#include "xparameters.h"
#include "xgpiops.h"
#include "xil_exception.h"
#include "xscugic.h"

#define SW1 50
#define SW2 51
#define LED 7

int Cnt_1=0, Cnt_2=0;

static void GpioHandler(void *CallBackRef, int Bank, u32 Status)
{
            XGpioPs* pGpioPs=(XGpioPs*)CallBackRef;

            if(Bank!= 0)     // No se porque entra al bank 1 siendo que los pines 50 y 51 estan en el bank 0 :(
            {
                        if(XGpioPs_ReadPin(pGpioPs, SW1))
                                    {
                                                 //XGpioPs_IntrDisablePin(pGpioPs,SW1);
                                                 printf("SW1 = %i\n\r",Cnt_1++);
                                                 //XGpioPs_IntrEnablePin(pGpioPs,SW1);
                                    }
                                    if(XGpioPs_ReadPin(pGpioPs, SW2))
                                    {
                                                 //XGpioPs_IntrDisablePin(pGpioPs,SW2);
                                                 printf("SW2 = %i\n\r",Cnt_2++);
                                                 //XGpioPs_IntrEnablePin(pGpioPs,SW2);
                                    }
            }
}

int main()
{
            char xStatus;

            XGpioPs PsIO; // MIO and EMIO
            XGpioPs_Config* PsIO_ConfigPtr;
            XScuGic ScuGic;
            XScuGic_Config* pScuGicCfg;


    init_platform();

    print("Test GPIO - PS\n\r");
    print("Carlos Silva - 2014\n\r");

    //PS GPIO Intialization
    PsIO_ConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
    if(PsIO_ConfigPtr == NULL)
    {
          print(" PS GPIO INIT FAILED \n\r");
          return XST_FAILURE;
    }
    xStatus = XGpioPs_CfgInitialize(&PsIO, PsIO_ConfigPtr, PsIO_ConfigPtr->BaseAddr);
    if(XST_SUCCESS != xStatus)
    {
          print(" PS GPIO INIT FAILED \n\r");
    }

    /*
    * Set the direction for the pin to be output and
    * Enable the Output enable for the LED Pin.
    */
    XGpioPs_SetDirectionPin(&PsIO, LED, 1);
    XGpioPs_SetOutputEnablePin(&PsIO, LED, 1);

    XGpioPs_SetDirectionPin(&PsIO, SW1, 0x0);
    XGpioPs_SetDirectionPin(&PsIO, SW2, 0x0);

    XGpioPs_SetIntrTypePin(&PsIO,SW1,XGPIOPS_IRQ_TYPE_EDGE_RISING);
    XGpioPs_SetIntrTypePin(&PsIO,SW2,XGPIOPS_IRQ_TYPE_EDGE_RISING);

    XGpioPs_SetCallbackHandler(&PsIO,(void*)&PsIO,GpioHandler); // solo una funcion Handler por todos los pines

    XGpioPs_IntrEnablePin(&PsIO,SW1);
    XGpioPs_IntrEnablePin(&PsIO,SW2);

    pScuGicCfg=XScuGic_LookupConfig(XPAR_SCUGIC_SINGLE_DEVICE_ID);
    XScuGic_CfgInitialize(&ScuGic,pScuGicCfg,pScuGicCfg->CpuBaseAddress);

    XScuGic_Disable(&ScuGic,52); //ug585-zynq-7000-TRM.pdf page 189 for more details

    XScuGic_SetPriorityTriggerType(&ScuGic,52,0xa0,0x3);

    XScuGic_Connect(&ScuGic,52,(Xil_ExceptionHandler)XGpioPs_IntrHandler,(void*)&PsIO);

    XScuGic_Enable(&ScuGic,52);

    Xil_ExceptionInit();
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_IRQ_INT,(Xil_ExceptionHandler)XScuGic_InterruptHandler,&ScuGic);
    Xil_ExceptionEnable();


    while(1)
    {
            XGpioPs_WritePin(&PsIO,LED,0);
            usleep(1000000);
            XGpioPs_WritePin(&PsIO,LED,1);
            usleep(1000000);
    }

    return 0;
}


  • Corriendo en el debug de Eclipse:


  • Corriendo en ZedBoard!



No hay comentarios.:

Publicar un comentario