PSoC4中断异常触发

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

我碰到了一个问题,我使用PSoC4的管脚下降沿触发中断(硬件电路是小于4.5V管脚会变低),使用电源变动测试的时候,反复调整电压从9V→0V→9V,在第一次变为0V的时候我使用生成的stop函数关闭了中断,电源变动结束恢复到9V后我使用生成start函数开启中断时,会立即触发一次中断,这时候管脚状态并不是低电平,这是为什么?

配置是下面这样的,自动生成的函数是B_DET_Low_ShutDown_Stop和B_DET_Low_ShutDown_Start。

Li_Qiang_0-1643362510947.png

Li_Qiang_1-1643362540824.png

Li_Qiang_2-1643362563780.png

 

 

0 点赞
1 解答
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

这个问题在中断使能之前通过追加下列代码,已经解决了。

/* Loop to verify if pending interrupt on pin is cleared */
while((B_DET_Low_INTSTAT & B_DET_Low_MASK) == B_DET_Low_MASK)
{
/* Try to clear the interrupt on Pin_INTSTAT */
B_DET_Low_ClearInterrupt();

/* Clear Pending on ISR component as well */
B_DET_Low_ShutDown_ClearPending();
}

在原帖中查看解决方案

0 点赞
20 回复数
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

Li_Qiang_0-1643365495054.png

 

0 点赞
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

调用B_DET_Low_ShutDown_Start开启中断的时候,我很确定没有端子状态变化会触发中断,在电源变动结束后大约30s之后才调用了B_DET_Low_ShutDown_Start,在此期间我也没有做关于这个中断的处理,很奇怪,感觉像是什么操作触发了中断,但不是外部端子状态的变化。

然后我把B_DET_Low_ShutDown_Start从30s改成大约2s之后调用,这个现象就消失了。想不明白到底操作了什么会导致触发了中断呢?

0 点赞
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

看起来就是外部中断误触发了,但不知道是什么原因,有人能回答这个问题吗?

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

一种可能是你的 IO 中断标志位没有清除就直接在中断函数中调用了B_DET_Low_ShutDown_Stop()。另一种可能是 9V->0V的过程中存在抖动,导致这个下降沿实际触发了两次或者多次中断,但是你的逻辑是中断函数一旦执行就关闭该中断,此时可能在中断锁存器中还锁存这一个未经处理的中断,所以在中断再次使能的时候被锁存的中断就被送到 CPU 处做处理。 

你尝试一下在中断函数中使用一下逻辑:

isr()

{

B_DET_Low_ShutDown_Stop(); // Stop Interrupt

B_DET_Low_ShutDown_ClearPending(); // Clear Pending Interrupt

B_DET_Low_ClearInterrupt(); // Clear GPIO Interrupt Status 

......

}

0 点赞
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

我尝试过了,还是不行,还有其他可能的原因吗?

0 点赞
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

有什么接口函数可以重新初始化中断配置吗?

0 点赞
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

非常感谢,我尝试一下。

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

你整个的工程发过来我看看

0 点赞
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

不太方便发工程,有保密要求

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

你说硬件电路是小于4.5V管脚会变低,那么电压高于 4.5V时引脚为高吗?如果此时并不能确定为高,那么建议把引脚的驱动模式改为内阻上拉试试。 

另外建议你监控一下 IO 引脚上的实际波形,看是否有干扰

0 点赞
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

我用逻辑分析仪监视引脚是一直为高的,内阻上拉是不是得自己配,componet改不了这种模式。

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

组件改不了就是不支持这种驱动模式。你把 Hardware Connection 那么复选框勾掉试试看

0 点赞
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

是要这样改吗

Li_Qiang_0-1644542870807.png

 

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

是的,但是如果你选了 resistive pull up 驱动模式,那么 initial drive state 也应该配置成 High(1).

0 点赞
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

按照这个配置好像不行,改完之后,进不去中断了

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

使能内阻上拉会在 IO 内部增加一个 5K左右的上拉电阻,难道价格这个电阻之后,引脚不能再被拉低了吗? 你的引脚被驱动成低时难道是通过一个大电阻接地的?

 

0 点赞
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

我也不确定,这个电路是通过S-19110JAFH-M6T1U4芯片实现的。还有个事说明一下,我使用了两个外部中断,一个4.5V,另一个是6V,管脚分别是P1.4和P0.0,这两个应该不会互相影响吧。配置都是相同的,但是中断管脚不一样。

Li_Qiang_2-1644572111277.png

 

 

 

 

0 点赞
Vison_Zhang
Moderator
Moderator
Moderator
First comment on KBA 750 replies posted 250 sign-ins

PORT0和PORT1 两个 PORT 上的中断是不会相互影响的,但是每一个引脚内部都有一对二极管做静电防护,6V加载 P00会引起引脚内部的上钳位管导通的, 会产生电流倒灌的。

我们假设芯片是 5V 供电,你在 P0.0 上接一个 6V 的电压,那么就会出现 6V 通过 P0.0 像芯片内部倒灌电流的情况,如果该引脚上本身又没什么串阻的话,倒灌电流还会比较大,会影响芯片的正常功能甚至损坏芯片。

 

 

0 点赞
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

了解了,刚才说的有点误解了,我没有直接把6V连到P0.0管脚上,是通过一个芯片检测外部电压降到了6V或4.5V以下,然后会输出一个低电平,平时是输出3.3V的。

0 点赞
Lin_Qiang
Level 4
Level 4
5 likes given First like given 50 replies posted

这个问题在中断使能之前通过追加下列代码,已经解决了。

/* Loop to verify if pending interrupt on pin is cleared */
while((B_DET_Low_INTSTAT & B_DET_Low_MASK) == B_DET_Low_MASK)
{
/* Try to clear the interrupt on Pin_INTSTAT */
B_DET_Low_ClearInterrupt();

/* Clear Pending on ISR component as well */
B_DET_Low_ShutDown_ClearPending();
}

0 点赞