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;
}