[X]关闭

MZ7030FA板子 按键配置为MIO中断无效

文档创建者:xc5407
浏览次数:5326
最后更新:2020-09-22
按键连的是板子的MIO50引脚。

发表评论已发布 3

xc5407

发表于 2020-9-22 11:01:26 | 显示全部楼层

如图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

xc5407

发表于 2020-9-22 11:04:40 | 显示全部楼层

  1. /***************************** Include Files *********************************/
  2. #include "xparameters.h"
  3. #include "xgpiops.h"
  4. #include "xscugic.h"
  5. #include "xil_exception.h"
  6. #include "xplatform_info.h"
  7. #include <xil_printf.h>
  8. #include "sleep.h"
  9. /************************** Constant Definitions *****************************/
  10. //以下常量映射到xparameters.h文件
  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 GPIO_INTERRUPT_ID   XPAR_XGPIOPS_0_INTR           //PS端GPIO中断ID
  14. //定义使用到的MIO引脚号
  15. #define KEY  50        //KEY 连接到 MIO50
  16. #define LED  7          //LED 连接到 MIO7
  17. /************************** Function Prototypes ******************************/
  18. static void intr_handler(void *callback_ref);
  19. int setup_interrupt_system(XScuGic *gic_ins_ptr, XGpioPs *gpio, u16 GpioIntrId);
  20. /**************************Global Variable Definitions ***********************/
  21. XGpioPs gpio;   //PS端GPIO驱动实例
  22. XScuGic intc;   //通用中断控制器驱动实例
  23. u32 key_press;  //KEY按键按下的标志
  24. u32 key_val;    //用于控制LED的键值
  25. /************************** Function Definitions *****************************/
  26. int main(void)
  27. {
  28.     int status;
  29.     XGpioPs_Config *ConfigPtr;     //PS 端GPIO配置信息
  30.     xil_printf("test 20200921 \r\n");
  31.     //根据器件ID查找配置信息
  32.     ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
  33.     if (ConfigPtr == NULL) {
  34.         return XST_FAILURE;
  35.     }
  36.     //初始化Gpio driver
  37.     XGpioPs_CfgInitialize(&gpio, ConfigPtr, ConfigPtr->BaseAddr);
  38.     //设置KEY所连接的MIO引脚的方向为输入
  39.     XGpioPs_SetDirectionPin(&gpio, KEY, 0);
  40.     //设置LED所连接的MIO引脚的方向为输出并使能输出
  41.     XGpioPs_SetDirectionPin(&gpio, LED, 1);
  42.     XGpioPs_SetOutputEnablePin(&gpio, LED, 1);
  43.     XGpioPs_WritePin(&gpio, LED, 0x0);
  44.     //建立中断,出现错误则打印信息并退出
  45.     status = setup_interrupt_system(&intc, &gpio, GPIO_INTERRUPT_ID);
  46.     if (status != XST_SUCCESS) {
  47.         xil_printf("Setup interrupt system failed\r\n");
  48.         return XST_FAILURE;
  49.     }
  50.     //中断触发时,key_press为TURE,延时一段时间后判断按键是否按下,是则反转LED
  51.     while (1) {
  52.         if (key_press) {
  53.             usleep(20000);
  54.             if (XGpioPs_ReadPin(&gpio, KEY) == 0) {
  55.                 key_val = ~key_val;
  56.                 XGpioPs_WritePin(&gpio, LED, key_val);
  57.             }
  58.             key_press = FALSE;
  59.             XGpioPs_IntrClearPin(&gpio, KEY);      //清除按键KEY中断
  60.             XGpioPs_IntrEnablePin(&gpio, KEY);     //使能按键KEY中断
  61.         }
  62.     }
  63.     return XST_SUCCESS;
  64. }
  65. //中断处理函数
  66. //  @param   CallBackRef是指向上层回调引用的指针
  67. static void intr_handler(void *callback_ref)
  68. {
  69.     XGpioPs *gpio = (XGpioPs *) callback_ref;
  70.     xil_printf("intr_handler detected\r\n");
  71.     //读取KEY按键引脚的中断状态,判断是否发生中断
  72.     if (XGpioPs_IntrGetStatusPin(gpio, KEY)){
  73.         key_press = TRUE;
  74.         XGpioPs_IntrDisablePin(gpio, KEY);         //屏蔽按键KEY中断
  75.     }
  76. }
  77. //建立中断系统,使能KEY按键的下降沿中断
  78. //  @param   GicInstancePtr是一个指向XScuGic驱动实例的指针
  79. //  @param   gpio是一个指向连接到中断的GPIO组件实例的指针
  80. //  @param   GpioIntrId是Gpio中断ID
  81. //  @return  如果成功返回XST_SUCCESS, 否则返回XST_FAILURE
  82. int setup_interrupt_system(XScuGic *gic_ins_ptr, XGpioPs *gpio, u16 GpioIntrId)
  83. {
  84.     int status;
  85.     XScuGic_Config *IntcConfig;     //中断控制器配置信息
  86.     //查找中断控制器配置信息并初始化中断控制器驱动
  87.     IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
  88.     if (NULL == IntcConfig) {
  89.         return XST_FAILURE;
  90.     }
  91.     status = XScuGic_CfgInitialize(gic_ins_ptr, IntcConfig,
  92.             IntcConfig->CpuBaseAddress);
  93.     if (status != XST_SUCCESS) {
  94.         return XST_FAILURE;
  95.     }
  96.     //设置并使能中断异常
  97.     Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
  98.             (Xil_ExceptionHandler) XScuGic_InterruptHandler, gic_ins_ptr);
  99.     Xil_ExceptionEnable();
  100.     //为中断设置中断处理函数
  101.     status = XScuGic_Connect(gic_ins_ptr, GpioIntrId,
  102.             (Xil_ExceptionHandler) intr_handler, (void *) gpio);
  103.     if (status != XST_SUCCESS) {
  104.         return status;
  105.     }
  106.     //使能来自于Gpio器件的中断
  107.     XScuGic_Enable(gic_ins_ptr, GpioIntrId);
  108.     //设置KEY按键的中断类型为下降沿中断
  109.     XGpioPs_SetIntrTypePin(gpio, KEY, XGPIOPS_IRQ_TYPE_EDGE_FALLING);
  110.     //使能按键KEY中断
  111.     XGpioPs_IntrEnablePin(gpio, KEY);
  112.     return XST_SUCCESS;
  113. }
复制代码

xc5407

发表于 2020-9-22 11:05:02 | 显示全部楼层

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

本版积分规则