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.

[参考译文] MSP430FR2475:固件始终从 LPM3.5唤醒、同时 P2IFG 位2始终置位-为什么?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1109970/msp430fr2475-firmware-always-wakes-up-from-lpm3-5-with-p2ifg-bit-2-always-set---why

器件型号:MSP430FR2475

MSP 团队、

嗨、大家好、这是来自我们在艾默生的朋友、虽然我现在不能在 FAE 峰会上重复这个内容、但我想把它跑过你们。

谢谢、

Chris

 ----

我很难弄清为什么我的固件总是从 LPM3.5唤醒、而 P2IFG 位2始终置位。  由于我们的固件运行得非常快、我获取了 TI 示例代码并对其进行了更新、以向端口2引脚2添加中断。  我本来没想到会有什么问题,但现在还在那里!  让这项工作变得非常重要,我们非常感谢您的帮助。  我注意到删除了 P2IES |= 0x04行;删除了唤醒时设置的 P2IFG 位2,但我们显然需要为下降沿设置中断。  

如何在从 LPM3.5唤醒时将 P2IFG 位2保持清零?

您可以在下面找到代码和原理图。  

  

 

 

 

#include

 

void initGpio (void);

void set_interrupt_and_sleep (void);

 

int main (空)

   WDTCTL = WDTPW | WDTHOLD;              //停止 WDT

 

   initGpio();                            //配置 GPIO

 

   //初始化 XT1 32kHz 晶振

   P2SEL0 |= BIT0 | BIT1;                 // P2.0~P2.1:晶振引脚

   操作

   {

       CSCTL7 &=~(XT1OFFG | DCOFFG);     //清除 XT1和 DCO 故障标志

       SFRIFG1 &=~OFIFG;

   } while (SFRIFG1 & OFIFG);             //测试振荡器故障标志

 

   //首先确定我们是从 LPMx.5还是常规复位中退出。

   如果(SYSRSTIV = SYSRSTIV_LPM5WU)       //从 LPM3.5唤醒时、重新启动

   {

        //如果 MCU 从 LPM3.5唤醒,请重新初始化,然后再次返回 LPM3.5。

        __ENABLE_INTERRUPT ();              // RTC 中断应立即触发...

        if (P2IFG & 0x04){

             P2IFG &=~0x04; //清除中断

             //然后在此处执行一些操作来启动主操作。

        }

   }

   其他

   {

       //器件从冷启动加电。

       //它配置器件并将器件置于 LPM3.5中

 

       //配置 RTC

       //每1024/32768 * 32 = 1秒发生一次中断和复位

       RTCMOD = 128-1;

       RTCCTL = RTCSS_XT1CLK | RTCSR |RTCPS_1024;

       RTCCTL |= RTCIE;

 

   }

 

   SET_INTERRUPT_AND_SLEEP ();

 

   返回0;

 

 

//进入启用中断的 LPM3.5模式。 请注意、该操作确实执行了

//不返回。 LPM3.5将通过复位事件退出、从而产生

//重新启动代码。

void set_interrupt_and_sleep (void){

 

       P2SEL0 &=~0x04; //作为 IO 启用

      P2DIR &=~0x04; //使其成为输入

      P2IES |= 0x04; //高->低边沿触发(用于感测压降)

      P2IFG &=~0x04; //清除中断标志

      P2IE  |= 0x04; //中断使能

 

      _enable_interrupt ();

      PMMCTL0_H = PMMPW_H;                   //打开 PMM 寄存器进行写入

      PMMCTL0_L |= PMMREGOFF;                //并设置 PMMREGOFF  

 

      _bis_SR_register (LPM3_bits | GIE);  

       __no_operation();

 

空 initGpio (空)

   P1DIR = 0xFF;P2DIR = 0xFF;

   P1REN = 0xFF;P2REN = 0xFF;

   P1OUT = 0x00;P2OUT = 0x00;

 

   //禁用 GPIO 上电默认高阻抗模式

   //激活先前配置的端口设置

   PM5CTL0 &=~LOCKLPM5;

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

    > P1OUT = 0x00;P2OUT = 0x00;

    这会将 P2.2驱动为低电平、其中 P2.2在 LPM 模式下可能为高电平(外部上拉会击败内部下拉电阻)。 请尝试:

     P1OUT = 0x00;P2OUT = 0x00 | BIT2;//将 P2.2设置为高电平、与按钮上的外部上拉电阻配合使用

    或者、您可以始终将 P2.2保持为输入(使用 P2REN 上拉)

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

    Bruce、我忽略了代码的最后一部分、我认为您肯定会在这里找到一些东西。  感谢我的朋友及时的回应!

    Chris

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

    确实是布鲁斯,谢谢我的朋友!

    Chris