RISC-V MCU中文社区

e203 添加中断源 中断源无法使能

发表于 开源蜂鸟E203 2020-05-17 10:50:27
3
4222
0

大家好:

    硬件平台为arty a7,我们给E203添加了一个以太网外设,按照顺序把中断源设置为53号,可是发现外设的确产生了中断信号(边沿),可是plic模块的plic_ext_irq并没有被拉高。

    担心是由于添加中断的时候plic模块的修改有问题,我们直接把52号中断(IIC),接到了以太网外设的中断信号上,发现plic模块的plic_ext_irq还是没有被拉高。

    我们在对应的c程序中读了一下发现,虽然我们调用了中断使能函数,可是读回来的plic对应中断源的中断使能寄存器还是0。不知道是为什么?有人遇到同样的问题吗,PLIC中断源使能无效。

    我们最后把button 2对应的中断接口连到了以太网外设上(39号),发现这次就可以使能中断源了?真的好奇怪,现在在阅读plic_man的源码,希望能发现原因吧。最后版本的C和verilog代码。

// platform.h
#define PLIC_INT_EMAC_BASE   39  // TODO: add plic_int_emac_base
#define PLIC_NUM_INTERRUPTS 54 // TODO: change 52 to 54
// main.c
void register_plic_irqs (){

   /**************************************************************************
   * Set up the PLIC
   *
   *************************************************************************/
  PLIC_init(&g_plic,
	    PLIC_CTRL_ADDR,
	    PLIC_NUM_INTERRUPTS,
	    PLIC_NUM_PRIORITIES);


  for (int ii = 0; ii < PLIC_NUM_INTERRUPTS; ii ++){
    g_ext_interrupt_handlers[ii] = no_interrupt_handler;
  }

  g_ext_interrupt_handlers[PLIC_INT_EMAC_BASE] = emac_re_handler;
  g_ext_interrupt_handlers[PLIC_INT_DEVICE_BUTTON_1] = button_1_handler;

  PLIC_enable_interrupt (&g_plic, PLIC_INT_EMAC_BASE);
  PLIC_enable_interrupt (&g_plic, PLIC_INT_DEVICE_BUTTON_1);

  PLIC_set_priority(&g_plic, PLIC_INT_EMAC_BASE, 1);
  PLIC_set_priority(&g_plic, PLIC_INT_DEVICE_BUTTON_1, 1);

}


// e203_subsys_plic.v
wire plic_irq_i_38 = ip2intc_irpt; 



喜欢0
用户评论 (3)
  • 柳京伯

    2020-07-20 13:48:43 柳京伯 1#

    卢吉凯

    被这个问题困扰了半天,找到了原因,是蜂鸟HBird-E-SDK的一个bug导致的。在工程文件夹hbird-e-sdk/bsp/hbird-e200/drivers/plic/plic_driver.c文件里的PLIC_enable_interrupt函数,把(source >> 3)替换成((source>>5)<<2)。下面的PLIC_disable_interrupt函数也是同样的修改方式。具体原因就不细说了,有人感兴趣可以讨论下。

    谢谢提醒,看了一下plic_man.v文件,发现他们是以32为为基础的,修改的话,感觉应该把(source>>5),之后配套的source & 0x1f

  • 柳京伯

    2020-06-30 21:17:07 柳京伯 2#

    啊好棒,我去看一下。

  • 卢吉凯

    2020-06-30 21:12:39 卢吉凯 3#

    被这个问题困扰了半天,找到了原因,是蜂鸟HBird-E-SDK的一个bug导致的。在工程文件夹hbird-e-sdk/bsp/hbird-e200/drivers/plic/plic_driver.c文件里的PLIC_enable_interrupt函数,把(source >> 3)替换成((source>>5)<<2)。下面的PLIC_disable_interrupt函数也是同样的修改方式。具体原因就不细说了,有人感兴趣可以讨论下。

柳京伯

柳京伯 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板