您好、TI 团队:
以下是我在 LMP3.5示例中找到的代码。 基本上、我已经编辑了代码来实现一个配置、在此配置中、MSP 保持在 LMP3.5模式下20秒、然后唤醒闪烁 LED 2秒、然后再次进入 LMP3.5模式。 代码正常工作、但 LED 始终保持亮起状态、从不熄灭。 有人可以审阅并告诉我应该编辑或可以为我编辑的内容吗?
#包含
void initboard(void);
void initRtc (void);
void WakeUpLPM35 (void);
volatile unsigned int blinkCounter = 0;
//将 LED 的状态存储在 FRAM 中,其中此变量
//在启动期间不会用 C 语言初始化。 这允许
///可轻松恢复和管理的某些变量
//存储在非易失性存储器中,无需闪存电荷泵。
//这样可以缩短启动时间。
#if defined (__TI_Compiler_version__)
#pragma persistent(ledState);
unsigned char ledState = 0;
#Elif Defined (__IAR_systems_ICC__)
_persistent unsigned char ledState;
#else
//对于其他编译器,将此变量插入 FRAM 存储器
unsigned char ledState;
#endif
int main (空)
{
WDTCTL = WDTPW | WDTHOLD;//停止 WDT
//初始化板
initBoard();// GPIO 和 CS 的常规初始化代码
//确定是来自 LPMx.5还是常规复位。
如果(SYSRSTIV = SYSRSTIV_LPM5WU)
{
//在从 LPM3.5唤醒时,重新
WakeUpLPM35 ();// LPMx.5唤醒特定的初始化代码
_enable_interrupt ();// RTC 中断应立即触发...
}
否则
{
ledState = 0;//初始化 LED 状态变量
P1OUT = 0x00;//初始化 P1OUT 为零
initRtc ();// RTC_B 的常规初始化代码
}
//使用 P4.6 LED 作为心跳,表示设备已重新启动,或者
//从 LPMx.5或完全加电
P4OUT |= BIT6;
//使用计时器 A 短暂延迟,使 P1.0 LED 闪烁
TA0CCTL0 = CCIE;// TACCR0中断被启用
TA0CCR0 = 1000;
TA0CTL = TASSEL__ACLK | MC__UP;// SMCLK、向上计数模式
__ bis_SR_register (LPM3_bits | GIE);
TA0CTL &=~(MC__UP);//停止计时器
P4OUT &=~BIT6;//清除 P4.6 LED
//按顺序进入 LPM3.5。
PMMCTL0_H = PMMPW_H;//打开 PMM 寄存器以进行写入
PMMCTL0_L |= PMMREGOFF;//并设置 PMMREGOFF
//使能中断后进入 LPM3.5模式。 请注意、该运算确实
//不返回。 LPM3.5将通过一个复位事件退出、这会导致一个
//重新启动代码。
__ bis_SR_register (LPM3_bits | GIE);
___ no_operation();
返回1;
}
void initBoard (void)
{
//端口配置
//从变量复位之前恢复 P1.0 LED 状态
//存储在 FRAM 中
P1OUT = ledState;
P1DIR = 0xFF;
P2OUT = 0x00;
P2DIR = 0xFF;
P3OUT = 0x00;
P3DIR = 0xFF;
P4OUT = 0x00;
P4DIR = 0xFF;
PJOUT = 0x00;
PJSEL0 |= BIT4 | BIT5;
PJDIR = 0xFFFF;
//禁用 GPIO 上电默认高阻抗模式以激活
//先前配置的端口设置
PM5CTL0 &=~μ A LOCKLPM5;
//设置时钟
CSCTL0_H = CSKEY >> 8;//解锁 CS 寄存器
CSCTL1 = DCOFSEL_0;//将 DCO 设置为1MHz
CSCTL2 = SELAM_0 | SELS_3 | SELM_3;//设置 ACLK = XT1;MCLK = DCO
CSCTL3 = DIIVA_0 | DIVS_0 | DIVM_0;//将所有分频器设置为1
CSCTL4 &&~LFXTOFF;//启用 LFXT1
正确
{
CSCTL5 &=~LFXTOFFG;//清除 XT1故障标志
SFRIFG1 &=~OFIFG;
}while (SFRIFG1和 OFIFG);//测试振荡器故障标志
CSCTL0_H = 0;//锁定 CS 寄存器
}
void initRtc (void)
{
//配置 RTC_B
//配置 BCD 模式,停止 RTC,然后启用 RTC
RTCCTL01 = RTCBCD | RTCHOLD | RTCTEV_0;
//将 RTC 第二级分频器设置为256
//每2秒发生一次 RTC 中断
RTCPS1CTL = RT1IP_7 | RT1PSIE;
//启动 RTC 日历模式
RTCCTL01 &=~μ H RTCHOLD;
}
空 WakeUpLPM35 (空)
{
// Re 配置/启动
//配置 BCD 模式,停止 RTC,然后启用 RTC
RTCCTL01 |= RTCBCD | RTCHOLD | RTCTEV_0;
//将 RTC 第二级分频器设置为256
//每2秒发生一次 RTC 中断
RTCPS1CTL = RT1IP_7 | RT1PSIE;
//启动 RTC 日历模式
RTCCTL01 &=~μ H RTCHOLD;
}
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma vector=RTC_vector
__interrupt void RTC_ISR (void)
#Elif 已定义(_ GNU _)
void __attribute__((interrupt (RTC_vector))) RTC_ISR (void)
#else
#错误编译器不受支持!
#endif
{
开关(__even_in_range (RTCIV、RTCIV_RTCOFIFG))
{
案例 RTCIV_NONE:中止;
案例 RTCIV_RTCRDYIFG:中断;
案例 RTCIV_RTCTEVIFG:中断;
案例 RTCIV_RTCAIFG:中断;
案例 RTCIV_RT0PSIFG:中断;
情形 RTCIV_RT1PSIFG:
如果(blinkCounter == 0)
{
P1OUT |= BIT0;
}
否则
{
P1OUT &=~BIT0;
}
BlinkCounter ++;
if (blinkCounter > 20)
{
BlinkCounter = 0;
}
中断;
案例 RTCIV_RTCOFIFG:中止;
}
}
//计时器 A0中断服务例程
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma vector=TIMER0_A0_vector
__interrupt void Timer_A (void)
#Elif 已定义(_ GNU _)
void __attribute__((interrupt (TIMER0_A0_vector)) Timer_A (void)
#else
#错误编译器不受支持!
#endif
{
__ bic_SR_register_on_exit (LPM4_bits);
}
谢谢!
此致、
普赫拉吉·辛格