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.

[参考译文] MSP430FR2355:无法使用端口1中断退出 LPM0

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1173329/msp430fr2355-failure-to-exit-lpm0-using-port-1-interrupts

器件型号:MSP430FR2355

您好!

 我有一个生成中断输出的 nA 计时器。 输出连接到端口1.1和端口1.2。 我希望 MSP 430关闭并进入其最低功耗状态、然后在定时器中断时唤醒。 我已经证明、计时器在每次出现中断时都通过简单的 LED 闪存来生成中断。 现在、我尝试进入 LPM0并使用相同的中断唤醒器件。 这不奏效。 请您能帮助我了解我所犯的错误、代码如下所示。

在代码中、您可以看到我注释掉的 LPM0代码。 注释掉此代码后、代码将按我的预期运行、使用代码可执行文件、处理器将停止并在 BIS 行上保持停止。 似乎未检测到中断。 当我处于 LPM0或类似情况时、是否需要将端口1设置为不同的功率模式? 在所有 LPM 模式下、不仅在 LPM0模式下、也会发生相同的行为。

FYI 端口1设置为所有输入、启用所有中断标志。

提前感谢您

Richard

    while(1)
    {
    Data_Register=0x06;             //;
    register_data=read_a_byte();    //Communicate with i2C device and read a byte

    if(port_1_interrupt==1)         //If there is an interrupt simply flash an LED
        {
        P6OUT |= 0b1000000;
        _delay_cycles(1000000);
        P6OUT &=0b0000000;
        _delay_cycles(1000000);
        P6OUT |= 0b1000000;
        _delay_cycles(1000000);
        P6OUT &=0b0000000;
        _delay_cycles(1000000);
        port_1_interrupt=0;
        }
    _delay_cycles(100000);          //Wait to slow down communication loop

    //__bis_SR_register(LPM0_bits + GIE); <- if I uncomment this line, the code never sees an interrupt and does not wake up
    //__no_operation();
     }
     
     
     ///////////////////////////////// Port 1 interrupt service routine//////////////////////////////////////////
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
    //port2_interrupt_pending=1;
    P1IFG &=~0b111111110;         // Clear all the interrupt flags

    port_1_interrupt=1;           //Set a global flag

    __bic_SR_register_on_exit(LPM0_bits);// Exit from LPM to make CPU active
    __bis_SR_register(GIE);       //Enable Global Interrupts
}
     
     

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

    抱歉使用二进制文件! 而不是十六进制! 它只是测试代码。

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

    很抱歉 Richard、您的评论没有标记为已解决! 让我来看看这个、然后返回给您

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

    > P1IFG &&~0b1111110;//清除所有中断标志

    这看起来很奇怪、因为它不清除 P1.0上的中断、所以(如果 P1IE=0xFF)中断将永远触发。 你是说什么

    > P1IFG &&~0b111111;//清除所有中断标志

    ------

    未经请求:我建议您避免在 ISR 中执行此操作:

    >_bis_SR_register   (GIE);    //启用全局中断

    GIE 很快就会被恢复(未堆叠)、这会打开一个可能会导致您出现问题的窗口。

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

    感谢您的响应,我将 P1.0用于 ADC,因此我不需要清除该标志。

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

    没问题

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

    我不知道,我在编写代码的时候,我在中断中使用它已经很长时间了,我猜还有一个错误在等待发生!

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

    将 P1.0连接到 ADC (PSEL=3)不会断开它与 GPIO 逻辑的连接(它只是关闭施密特触发器)。 如果您对 P1IFG.0不感兴趣、我建议您使用 P1IE=0xFE。

    在 Port1 ISR 中设置一个断点可能会有所启发、以查看它是否触发/为何触发(在任一情况下)。

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

    我不清楚计时器的配置是什么。 您可以说它生成中断输出、并且连接到端口1。 计时器中断与计时器输出单元不同、因此如果没有计时器代码、我无法告诉您在这里发生了什么。

    实际上、我不知道为什么涉及端口中断。 您说您想使用计时器中断来唤醒。 为什么不在计时器 ISR 中这么做?

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

    不涉及 MSP 计时器。 我有一个在端口1上提供中断的外部计时器。 这样做的原因是、在 计时器工作模式最低的情况下、MSP 会为我的应用耗散过多功率。  

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

    我已经这么做了、因为端口1上有一个预期的中断而触发中断。  

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

    当中断触发时、P1IFG 的值是多少?

    --------

    另一个可能不明显的事情:当 ISR 清除 LPM0_BITS (在 main 的 SR 中)时、只有当它们被置位时、即当 main 位于 LPM 中时、这才有效。 如果此时恰好在执行其他操作、例如在__delay_cycles ()中旋转、则唤醒指示会丢失。 在这种情况下、main 将保持在 LPM 中、直到下一次唤醒、即 GPIO 中断。

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

    要使 MSP430在低功耗模式下耗能、需要花费一定的时间。 在 LPM3中通常小于10uW。

    另一件事。 未显示 PORT_1_INTERRUPT 的声明。 如果这不是易失性的、则编译器将看到您的 while 循环中的比较永远不会为真。 并删除所有该位调整代码。

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

    中断中的 P1IFG 标志为0x02。

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

    我喜欢位调整代码! 它闪烁 LED。

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

    尊敬的 David:

     我可以看到发生了什么情况,第一次通过代码,中断触发,LED 按预期闪烁,然后代码在   _bis_SR_register (LPM0_bits + GIE)上停止;(显然未注释)。 这意味着中断端口1信号存在、处理器会识别它。 当代码进入   _bis_SR_register (LPM0_bits + GIE)时、似乎不再看到中断、这让我怀疑在进入 LPM0之前必须为端口1启用电源。 看起来中断只是没有触发。  现在、为了添加到参数中、我在 MSP 计时器运行的情况下输入了 LPM0、该计时器工作正常、因此它实际上看起来像是端口/断电/无法识别的中断问题。

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

    您会说中断是第一次通过代码触发。 你确定吗? 您不会显示 GIE 的设置位置。 (如果之前设置过、为什么要再次设置?) 您也不会显示端口的初始化。 这很容易导致立即中断、而不受任何信号对端口执行的操作的影响。

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

    不,我不确定,我想我骗了自己。

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

    有没有幸运地提出可能的问题 Amruta?

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

    David、非常感谢您的贡献-非常感谢您的贡献。  我在中断之外闪烁 LED、这让我感到受骗了。  我在 P1引脚上有一个示波器,中断信号是一个低电平脉冲~8秒周期,宽度为10ms。 在没有调用 LPM0的情况下、我每~8秒会得到一个预期的 LED 闪存、因此我认为系统在硬件方面是正确的、虽然可能存在一些缺陷、但代码却是我所期望的、 然而、当我在 LPM0被启用的情况下运行代码时、代码永远停止在该行上。 您对 LPM0中的端口1是否关闭有任何想法吗?

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

    您无法关闭端口1。 它必须是您尚未显示的内容。 可能是端口1初始化。

    发布显示问题的完整代码列表是唯一的方法。

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

    我无法列出所有代码、例程太多、但我认为以下是重要的、P1设置代码。  

        ///PORT 1 SET UP
        P1SEL0 |= 0b1;                              // Configure ADC A1 pin 0
        P1SEL1 |= 0b1;
        P1DIR =  0b00000000;                           //Port 1 set as inputs
        P1IE |=  0b11111110;                          // interrupt enabled
        P1IES |= 0b00000000;                          // Lo/Hi edge
        P1IFG &= 0b00000000;                          // IFG cleared
        //P1OUT = 0b00000000;
        PM5CTL0 &= ~LOCKLPM5;

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

    并非所有代码。 将其降低至证明问题所需的最低要求。 作为一项奖励、您在执行此操作时很有可能会注意到问题的根源。

    您似乎错过了8.3.1中描述的初始化序列。 在清零 LOCKLPM5之前、不能清除 P1IFG。

    您的代码使 P1IES 保持不变、这是一个问题、因为 PUC 后它没有定义状态。

    我相信希望您将所有这些引脚都连接到高电平或低电平。 否则、这些 CMOS 输入将悬空并导致故障。 如果只有一个信号可创建中断、则仅为该引脚启用中断。 所有这些都需要麻烦。

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

    尊敬的 David:

     我想我有办法解决这个问题,这是非常奇怪的。 我使用的非板载计时器芯片是 MAX31341B。 您可以通过 I2C 与其通信,以设置时间、读取时间、设置警报、设置倒计时计时器等  因此、我将递减计数计时器设置为30秒。  然后、我使用 I2C 来监控芯片状态、我可以看到、当芯片计数降为零时、就会产生中断、并且 MSP430上的 LED 会按预期闪烁。 这表明一切都已连接、并且正在调用中断。   

    然后、我调用 LPM0模式并期望 MSP 430在计数器完成时唤醒、不幸的是、由于某种原因、我还不了解、除非有与计时器的 I2C 通信、否则计时器芯片不会产生中断、因此 MSP 430永远不会唤醒。 这正是导致我怀疑我的代码或 MSP430出现一些问题的原因。  

    我还尝试禁用 LPM0模式、将 MSP 置于活动状态并在没有 I2C 通信的情况下运行代码、我得到了相同的故障。 因此、从这个角度来看、除非存在某种形式的 I2C 通信、否则 MAX31341B 不会产生中断。 数据表中没有提到这种行为、这种行为令人惊讶(坦率地说、这毫无意义)、我不敢相信这就是器件的工作方式。 下一步是从 Maxim 获取技术支持。  

    当 MSP430处于 LPM0模式时,我可以使 MAX 芯片产生一个1秒的时钟,所以我可以用它来唤醒 MSP430,但这样我就不能达到我的功率目标,我在中断之间需要大约30秒的时间。  

    感谢你的帮助

    此致  

    Richard

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

    我仍然不知道为什么您需要外部 RTC。 与仅使用 MSP430及其 RTC 和 LPM3.5相比、使用它和 LPM4.5可略微节省功耗。

    对于.5个低功耗模式、您基本上会得到上电复位、而不是中断类操作。

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

    是否需要清除 TIF (通过读取寄存器0x05)才能清除 INTx 、以便获得另一个边沿? 这意味着每个周期至少有一个 I2C 事务。 即使如此、TRPT=1时、您应该至少获得一个 TIF/INTx 触发器。

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

    我同意、我应该看到至少一个中断。 在读取寄存器的代码中、我可以在示波器上看到、对于中断、特定位变为高电平、然后在读取后变为低电平、这是预期的行为。 问题是、当 I2C 通信停止时、我不会获得任何中断-或者至少这是它看起来的样子(我只是不相信、我错过了一些显而易见的东西)。  同样、我的两个警报都在工作、中断正常生成、但如果我停止 I2C 读取、我不会得到任何结果、因此可能实际上就是这样、

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

    您的 I2C 总线是否可能以某种方式挂起?

    您的 I2C 代码是否使用 LPM? LPM 唤醒的另一个可能不明显的问题是它是匿名的。 如果您的程序中有多个唤醒源、则由唤醒方来确保它等待的东西实际上已经发生。 (在由 PORT_1_INTERRUPT 全局代码提供服务的您发布的代码中。)