- 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;
}
No hay comentarios.:
Publicar un comentario