[X]关闭

【ZYNQ-7000开发之十二】中断:PS接收来自PL的中断

文档创建者:RZJM
浏览次数:6504
最后更新:2016-02-25
本帖最后由 RZJM 于 2016-3-11 10:01 编辑

本篇文章主要介绍外设(PL)产生的中断请求,在PS端进行处理。
在PL端通过按键产生中断,PS接受到之后点亮相应的LED.

本文所使用的开发板是Miz702(兼容zedboard)
PC 开发环境版本:Vivado 2015.2 Xilinx SDK 2015.2

搭建硬件工程建好工程后,添加ZYNQ IP双击 ZYNQ,打开Re-customize IP对话框,使能IRQ_P2P

使能UART1

点击Run Connection Automation,按照如图所示配置,点击OK

添加一个GPIO IP,按照如图所示配置,使能中断。点击Run Connection Automation

再添加一个GPIO IP,按照如图所示配置,点击OK

把axi_gpio_0的ip2intc_irpt和ZYNQ PS的 IRQ_F2P[0:0]连在一起搭建好的硬件系统连接,如图所示

生成顶层文件,点击Generate BitStream

软件工程

新建一个Hello World工程,把以下代码添加进去

  1. #include "xparameters.h"
  2. #include "xscugic.h"
  3. #include "xil_exception.h"
  4. #include "xgpio.h"
  5. // Parameter definitions
  6. #define INTC_DEVICE_ID                 XPAR_PS7_SCUGIC_0_DEVICE_ID
  7. #define LED_DEVICE_ID                 XPAR_AXI_GPIO_1_DEVICE_ID
  8. #define BTNS_DEVICE_ID                XPAR_AXI_GPIO_0_DEVICE_ID
  9. #define INTC_GPIO_INTERRUPT_ID XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR
  10. #define BTN_INT                         XGPIO_IR_CH1_MASK // This is the interrupt mask for channel one
  11. #define DELAY 100000000
  12. XGpio         LED;
  13. XGpio   BTNInst;
  14. XScuGic INTCInst;
  15. static int btn_value;
  16. //----------------------------------------------------
  17. // PROTOTYPE FUNCTIONS
  18. //----------------------------------------------------
  19. static void BTN_Intr_Handler(void *baseaddr_p);
  20. static int InterruptSystemSetup(XScuGic *XScuGicInstancePtr);
  21. static int IntcInitFunction(u16 DeviceId, XGpio *GpioInstancePtr);
  22. //----------------------------------------------------
  23. //  INTERRUPT SERVICE ROUTINE(ISR)
  24. //also know as : INTERRUPT HANDLER FUNCTION
  25. // - called by the buttons interrupt, performs push buttons read
  26. //----------------------------------------------------
  27. void BTN_Intr_Handler(void *InstancePtr)
  28. {
  29.         unsigned char led_val = 0;
  30.         // Ignore additional button presses
  31.         if ((XGpio_InterruptGetStatus(&BTNInst) & BTN_INT) !=
  32.                         BTN_INT) {
  33.                         return;
  34.         // Disable GPIO interrupts
  35.         XGpio_InterruptDisable(&BTNInst, BTN_INT);
  36.                          }
  37.         btn_value = XGpio_DiscreteRead(&BTNInst, 1);
  38.         switch (btn_value){
  39.                                 case 1:        led_val = 0x01;        break;
  40.                                 case 2:        led_val = 0x02;        break;
  41.                                 case 4:        led_val = 0x03;        break;
  42.                                 case 8:        led_val = 0x04;        break;
  43.                                 case 16:led_val = 0x05; break;
  44.                                 default:break;        }
  45.         XGpio_DiscreteWrite(&LED,1,led_val);
  46.         // Acknowledge GPIO interrupts
  47.     (void)XGpio_InterruptClear(&BTNInst, BTN_INT);
  48.     // Enable GPIO interrupts
  49.     XGpio_InterruptEnable(&BTNInst, BTN_INT);
  50. }
  51. //----------------------------------------------------
  52. // MAIN FUNCTION
  53. //----------------------------------------------------
  54. int main (void)
  55. {
  56.   int status;
  57.   // 初始化按键
  58.   status = XGpio_Initialize(&BTNInst, BTNS_DEVICE_ID);
  59.   if(status != XST_SUCCESS) return XST_FAILURE;
  60.   //初始化LED
  61.   status = XGpio_Initialize(&LED, LED_DEVICE_ID);
  62.    if(status != XST_SUCCESS) return XST_FAILURE;
  63.   // 设置按键IO的方向为输入
  64.   XGpio_SetDataDirection(&BTNInst, 1, 0xFF);
  65.   //设置LED IO的方向为输出
  66.   XGpio_SetDataDirection(&LED, 1, 0x00);
  67.   // 初始化中断控制器
  68.   status = IntcInitFunction(INTC_DEVICE_ID, &BTNInst);
  69.   if(status != XST_SUCCESS) return XST_FAILURE;
  70.   while(1){
  71.        }
  72.   return (0);
  73. }
  74. //----------------------------------------------------
  75. // INTERRUPT SETUP FUNCTIONS
  76. //----------------------------------------------------
  77. int IntcInitFunction(u16 DeviceId, XGpio *GpioInstancePtr)
  78. {
  79.         XScuGic_Config *IntcConfig;
  80.         int status;
  81.         // Interrupt controller initialization
  82.         IntcConfig = XScuGic_LookupConfig(DeviceId);
  83.         status = XScuGic_CfgInitialize(&INTCInst, IntcConfig, IntcConfig->CpuBaseAddress);
  84.         if(status != XST_SUCCESS) return XST_FAILURE;
  85.         // Call interrupt setup function
  86.         status = InterruptSystemSetup(&INTCInst);
  87.         if(status != XST_SUCCESS) return XST_FAILURE;
  88.         // Register GPIO interrupt handler
  89.         status = XScuGic_Connect(&INTCInst,
  90.                                                              INTC_GPIO_INTERRUPT_ID,
  91.                                                              (Xil_ExceptionHandler)BTN_Intr_Handler,
  92.                                                              (void *)GpioInstancePtr);
  93.         if(status != XST_SUCCESS) return XST_FAILURE;
  94.         // Enable GPIO interrupts
  95.         XGpio_InterruptEnable(GpioInstancePtr, 1);
  96.         XGpio_InterruptGlobalEnable(GpioInstancePtr);
  97.         // Enable GPIO interrupts in the controller
  98.         XScuGic_Enable(&INTCInst, INTC_GPIO_INTERRUPT_ID);
  99.         return XST_SUCCESS;
  100. }
  101. int InterruptSystemSetup(XScuGic *XScuGicInstancePtr)
  102. {
  103.         // Register GIC interrupt handler
  104.         Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
  105.                                                                       (Xil_ExceptionHandler)XScuGic_InterruptHandler,XScuGicInstancePtr);
  106.         Xil_ExceptionEnable();
  107.         return XST_SUCCESS;
  108. }
复制代码

下载好之后,按键按下可以看到相应的LED被点亮

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则