This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR5738:P2.2错误中断检测

Guru**** 2382630 points
Other Parts Discussed in Thread: MSP430FR5738
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/749603/msp430fr5738-p2-2-false-interrupt-detection

器件型号:MSP430FR5738

您好!  

我们在批量生产的项目中使用了 MSP430FR5738 uC。 现在、我们收到了一些客户抱怨功能错误的反馈。 在实验练习中进行调试后、我们找到了问题的根源。  

我们在 P2.2上使用 ISR 进行下降沿检测。 下面列出了引脚初始化。

当我们对线路进行示波时、电压保持在3.3V、并且 P2.2的输入端没有真正的持续操作(示波器上的触发电平为~2V)。 而这种情况下、UC 会始终跳转到 ISR。 我会说在1500个器件中的1个器件上发生了这种情况。 我们可以认为这可能是 ESD 损坏、但这条线路仅用于内部 AN、没有连接到某些外部引脚。 你有什么想法吗?   

此致

//main.c
P2DIR = 0x00;
P2OUT = 0x00;

void init_p22 (void){
P2IFG &=~BIT2;
P2OUT |= BIT2;
P2IES |= BIT2;
P2REN |= BIT2;
P2IE |= BIT2;
}

#pragma vector=port2_vector
__interrupt void P2_ISR (void)
{
if (P2IFG && BIT2)// P2.2中断?
{
//此处的一些操作
}
P2IFG = 0x00;//删除所有 IR 标志
} 


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > IF (P2IFG && BIT2)// P2.2中断?
    这将检查 P2IFG 中的所有位。 不相关的活动可能会设置其他一些位。 尝试:
    > IF (P2IFG 和 BIT2)// P2.2中断?
    ------------------------------------
    未经请求:
    > P2IFG &=~BIT2;
    > P2OUT |= BIT2;
    >P2IES |= BIT2;
    > P2REN |= BIT2;
    >P2IE |= BIT2;
    这会过早清除 P2IFG。 任何/所有后续操作都可能导致 P2IFG.2被置位、从而导致(单个)错误触发。 将 IFG 清零移动到恰好在 IE 设置之前:
    [...]
    > P2IFG &=~BIT2;//清除过时
    >P2IE |= BIT2;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只是一个附加信息。 我们收到的所有器件都成功通过了最终测试(需要~ 30分钟)。 问题首先出现在客户现场。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Bruce 很抱歉、我在这里输入时遇到了 double &&。 此外、端口2上没有初始化任何其他 IO 中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bruce 的建议是正确的。 特别是在中断边沿选择寄存器位上的操作是关键的、并且有可能导致中断标志的置位。 因此、在启用相应的中断之前、中断标志清零应该作为最后一条指令发生。

    此致
    Peter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您和 Bruce 提出这一建议、但这并不能解决中断始终出现的问题。 也许它在边沿选择时出现一次、而不是在 ISR itselft 中清除、而只是在初始化阶段出现、这在我的情况下不是一个关键情况。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Artur、
    因此、如果我理解正确的话、P2.2不会连接到 MSP430以外的任何器件、而且、尽管使用示波器探头、您看不到任何触发器、但仍会发生中断。
    是否可以应用以下测试:
    1.将上拉切换为下拉、看看是否仍然发生中断。
    2.将器件切换为上拉电阻并输入到输出端、例如低电平、然后查看中断是否仍然发生。

    此致
    Peter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、你是对的。 仅当首先触发中断时、测试才重要。

    引脚是否连接到任何设备? 内部上拉电阻不是很强(20K?)。

    该计划还在做什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Peter:

    P2.2连接到产品内的另一个 IC、并且未连接到某些外部引脚、因此客户无法对该引脚施加错误的电压或静电放电。 另一个 IC 由相同的电压(3V3)供电。 该导线具有外部10k 上拉电阻。

    尝试切换到内部下拉=相同的情况。
    尝试在下降沿为该引脚配置中断、但将引脚设置为输出=相同的情况。

    UC 仍会每秒进入 ISR 数次。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Artur、
    非常感谢您提供的其他信息。
    只是为了确保我的理解正确。 重复中断是否以特定的、可能变化的发生速率发生、或者器件是否永久循环 P2_ISR? 我提出这个问题的原因是、如果中断标志能够复位、那么器件会在 P2_ISR 完成一次执行后立即跳转到 RETI 之后的相同位置。 如果需要一段时间、直到器件跳转到 P2_ISR 并在中间执行代码、这意味着中断标志至少在一段特定的时间内被清除、然后再被再次设置。

    我要让您做的另一件事是、仅使用 LPM3/或 LPM4模式对器件进行编程、当然、配置 GPIO 时应避免交叉电流、这意味着避免节点悬空、 然后测量 MSP430电流消耗、以验证器件是否仍根据数据表值运行。 如果电流应超过数据表中的值、则表示受影响的器件已损坏。

    在您的初始帖子中,您提到的行为发生率为1:1500。 这表示您有多个具有相同行为的设备。 它们的行为是否都相同、您已确定了多少?

    非常感谢。

    此致
    Peter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Peter:

    我不知道中断的速率、但我能够通过 I2C 接口与器件通信、所以我觉得它们是中断之间的一些时隙。 我使用了一个字节变量、该变量由每个中断递增

    #pragma vector=port2_vector
    _interrupt void P2_ISR (void)

    IF (P2IFG 和 BIT2)//

    MEM.REG.RESERV19[0]+= 1;
    //短缺=1;

    P2IFG = 0x00;

    我可以看到这里的寄存器溢出、所以速率很高。 但我将尝试在中断例程中切换引脚。

    我无法单独测量 uC 的功耗、除非在调试时我无法读取之前没有种子寄存器。 问题已在客户现场发现、我们交付了多达3k 个器件、并收到3个器件、其中2个器件显示了相同的行为。 但是、正如我在上面提到的、所有器件都成功通过了之前30分钟的最终测试。

    此 uC 仅在端口2上具有 P2.0、P2.1、P2.2。 两个引脚 P2.0、P2.1是外部连接的静态输入、GO GND 或 VCC 使用10k 上拉电阻。 施加到 P2.0、P2.1上的静电放电能否对 P2.2产生这样的影响? 我已经检查了 P2.2的 P2SEL1和 P2SEL0寄存器是否有0、这是正确的。

    谢谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Artur、
    端口中断的优先级较低、因此如果 I2C 和端口同时挂起、则会首先为 I2C 提供服务。 因此、这不是一种安全的方法。 您需要查看 ISR 之外的一些 CPU 相关活动、或选择另一个优先级较低的中断源。

    遗憾的是、无法通过调试信息测量器件本身的电流。 电气过载可能会导致任何奇怪的行为、但我希望在受影响的 GPIO 上看到转换或奇怪的电平。 但您永远不知道。 这就是我建议进行电流测量的原因。 您可能需要小心地将 MSP430器件从电路板上拔出、以便能够在插座板中进行测试。

    此致
    Peter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Artur、
    您这边的状态是什么? 我们还能为您做些什么吗?

    此致
    Peter
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Artur、

    由于您在几天内没有反馈、我们将暂时关闭此主题、您仍可以使用更新进行回复。

    此处提供更多注释:您可能可以尝试验证问题是否来自 MSP 或其他 IC、因为您提到 P2.2已连接到另一个 IC。
    一种快速方法是切断与另一个 IC 的连接、但保持 P2.2上的上拉电阻器、并查看是否仍有故障中断触发。

    此致
    Kc
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Peter、

    很抱歉有几个忙的日子。 最后、我今天可以运行一些测试。 已尝试将此引脚初始化为输出、但仍在接收中断。 还使用了内部上拉/下拉(外部10k 上拉电阻仍在位)、情况相同。 我写了一些代码来切换 ISR 内连接到外部接口的引脚、我可以测量363.6kHz 的稳定频率、这意味着以727kHz 的双频率调用中断。  

    #pragma vector=port2_vector
    __interrupt void P2_ISR (void)
    {
    if (P2IFG & BIT2)
    {
    PxOUT_INTL_DCDC_DIS||DCDC_DIS;
    PJDIR ^= INT;// INT = 0x0010
    }
    P2IFG = 0x00;
    }
    

    有什么想法吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果没有这一行代码:
    PxOUT_INTL_DCDC_DIS |= DCDC_DIS;
    ISR 调用频率为~ 440kHz * 2 = 880kHz。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Artur、

    感谢您的测试和更新、我是否可以知道您所做的测试是使用一个简单的测试代码、该代码只启用端口中断或基于您的原始应用代码? 您测得的频率是否与您的应用有某种关系、例如接口通信速率?

    Peter 建议、是否可以小心地将 MSP430器件从电路板上拔出、以便能够在插座板中进行测试? 如果在具有端口中断仅使能代码的插座板上仍然出现此问题、则更像是芯片损坏问题。

    此致
    Kc
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Artur、

    我们将暂时关闭此主题、但您仍可以回复任何更新、然后我们将继续跟进。 谢谢。

    此致
    Kc