OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5656|回复: 3

[XILINX] Zynq AXI GPIO中断裸机与ILA调试问题

[复制链接]

6

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2020-4-2
在线时间
28 小时
发表于 2022-4-16 13:54:22 | 显示全部楼层 |阅读模式
10金钱
各位好,小弟又来了,小弟接上之前DMA传输,设置了一个AXI GPIO IP核,并且开启了中断口,之后把开启传输的标志作为条件给了AXI GPIO,但是在烧写了裸机程序以后,我在Vivado ILA中调试的GPIO中断由0变成了1且没有恢复到0,改了好多遍程序也是这个问题,想问问大家有没有碰到过这个情况?大概需要如何解决?感谢!!





  1.         //配置AXI GPIO 0,用于发出中断(输入)
  2.         XGpio_Initialize(&Gpio_Intr,AXI_GPIO_INTR_DEV_ID);
  3.         XGpio_SetDataDirection(&Gpio_Intr, 1, 0x1);
  4.         setup_gpio_intr_system(&Intc,&Gpio_Intr);
复制代码
  1. //GPIO 0中断初始化
  2. static int setup_gpio_intr_system(XScuGic * intr_inst_ptr, XGpio *gpio_inst_ptr)
  3. {
  4.         //用于返回操作结果
  5.         int status;
  6.         //用于保存所获取的中断控制器配置
  7.         XScuGic_Config *intc_config;
  8.         //根据所定义的中断控制器设备ID查找配置
  9.         intc_config = XScuGic_LookupConfig(INTC_DEVICE_ID);

  10.         if(intc_config == NULL)
  11.         {
  12.                 xil_printf("XScuGic config is not found.\n\r");
  13.                 return XST_FAILURE;
  14.         }
  15.         //根据查找到的中断控制器配置,初始化中断控制器并保存在所传入的实例中*
  16.         status = XScuGic_CfgInitialize(intr_inst_ptr,intc_config,intc_config->CpuBaseAddress);

  17.         if(status != XST_SUCCESS)
  18.         {
  19.                 xil_printf("XScuGic initialize error.\n\r");
  20.                 return XST_FAILURE;
  21.         }

  22.         //通过中断ID为TX、RX进行中断配置,设置优先级和触发类型,0x3表示设置为上升沿触发
  23.         XScuGic_SetPriorityTriggerType(intr_inst_ptr,GPIO_INTR_ID,0xA0,0x1);

  24.         //为GPIO中断绑定中断处理函数,逻辑:GPIO根据条件发出中断,随后根据中断id查找对应处理函数并执行

  25.         status = XScuGic_Connect(intr_inst_ptr,
  26.                                                          GPIO_INTR_ID,
  27. //                                                         (Xil_InterruptHandler) gpio_intr_handler,
  28.                                                          (Xil_ExceptionHandler) gpio_intr_handler,
  29.                                                          gpio_inst_ptr
  30.                                                          );

  31.         if(status != XST_SUCCESS)
  32.         {
  33.                 xil_printf("XScuGic connect RX handler error.\n\r");
  34.                 return XST_FAILURE;
  35.         }

  36.         //中断使能
  37.         XScuGic_Enable(intr_inst_ptr,GPIO_INTR_ID);

  38.         //如果硬件发生了中断
  39.         Xil_ExceptionInit();
  40.         Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
  41.                                                                 (Xil_ExceptionHandler) XScuGic_InterruptHandler,
  42.                                                                 (void *) intr_inst_ptr);
  43.         Xil_ExceptionEnable();

  44.         //使能GPIO 0中断
  45.         XGpio_InterruptEnable(gpio_inst_ptr, 0x1);
  46.         XGpio_InterruptGlobalEnable(gpio_inst_ptr);

  47.         return XST_SUCCESS;

  48. }
复制代码
  1. //GPIO 0中断处理函数
  2. static void gpio_intr_handler(void *callback)
  3. {
  4.         XGpio* gpio_inst = (XGpio*)callback;
  5.         //清除GPIO 0中断
  6.         XGpio_InterruptClear(gpio_inst, 0x1);
  7.         //禁用GPIO 0中断
  8.         XGpio_InterruptDisable(&Gpio_Intr,0x1);
  9.         //读取GPIO 0状态
  10.         u8 res;
  11.         res = XGpio_DiscreteRead(gpio_inst,1);
  12.         if(res == 1)
  13.         {
  14.                 printf("AXI GPIO 0:%d\n",res);
  15.                 //修改标志位,启动DMA传输
  16.                 IntrFlag = 1;
  17.         }
  18.         //使能GPIO 0中断
  19.         XGpio_InterruptEnable(&Gpio_Intr,0x1);
  20. }
复制代码



最佳答案

查看完整内容[请看2#楼]

没有清中断。 gpio_intr_handler() 里清除中断就变回零了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

202

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2012-10-27
在线时间
65 小时
发表于 2022-4-16 13:54:23 | 显示全部楼层
没有清中断。

gpio_intr_handler()
里清除中断就变回零了。

  1. void Gpio0Handler(void *CallbackRef)
  2. {
  3.         XGpio *GpioPtr = (XGpio *)CallbackRef;

  4.         Xil_Out32(XPAR_AXI_GPIO_3_BASEADDR,0x01);
  5.         Xil_Out32(XPAR_AXI_GPIO_3_BASEADDR,0x00);

  6.         /* Clear the Interrupt */
  7.         XGpio_InterruptClear(GpioPtr, GPIO_CHANNEL1);

  8. }
复制代码
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2022-4-17 23:14:15 | 显示全部楼层
帮顶
回复

使用道具 举报

6

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2020-4-2
在线时间
28 小时
 楼主| 发表于 2022-5-22 00:27:41 | 显示全部楼层
arm51avr 发表于 2022-4-16 13:54
没有清中断。

gpio_intr_handler()

感谢解答
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 12:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表