初级会员
- 积分
- 61
- 金钱
- 61
- 注册时间
- 2020-4-2
- 在线时间
- 28 小时
|
10金钱
各位好,小弟又来了,小弟接上之前DMA传输,设置了一个AXI GPIO IP核,并且开启了中断口,之后把开启传输的标志作为条件给了AXI GPIO,但是在烧写了裸机程序以后,我在Vivado ILA中调试的GPIO中断由0变成了1且没有恢复到0,改了好多遍程序也是这个问题,想问问大家有没有碰到过这个情况?大概需要如何解决?感谢!!
- //配置AXI GPIO 0,用于发出中断(输入)
- XGpio_Initialize(&Gpio_Intr,AXI_GPIO_INTR_DEV_ID);
- XGpio_SetDataDirection(&Gpio_Intr, 1, 0x1);
- setup_gpio_intr_system(&Intc,&Gpio_Intr);
复制代码- //GPIO 0中断初始化
- static int setup_gpio_intr_system(XScuGic * intr_inst_ptr, XGpio *gpio_inst_ptr)
- {
- //用于返回操作结果
- int status;
- //用于保存所获取的中断控制器配置
- XScuGic_Config *intc_config;
- //根据所定义的中断控制器设备ID查找配置
- intc_config = XScuGic_LookupConfig(INTC_DEVICE_ID);
- if(intc_config == NULL)
- {
- xil_printf("XScuGic config is not found.\n\r");
- return XST_FAILURE;
- }
- //根据查找到的中断控制器配置,初始化中断控制器并保存在所传入的实例中*
- status = XScuGic_CfgInitialize(intr_inst_ptr,intc_config,intc_config->CpuBaseAddress);
- if(status != XST_SUCCESS)
- {
- xil_printf("XScuGic initialize error.\n\r");
- return XST_FAILURE;
- }
- //通过中断ID为TX、RX进行中断配置,设置优先级和触发类型,0x3表示设置为上升沿触发
- XScuGic_SetPriorityTriggerType(intr_inst_ptr,GPIO_INTR_ID,0xA0,0x1);
- //为GPIO中断绑定中断处理函数,逻辑:GPIO根据条件发出中断,随后根据中断id查找对应处理函数并执行
- status = XScuGic_Connect(intr_inst_ptr,
- GPIO_INTR_ID,
- // (Xil_InterruptHandler) gpio_intr_handler,
- (Xil_ExceptionHandler) gpio_intr_handler,
- gpio_inst_ptr
- );
- if(status != XST_SUCCESS)
- {
- xil_printf("XScuGic connect RX handler error.\n\r");
- return XST_FAILURE;
- }
- //中断使能
- XScuGic_Enable(intr_inst_ptr,GPIO_INTR_ID);
- //如果硬件发生了中断
- Xil_ExceptionInit();
- Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
- (Xil_ExceptionHandler) XScuGic_InterruptHandler,
- (void *) intr_inst_ptr);
- Xil_ExceptionEnable();
- //使能GPIO 0中断
- XGpio_InterruptEnable(gpio_inst_ptr, 0x1);
- XGpio_InterruptGlobalEnable(gpio_inst_ptr);
- return XST_SUCCESS;
- }
复制代码- //GPIO 0中断处理函数
- static void gpio_intr_handler(void *callback)
- {
- XGpio* gpio_inst = (XGpio*)callback;
- //清除GPIO 0中断
- XGpio_InterruptClear(gpio_inst, 0x1);
- //禁用GPIO 0中断
- XGpio_InterruptDisable(&Gpio_Intr,0x1);
- //读取GPIO 0状态
- u8 res;
- res = XGpio_DiscreteRead(gpio_inst,1);
- if(res == 1)
- {
- printf("AXI GPIO 0:%d\n",res);
- //修改标志位,启动DMA传输
- IntrFlag = 1;
- }
- //使能GPIO 0中断
- XGpio_InterruptEnable(&Gpio_Intr,0x1);
- }
复制代码
|
|