当前位置:   article > 正文

ZYNQ 用PL按键通过中断控制PS端LED亮灭_pl到ps中断

pl到ps中断

关键词:AXI-GPIO;中断;PL按键;PS端LED

实现功能:PL端五个按键,可以触发中断,改变LED灯的亮灭状态

开发板:zedboard

  • vivado硬件连接如图:

AXI Interconnect:实际是一个开关,管理和只会axi接口之间的通信(包括一对一、一对多、多对一、多对多)

processing_system7_0:为整个处理器系统提供复位信号

axi_gpio:软核GPIO,即由FPGA搭建,而不是硬件出厂配置好的

  • 配置:

        axi_gpio:位宽1;中断使能打开;  自动连线之后位宽变为5

                        

  •  打开PL到PS中断端口,并把axi_gpio中断端口连接到z7

  •  点击左侧Open Elaborated Design分配管脚,zedboard自动分配完成。pin号如图所示,开发板右下角5个键位

  •  file-export-export hardware  包含bit文件

  • file-launch sdk

  • 新建应用工程hello world

  • 中断号  61
 #define AXI_GPIO_INTERRUPT_ID	  XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR
  • 检测到按键按下之后要先读数据  GPIOX_DATA判断按键状态,调用XGpio_DiscreteRead函数进行判断。否则灯的状态不变
if((XGpio_DiscreteRead(&AXI_Gpio, GPIO_CHANNEL1) )!= 0)
  • main.c完整代码:
  1. #include <stdio.h>
  2. #include "xparameters.h"
  3. #include "xgpiops.h"
  4. #include "xstatus.h"
  5. #include "xplatform_info.h"
  6. #include <xil_printf.h>
  7. #include "sleep.h"
  8. #include "xscugic.h"
  9. #include "xgpio.h"
  10. #define AXI_GPIO_DEVICE_ID XPAR_GPIO_0_DEVICE_ID //axi_gpio ID
  11. #define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID //PS gpio ID
  12. #define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID //中断控制器ID
  13. #define MIO7_LED 7 //ps端LED
  14. #define MIO50_KEY 51 //按键
  15. //AXI_GPIO中段号:61
  16. #define AXI_GPIO_INTERRUPT_ID XPAR_FABRIC_AXI_GPIO_0_IP2INTC_IRPT_INTR
  17. #define GPIO_CHANNEL1 1 //axi_gpio通道1
  18. XGpioPs_Config *ConfigPtr;
  19. XScuGic_Config *IntcConfig; /* Instance of the interrupt controller */
  20. XGpioPs Gpio; /* The driver instance for GPIO Device. */
  21. XGpio AXI_Gpio; /* The Instance of the GPIO Driver */
  22. static XScuGic Intc; /* The Instance of the Interrupt Controller Driver */
  23. void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpio *AXI_Gpio,
  24. u16 AXI_GpioIntrId);
  25. void IntrHandler();
  26. u32 KEY_PRESS = 0;
  27. int main()
  28. {
  29. u32 led_value = 0;
  30. printf("***AXI GPIO INTERRUPT TEST***\r\n");
  31. //根据器件id,查找PS端器件配置信息。并初始化
  32. ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
  33. XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr);
  34. // AXI_GPIO初始化
  35. XGpio_Initialize(&AXI_Gpio, AXI_GPIO_DEVICE_ID);
  36. //gpio方向设置为输出(0:输入、1:输出),并打开输出使能
  37. XGpioPs_SetDirectionPin(&Gpio, MIO7_LED, 1);
  38. XGpioPs_SetOutputEnablePin(&Gpio, MIO7_LED, 1);
  39. XGpioPs_WritePin(&Gpio, MIO7_LED, led_value); //初始化led灯,处于熄灭状态,否则第一次按键led状态不变
  40. // AXI_GPIO配置
  41. // XGpio_SetDataDirection(&AXI_Gpio, GPIO_CHANNEL1, 0x00000001); // 把最低位设置为输入
  42. XGpio_SetDataDirection(&AXI_Gpio, GPIO_CHANNEL1, 0x0000001f); // 把后5位设置为输入
  43. SetupInterruptSystem(&Intc, &AXI_Gpio, AXI_GPIO_INTERRUPT_ID);
  44. while(1)
  45. {
  46. if(KEY_PRESS)
  47. {
  48. // 判断当前按键状态,如果是按键按下,就改变LED状态
  49. if((XGpio_DiscreteRead(&AXI_Gpio, GPIO_CHANNEL1)) !=0)
  50. led_value = ~led_value;
  51. KEY_PRESS = 0;
  52. // 清除中断状态
  53. XGpio_InterruptClear(&AXI_Gpio, 0x0000001f);
  54. // 写数据到输出引脚
  55. XGpioPs_WritePin(&Gpio, MIO7_LED, led_value);
  56. // 延时消抖
  57. usleep(200000);
  58. // 重新打开使能引脚中断
  59. XGpio_InterruptEnable(&AXI_Gpio, 0x0000001f);
  60. }
  61. }
  62. return 0;
  63. }
  64. void SetupInterruptSystem(XScuGic *GicInstancePtr, XGpio *AXI_Gpio,
  65. u16 AXI_GpioIntrId)
  66. {
  67. //查找器件配置信息,并进行初始化
  68. IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
  69. XScuGic_CfgInitialize(GicInstancePtr, IntcConfig, IntcConfig->CpuBaseAddress);
  70. // 初始化ARM处理器异常句柄
  71. Xil_ExceptionInit();
  72. // 给中断异常注册一个处理程序
  73. Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, GicInstancePtr);
  74. // 使能处理器中断.Enable interrupts in the Processor.
  75. Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
  76. // 关联 中断处理函数,对中断进行处理
  77. XScuGic_Connect(GicInstancePtr, AXI_GpioIntrId, (Xil_ExceptionHandler)IntrHandler, (void *)AXI_Gpio);
  78. /* Enable the interrupt for the GPIO device.为GPIO器件使能中断 */
  79. XScuGic_Enable(GicInstancePtr, AXI_GpioIntrId);
  80. // 设置优先级和触发类型,0x1中断类型:高有效电平敏感型
  81. XScuGic_SetPriorityTriggerType(GicInstancePtr, AXI_GpioIntrId, 0xA0, 0x1);
  82. // 打开AXI_GPIO IP的中断使能
  83. XGpio_InterruptGlobalEnable(AXI_Gpio); // 打开全局中断
  84. XGpio_InterruptEnable(AXI_Gpio, 0x0000001f); // 打开通道中的信号对应中断使能
  85. // return XST_SUCCESS;
  86. }
  87. void IntrHandler()
  88. {
  89. printf("interrupt detected!\r\n");
  90. KEY_PRESS = 1;
  91. XGpio_InterruptDisable(&AXI_Gpio, 0x0000001f);
  92. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/892898
推荐阅读
相关标签
  

闽ICP备14008679号