Advertisement
filip710

lv4_z2

Dec 4th, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.67 KB | None | 0 0
  1. /***************************** Include Files *********************************/
  2.  
  3. #include <stdio.h>
  4. #include "xintc.h"
  5. #include "xparameters.h"
  6. #include "xgpio.h"
  7. #include "xil_exception.h"
  8.  
  9. /************************** Definicije konstanti *****************************/
  10. #define GPIO_DEVICE_ID              XPAR_PUSH_BUTTONS_4BITS_DEVICE_ID
  11. #define INTC_DEVICE_ID              XPAR_INTC_0_DEVICE_ID
  12.  
  13. #define INTC_GPIO_INTERRUPT_ID      XPAR_INTC_0_GPIO_2_VEC_ID
  14. #define GPIO_CHANEL_INTERRUPT_MASK  1
  15.  
  16. #define INTR_DELAY                  0x000FFFFF
  17. /************************** Prototipi funkcija ******************************/
  18. void GpioHandler(void *CallBackRef);
  19.  
  20. int GpioIntrInit(XIntc *IntcInstancePtr, XGpio *InstancePtr,
  21.             u16 DeviceId, u16 IntcDeviceId, u16 IntrId, u16 IntrMask);
  22.  
  23.  
  24. //***********************************************TO DO 1*************************************************//
  25. //**********************************Deklarirati varijable Gpio i Intc************************************//
  26.  XGpio Gpio;
  27.  Intc Intc;
  28.  
  29. //******************************************************************************************************//
  30.  
  31.  
  32. //deklaracija globalne varijable koja je potrebna u prekidnoj rutini
  33. static u16 GlobalIntrMask;
  34.  
  35. //***********************************************TO DO 2************************************************//
  36. //******************************Deklarirati globalnu varijablu TimerExpired ****************************//
  37.  
  38.  int volatile IntrCnt;
  39. //******************************************************************************************************//
  40.  
  41. int main(void)
  42. {
  43.     int Status;
  44.  
  45.     print(" Press button to Generate Interrupt\r\n");
  46.  
  47.     Status = XGpio_Initialize(&Gpio, GPIO_DEVICE_ID);
  48.     if (Status != XST_SUCCESS) {
  49.         return XST_FAILURE;
  50.     }
  51.  
  52.     Status = GpioIntrInit(&Intc, &Gpio, GPIO_DEVICE_ID, INTC_DEVICE_ID, INTC_GPIO_INTERRUPT_ID, GPIO_CHANEL_INTERRUPT_MASK);
  53.     if (Status != XST_SUCCESS) {
  54.         return XST_FAILURE;
  55.     }
  56.  
  57.     return XST_SUCCESS;
  58. }
  59.  
  60.  
  61.  
  62. /******************************************************************************/
  63. /**
  64. *
  65. * Inicijalizacija GPIO kontrolera i upravljača prekidima.
  66. * Funkcija prima sljedeće parametre:
  67. *
  68. * @param    IntcInstancePtr - pokazivač na varijablu tipa XIntc,
  69. * @param    InstancePtr - pokazivač na varijablu tipa XGpio,
  70. * @param    DeviceId - vrijednost konstante XPAR_<GPIO_instance>_DEVICE_ID iz datoteke xparameters.h,
  71. * @param    IntrId - vrijednost konstante XPAR_<INTC_instance>_<GPIO_instance>_IP2INTC_IRPT_INTR iz datoteke xparameters.h,
  72. * @param    IntcDeviceId - vrijednost konstante XPAR_<Intc_instance>_DEVICE_ID iz datoteke xparameters.h,
  73. * @param    IntrMask - maska GPIO kanala (broj kanala)
  74. *
  75. * @return   XST_SUCCESS ako je inicijalizacija uspješna, a u suprotno funkcija vraća XST_FAILURE
  76. *
  77. ******************************************************************************/
  78. int GpioIntrInit(XIntc *IntcInstancePtr, XGpio *InstancePtr,
  79.             u16 DeviceId, u16 IntcDeviceId, u16 IntrId, u16 IntrMask)
  80. {
  81.     int Status;
  82.  
  83.     GlobalIntrMask = IntrMask;
  84.  
  85.     //**********************************************TO DO 3************************************************//
  86.     //****Inicijalizirati upravljač prekidima, povratnu vrijednost funkcije spremiti u varijablu Status****//
  87.      Status = XIntc_Initialize(IntcInstancePtr,IntcDeviceId);
  88.     //*****************************************************************************************************//
  89.     if (Status != XST_SUCCESS) {
  90.         return Status;
  91.     }
  92.  
  93.     //Povezivanje prekidne rutine
  94.     XIntc_Connect(IntcInstancePtr, IntrId,
  95.               (Xil_ExceptionHandler)GpioHandler, InstancePtr);
  96.  
  97.  
  98.     //**********************************************TO DO 4************************************************//
  99.     //*********************************Omogućiti rad upravljača prekidima**********************************//
  100.      XIntc_Enable(IntcInstancePtr,  IntrId);
  101.     //*****************************************************************************************************//
  102.  
  103.     //***********************************************TO DO 5***********************************************//
  104.     //***Postaviti mod rada upravljača prekida, povratnu vrijednost funkcije spremiti u varijablu Status***//
  105.      XIntc_Start(IntcInstancePtr,XIN_REAL_MODE);
  106.     //*****************************************************************************************************//
  107.     if (Status != XST_SUCCESS) {
  108.         return Status;
  109.     }
  110.  
  111.     /*
  112.      * Enable the GPIO channel interrupts so that push button can be
  113.      * detected and enable interrupts for the GPIO device
  114.      */
  115.     //**********************************************TO DO 6************************************************//
  116.     //**************************Omogućiti generiranje prekida s GPIO kontrolerom***************************//
  117.      XGpio_InterruptEnable(InstancePtr,IntrMask);
  118.      XGpio_InterruptGlobalEnable(InstancePtr);
  119.  
  120.     //*****************************************************************************************************//
  121.  
  122.     //Inicijalizacija tablice iznimki
  123.     Xil_ExceptionInit();
  124.  
  125.     //Registriranje upravljača prekidima i tablice iznimki
  126.     Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
  127.              (Xil_ExceptionHandler)XIntc_InterruptHandler, IntcInstancePtr);
  128.  
  129.     //Omogućavanje nekritičnih iznimki
  130.     Xil_ExceptionEnable();
  131.  
  132.     return XST_SUCCESS;
  133. }
  134.  
  135. //Prekidna rutina
  136. void GpioHandler(void *CallbackRef)
  137. {
  138.     XGpio *GpioPtr = (XGpio *)CallbackRef;
  139.     u32 delay = 0;
  140.  
  141.     //**********************************************TO DO 7************************************************//
  142.     //******************************************Onemogućiti prekide****************************************//
  143.      XGpio_InterruptDisable(InstancePtr,IntrMask);
  144.      XIntc_Disable(IntcInstancePtr,IntrId);
  145.     //*****************************************************************************************************//
  146.  
  147.     int pushValue;
  148.  
  149.     //**********************************************TO DO 8************************************************//
  150.     //***************************************Pročitati stanje tipkala**************************************//
  151.     pushValue = XGpio_DiscreteRead(InstancePtr,1);
  152.     //*****************************************************************************************************//
  153.  
  154.     //**********************************************TO DO 9************************************************//
  155.     //*********************************Inkrementirati varijablu IntrCnt************************************//
  156.      IntrCnt++;
  157.     //*****************************************************************************************************//
  158.  
  159.     xil_printf("Interrupt Handler no. %d - button value: %d!\r\n", IntrCnt, pushValue);
  160.  
  161.     while(delay < INTR_DELAY)
  162.         delay++;
  163.  
  164.     //**********************************************TO DO 10***********************************************//
  165.     //******************************************Omogućiti prekide******************************************//
  166.      XGpio_InterruptEnable(InstancePtr,IntrMask);
  167.      XIntc_Enable(IntcInstancePtr,  IntrId);
  168.     //*****************************************************************************************************//
  169.  
  170.     //**********************************************TO DO 11***********************************************//
  171.     //*************************************Obrisati prekidne zahtjeve**************************************//
  172.      XGpio_InterruptClear(InstancePtr,IntrMask);
  173.     //*****************************************************************************************************//
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement