6638K2K 的GPIO16-31号引脚触发事件后,对应的CIC寄存器不能自动置位!

目的:使用GPIO25/28/30作为输入,但检测到上升沿或下降沿时,触发中断,进入中断服务函数。

问题: 使用示波器可以看到GPIO引脚上的电平边沿,在CCS中用仿真器加载查看 GPIO引脚的状态也有变化,证明触发事件已经产生且CPU可以识别出电平变化。

             GPIO16-31号是需要经过CIC的system events。 但触发事件后, CIC(Chip Interrupt Controller')中Status Raws/Set 寄存器对应GPIO25/28/30的事件标志位并没有被正常置位 (排除被中断ISR清掉标志位的可能),这个就是问题所在。

前提: GPIO配置正常: 仿真器查看寄存器, 1、GPIO的中断使能位已经置位(打开), 2、GPIO的SET_RIS_TRIG与SET_FAL_TRIG对应的位也已经置位(上升沿、下降沿触发生效)  3,CIC对应的System Interrupt Enable Index Set 寄存器也已经置位(打开事件触发使能标志)。  4,控制产生触发事件,在GPIO的Input Data中可以看到对应GPIO位的状态变化(保证触发事件已产生)。5.手动置位CIC的System Interrupt Status Raws/ Set 寄存器可以进入中断ISR程序,手动清CIC的 System Interrupt Enable Status Enable/Clear 寄存器可以清掉对应的CIC事件标志位。(CIC对应的事件标志位可以被手动置位,进入中断ISR,也可以被清标志)。

 在确保各个寄存器配置正常的情况下, 触发GPIO事件, CIC寄存器中 Status Raws寄存器中对应的标志位就是不置位,也就进不了中断ISR了。

几个尝试验证:

1. 对GPIO0-15号进行事件触发验证,对应的system events标志位可以正常置位,(区别于16-31号,GPIO0-15号是不用经过CIC的系统事件)

2. 尝试把GPIO25/28/30设置为输出状态,手动设置寄存器切换GPIO的电平状态,手动产生触发事件,还是不能再CIC对应的事件标志位中置位。

3. GPIO中的 Data sheet相关资料太少了,且貌似存起文档不更新的问题,GPIO16-31仍未Reserved状态,但我们已经证实GPIO是可以作为输出控制,且寄存器的操作也证实了这一点。

试了几天都没能解决这个问题(事件产生后,CIC寄存器的Raws Status寄存器对应的位没有被置位),请教大神答疑解惑。

To the Best!

6 个回复

  • 文档确实没更新,GPIO16-31仍未Reserved状态,但操作和0~15低16位是一样的。

    从您的描述看,应该可以先排除GPIO管脚的设置问题,CIC事件标志位没有置1的话,看一下system event是否正确映射到了host interrupt,可以看一下下面的wiki网站关于中断的配置。
    processors.wiki.ti.com/.../Configuring_Interrupts_on_Keystone_Devices

    置顶贴里有GPIO16管脚做中断的例程可以参考。
    e2echina.ti.com/.../47664
  • 回复 Shine Zhang:

    正如上图所示:我制造了CIC的输入system event(如图标记1),打开了CIC的 Enable(如图标记2),但是CIC的事件状态寄存器没有自动置位(如图标记3)。

    而当我手动将如图标记3的事件寄存器 对应的GPIO事件状态置位时,能够正常进入我的中断ISR,由此可以证明我的中断映射正常。

    问题就出在如图标记第3的位置中,CIC事件状态寄存器没有被正确置位!!!!!

    我查看的寄存器为 Raws status 寄存器,如下图所示

    在CCS中内存查看窗口 0x02600238中 该值一直为0,但当我进行手动置位时,中断运行正常。

    所以,输入也确认过了,确实产生了GPIO25触发事件, 当输出Raws status被置位时,中断能正常执行,说明输出也找对了,现在我们该检查中间的Enable开关了。然而,我遇到了问题了。

    Enable 事件使能开关是不可读的,该寄存器描述如下:

    根据以往串口0事件 CIC148事件的配置确定我们是配置的这个寄存器,但由于读该寄存器返回0,我们无从得知我们是否成功Enable了 Gpio25对应的System events,为了保险,我又在寄存器中手动Enable了,具体是在内存 0x02600020 写入 0x000001c7这个值,作用是enable CIC455system events,对应Gpio25号事件,然而成功与否还是不得而知。

    至此,我已无计可施。 现在请教专家,烦请指导。

    To the Best!

  • 正如上图所示:我制造了CIC的输入system event(如图标记1),打开了CIC的 Enable(如图标记2),但是CIC的事件状态寄存器没有自动置位(如图标记3)。

    而当我手动将如图标记3的事件寄存器 对应的GPIO事件状态置位时,能够正常进入我的中断ISR,由此可以证明我的中断映射正常。

    问题就出在如图标记第3的位置中,CIC事件状态寄存器没有被正确置位!!!!!

    我查看的寄存器为 Raws status 寄存器,如下图所示

    在CCS中内存查看窗口 0x02600238中 该值一直为0,但当我进行手动置位时,中断运行正常。

    所以,输入也确认过了,确实产生了GPIO25触发事件, 当输出Raws status被置位时,中断能正常执行,说明输出也找对了,现在我们该检查中间的Enable开关了。然而,我遇到了问题了。

    Enable 事件使能开关是不可读的,该寄存器描述如下:

    根据以往串口0事件 CIC148事件的配置确定我们是配置的这个寄存器,但由于读该寄存器返回0,我们无从得知我们是否成功Enable了 Gpio25对应的System events,为了保险,我又在寄存器中手动Enable了,具体是在内存 0x02600020 写入 0x000001c7这个值,作用是enable CIC455system events,对应Gpio25号事件,然而成功与否还是不得而知。

    至此,我已无计可施。 现在请教专家,烦请指导。

    To the Best!

  • 回复 Shine Zhang:

    你好,我认为CIC事件标志位置1应该是独立的,只有触发事件产生后,Raws status对应的位就会置位的,即使CIC没有为对应的事件Enable(从文档得知)!! system event 与host interrupt的映射是后面的事,这个理解应该没有问题吧?!

    To the Best!

  • 回复 Shine Zhang:

    置顶帖是基于Keystone1的例程,我使用的6638是K2架构的,两者GPIO16是否可以互相兼容?置顶贴已locked,无法回复,请您说明一下。

    To the Best!