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.

[参考译文] cc430f5137:cc430f5137 won和#39;运行一段时间后,有时无法返回到睡眠状态

Guru**** 2390755 points
Other Parts Discussed in Thread: CC430F5137

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/654559/cc430f5137-cc430f5137-won-t-back-to-sleep-at-sometime-after-running-for-a-while

部件号:CC430F5137

您好,

在某些使用CC430F5137的其它产品中发现了该问题。

以下是 我的产品中使用的代码。 我在一组3个单元中对其进行了测试,这些单元具有相同的代码,并由3V电池供电。我与电池串联添加了一个10欧姆电阻器,因此电阻器上的电压可以通过Pico插座进行测量。 可以将皮斯科示波器设置为长时间监控电流。

同时(1)

CLRWDT_16s

//使VLO (10kHz)成为ACLK的时钟源
UCSCTL4 =拉美_ VLOCLK + TELS_ DCOCLKDIV + SELM_ DCOCLKDIV;

LED_OFF

IF (*((unsigned char *) 0x1906)== 1)

如果(状态!= STATE _RX_WOR_OLD)

频闪(RF_Sidle);
频闪灯(RF_SFRX);
频闪(RF_SFTX);
频闪灯(RF_SCAL);
while (((Strobe(RF_SNOP)& 0xF0)!= 0x00);

状态= STATE _RX_WOR_OLD;

//将Fifo_thr RX更改为4
WriteSingleReg (PKTCTRL1,(rfSettings_old.fifotr和0xF0));

//设置2个前导码字节
WriteSingleReg (MDMCFG1,(rfSettings_old.mdmcfg1和0x8F));
//设置16位同步字(16/16)
WriteSingleReg (MDMCFG2,(rfSettings_old.mdmcfg2和0xf4)| 0x02);

//收到数据包后应该发生什么情况:
//RXOFF模式和TXOFF模式处于空闲状态
WriteSingleReg (MCSM1,0x30);
//在数据包结束时禁用CRC
WriteSingleReg (PKTCTRL0,(rfSettings_old.pktctrl0 &~0x04));
//禁用在有效负载处附加RSSI和LQI信息
WriteSingleReg (PKTCTRL1,(rfSettings_old.pktctrl1 & 0xFB);

WriteSingleReg (PKTLEN,1);//设置数据包长度
}

T_WOR_1s =38;//2秒
}
否则

如果(状态!= STATE _RX_WOR)

频闪(RF_Sidle);
频闪灯(RF_SFRX);
频闪(RF_SFTX);
频闪灯(RF_SCAL);
while (((Strobe(RF_SNOP)& 0xF0)!= 0x00);

状态= STATE _RX_WOR;

//设置2个前导码字节
WriteSingleReg (MDMCFG1,(rfSettings.mdmcfg1 & 0x8F));
//设置16位同步字(16/16)
WriteSingleReg (MDMCFG2,(rfSettings.mdmcfg2 & 0xf4)| 0x02);

//收到数据包后应该发生什么情况:
//RXOFF模式和TXOFF模式处于空闲状态
WriteSingleReg (MCSM1,0x30);
//在数据包结束时禁用CRC
WriteSingleReg (PKTCTRL0,(rfSettings.pktctrl0 &~0x04));
//禁用在有效负载处附加RSSI和LQI信息
WriteSingleReg (PKTCTRL1,(rfSettings.pktctrl1 & 0xFB));

WriteSingleReg (PKTLEN,2);//设置数据包长度
}

T_WOR_1s =72;//4秒
}

频闪(RF_Sidle);
频闪灯(RF_SPWD);//关闭射频

WDTCTL =WDTPW+WDTTMSEL+WDTCNTCL+WDTIS2+WDTSSEL_2+WDTIS1;//1/16s
SFRIE1 || WTIE;//启用WDT中断
__bis_sr_register(LPM3_bits + GIE);//输入LPM3并重新启用中断
// CPU在此休眠!
__delay_cycles (800ul);//等待
SFRIE1 &=~WDTI;//禁用WDT中断
//ACLK = XT1 (默认),SMCLK = DCOCLKDIV (默认),MCLK = DCOCLKDIV (默认)
UCSCTL4 =拉美__ XT1CLK + TELS_ DCOCLKDIV + SELM_ DCOCLKDIV;
//delay_cycles(x)在代码中停止并等待x MCLK周期

//===================================================================
//处理挂起的唤醒标志
//===================================================================
CLRWDT_16s

IF (g_BWakeUpFlags & bmWUF_DETRX_MSG_RCVD)

CLRWDT_16s

IF (*((unsigned char *) 0x1904)=3)

G_qHalfSecTick =12;//3s
while (g_qHalfSecTick >0);

WiredRx_State = 0;
TA0CCR0 =0;
g_bWakeUpFlags &=~bmWUF_DETRX_MSG_RCVD;//释放该标志

如果(aulFriendListBuf[0]!=0x00ffff)//从未学习过?

IF (bRxShiftter == 1)

bRxShifter =0;
WiredRx_State =0;

LED_红色
__DELAY周期(4万ul);
LED_OFF

IF (*((unsigned char *) 0x1906)== 1)

RF_9s_out (RF_INFO_GAS);
}
否则

new_RFout (RF_INFO_BUTTON);
}
}
否则

G_qHalfSecTick =12;//3s
while (g_qHalfSecTick >0)

CLRWDT_16s

IF (bRxShifter >3)
中断;
}

IF (bRxShifter >3)

bRxShifter =0;

LED_红色
__delay_cycles (16万ul);
LED_OFF

FIRST_LOA++;
IF (FIRST_LOA == 1)

IF (*((unsigned char *) 0x1906)== 1)

RF_9s_out (RF_INFO_FIRE);
}
否则

new_RFout (RF_INFO_FIRE);
}

T_ReLoA =4;
}
否则

IF (*((unsigned char *) 0x1906)== 1)

RF_9s_out (RF_INFO_FIRE);
}
否则

new_RFout3 (RF_INFO_FIRE);
}
}
}
否则

bRxShifter =0;
}
}
}
否则

bRxShifter =0;
}
}
else if (*((unsigned char *) 0x1904)>0)&&(*(unsigned char *) 0x1904)<3))

G_qHalfSecTick =8;//等待2秒
while (g_qHalfSecTick >0);

WiredRx_State = 0;
TA0CCR0 =0;
g_bWakeUpFlags &=~bmWUF_DETRX_MSG_RCVD;//释放该标志

如果(aulFriendListBuf[0]!=0x00ffff)//从未学习过?

IF ((bRxShifter == H10PUSHBUTTON)||(bRxShifter == X10PUSHBUTTON))

bRxShifter =0;

对于(i=0;i<150;i++)

__DELAY周期(4万ul);
}

LED_红色
__DELAY周期(4万ul);
LED_OFF

IF (*((unsigned char *) 0x1906)== 1)

RF_9s_out (RF_INFO_FIRE);
}
否则

new_RFout (RF_INFO_BUTTON);
}
}
否则IF ((bRxShifter == H10heatalarm)||(bRxShifter == X10smokeHeatalarm))

bRxShifter =0;

LED_红色
__delay_cycles (16万ul);
LED_OFF

FIRST_LOA++;
IF (FIRST_LOA == 1)

IF (*((unsigned char *) 0x1906)== 1)

RF_9s_out (RF_INFO_FIRE);
}
否则

new_RFout (RF_INFO_FIRE);
}

T_ReLoA =4;
}
否则

IF (*((unsigned char *) 0x1906)== 1)

RF_9s_out (RF_INFO_FIRE);
}
否则

new_RFout3 (RF_INFO_FIRE);
}
}
}
否则,如果(bRxShiftter == x10lowbattery)

bRxShifter =0;
LOW (低)_VOLTAGE ++;
low_voltage_0 = low_voltage;
}
Else if (bRxShifter == XH10故障)

ERROR_STATUS=1;
bRxShifter =0;
}
否则

bRxShifter =0;
}
}
否则

bRxShifter =0;
}
}
否则

G_qHalfSecTick =24;//等待6s (最大值)
while (g_qHalfSecTick >0)

CLRWDT_16s;

IF ((bRxShifter =dcmSMOKE_OR_HEAT)||(bRxShifter =dcmCO))
中断;

IF (bRxShiftter =dcmRF_function)
中断;

IF (bRxShifter =dcmLOW_BAT)
中断;
}

WiredRx_State = 0;
TA0CCR0 =0;
g_bWakeUpFlags &=~bmWUF_DETRX_MSG_RCVD;//释放该标志

如果(aulFriendListBuf[0]!=0x00ffff)//从未学习过?

IF ((bRxShifter =dcmSMOKE_OR_HEAT)||(bRxShifter =dcmCO))

LED_红色
__delay_cycles (16万ul);
LED_OFF

IF (bRxShiftter =dcmCO)

bRxShifter =0;

FIRST_LOA++;
IF (FIRST_LOA == 1)

IF (*((unsigned char *) 0x1906)== 1)

RF_9s_out (RF_INFO_GAS);
}
否则

new_RFout (RF_INFO_GAS);
}

T_ReLoA =4;
}
否则,如果(FIRST_LOA =2)

用于(k1=0;k1<3;k1+)

IF (*((unsigned char *) 0x1906)== 1)

RF_9s_out (RF_INFO_GAS);
}
否则

new_RFout (RF_INFO_GAS);
}
}

T_ReLoA =4;
}
否则

IF (*((unsigned char *) 0x1906)== 1)

RF_9s_out (RF_INFO_GAS);
}
否则

new_RFout3 (RF_INFO_GAS);
}
}
}
否则

bRxShifter =0;

FIRST_LOA++;
IF (FIRST_LOA == 1)

IF (*((unsigned char *) 0x1906)== 1)

RF_9s_out (RF_INFO_FIRE);
}
否则

new_RFout (RF_INFO_FIRE);
}

T_ReLoA =4;
}
否则,如果(FIRST_LOA =2)

用于(k1=0;k1<3;k1+)

IF (*((unsigned char *) 0x1906)== 1)

RF_9s_out (RF_INFO_FIRE);
}
否则

new_RFout (RF_INFO_FIRE);
}
}

T_ReLoA =4;
}
否则

IF (*((unsigned char *) 0x1906)== 1)

RF_9s_out (RF_INFO_FIRE);
}
否则

new_RFout3 (RF_INFO_FIRE);
}
}
}
}
否则,如果(bRxShifter == dcmLOW_BAT)

bRxShifter =0;
LOW (低)_VOLTAGE ++;
low_voltage_0 = low_voltage;
}
否则,如果(bRxShiftter == dcmRF_function)

ERROR_STATUS=1;
bRxShifter =0;
}
否则

bRxShifter =0;
}
}
否则

bRxShifter =0;
}
}
}

//有效的按钮按下时间:100ms ~ 3s
IF (g_BWakeUpFlags和bmWUF_BUTTON)

Learn (学习)();
//软件将在学习后重置
}

IF (g_BWakeUpFlags & bmWUF_WOR)

CLRWDT_16s;

RF1AIE ||(BIT9 + BIT1);//启用中断
RF1AIFG &=~(BIT9 + BIT1);
RF1AIES || BIT9;// RFIFG9pt的下降沿

频闪(RF_SRX);
IF (*((unsigned char *) 0x1906)== 1)

__DELAY周期(1.6万ul);//等待1.6毫秒
}
否则

__DELAY周期(8000ul);//等待1毫秒
}

如果(aulFriendListBuf[0]!=0x00ffff)//从未学习过?

如果(T_once1)
共1-;

IF (T_ReLoA)

T_ReLoA--;
IF (T_ReLoA == 0)

FIRST_LOA =0;
}
}

如果(T_1分钟)

t_1分钟--;
IF (T_1min == 0)

t_1min = 15;

CLRWDT_16s;

CHECK_Bat();

IF (RFlow_voltage >0)

LED_黄色
__delay_cycles (16万ul);
LED_OFF

如果(Bat_low++>240)//4小时

BAT_LOW =0;

LED_红色
__delay_cycles (16万ul);
LED_OFF

NEW_RFOUT (RF_LOWBATTERY);
}
}
否则

LED_绿色
__delay_cycles (16万ul);
LED_OFF

IF (LOW _VOLTAGE > Batt_WARNING)

LOW_VOLTAGE =0;
low_voltage_0 =0;

LED_红色
__delay_cycles (16万ul);
LED_OFF

NEW_RFOUT (RF_LOWBATTERY);

BATT_WARNING =240;//4小时
}
}

如果(low_voltage_0 >0)

low_voltage_0++;

IF ((LOW-VOLTAL_0-LOW-VOLT_VOLTAGE)>2)

LOW_VOLTAGE =0;
low_voltage_0 =0;
BATT_WARNING =7200;//120小时
}
}
}
}

IF (DF_Presence)

如果(T_6 >0)

T_6--;
IF (T_6 ==0)

如果(ERROR_STATUS)

new_RFmonitoring (RF_INFO_FAIL);
ERROR_STATUS =0;
}
否则

new_RFmonitoring (RF_INFO_STATUS);
}

T_6 =5300;// 6小时
}
}
}

IF (STATE == STATE _RX_OLD)//如果有唤醒信号

CLRWDT_16s

G_qHalfSecTick =12;//3s
While (g_qHalfSecTick)(当[g_qHalfSecTick

IF (Operation_mode == remote_alarm)
中断;

IF (操作模式=否操作)
中断;
}
}
否则,如果(state == State_WRX)//如果有唤醒信号

G_qHalfSecTick =16;//4s
While (g_qHalfSecTick)(当[g_qHalfSecTick

CLRWDT_16s

IF (Operation_mode == remote_alarm)
中断;

IF (操作模式=否操作)

操作模式=空闲;
中断;
}

IF (Operation_mode == remote_button)
中断;

IF (Operation_mode == low_BATT)
中断;

}
}
否则

在访问任何寄存器之前,必须发送strobe (RF_sidle);//
频闪灯(RF_SPWD);//关闭射频
}
}
否则

IF (STATE == STANT_WRX)//如果有唤醒信号

CLRWDT_16s

操作模式=空闲;

G_qHalfSecTick =12;//3s
While (g_qHalfSecTick)(当[g_qHalfSecTick

IF (操作模式=BURNIN_TEST1)
中断;

IF (操作模式=BURNIN_TEST2)
中断;

IF (Operation_mode == BURNIN_TEST3)
中断;

IF (操作模式=BURNIN_TEST4)
中断;
}
}
否则

如果(T_1分钟)

t_1分钟--;
}
否则

t_1min = 15;

CLRWDT_16s;

CHECK_Bat();

IF (RFlow_voltage >0)

LED_黄色
__delay_cycles (16万ul);
LED_OFF
}
否则

LED_红色
__delay_cycles (16万ul);
LED_OFF
}
}

在访问任何寄存器之前,必须发送strobe (RF_sidle);//
频闪灯(RF_SPWD);//关闭射频
}
}

运作过程  

}

组的静态电流通常小于20uA。

在小组运行20天后,我开始发现1mA可以在短时间内找到,但当小组运行22天时,我发现静态电流保持在1mA。 然后,我从组中移除了一台设备,发现电流回到uA,这是正常的。

以下是检测到1mA时测得的电流图表。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想知道故障单元的CC430F5137内的超低功耗时钟电路是否停止工作。

    以下是看门狗计时器中断服务例程:

    //监视器计时器中断服务例程
    #pragma vector=WDT_vector
    __interrupt void WDT_ISR(void)

    T_WOR_1s--;

    IF (T_WOR_1s = 0)

    g_bWakeUpFlags |=bmWUF_WOR;
    __BIC_SR_REGISTER_ON_EXIT (LPM3_bits);
    }
    }


    下面是我的代码初始化的一部分:

    //------------------
    // InitRadio
    //设置高功率模式请求启用位,以便可以输入LPM3
    //启用活动的无线电
    PMMCTL0_H = 0xA5;
    PMMCTL0_L || PMMHPMRE_L;
    PMMCTL0_H = 0x00;

    //设置同步字词
    WriteSingleReg (SYNC1,SYNC_WORD_MSB);
    WriteSingleReg (SYNC0,SYNC_WORD_LSB);

    //------------------
    /* MCU时钟系统(UCS)初始化
    *-启动3.2768万Hz晶体振荡器XT1
    *-将FLL配置为使用XT作为参考生成8MHz时钟
    *- MCLK = SMCLK = 244 * FXT1 = 7.99.5392万MHz,来自DCO/2。
    */
    UCSCTL3 |= SELREF_2; //设置DCO FLL参考= REFO
    UCSCTL4 =拉美经济体系_2+SELS_3+SELM_3;//ACLK =反向,MCLK=SMCLK=DCOCLK。
    UCSCTL6 = XT2OFF & MSK_1|//XT2已关闭
    XT1OFF和MSK_1;// XT1已关闭

    __bis_sr_register(SCG0);//禁用DCO的FLL提取
    UCSCTL0 = 0x0000; //将DCO设置为最低分接头
    // FLL循环除以2,Fsys/FXT1比率=243+1 =244
    UCSCTL2 = FLLD__2|243;
    UCSCTL1 = DCORSEL_5;//对于10..20MHz,运行Fdco =16MHz并除法
    //按2以确保时钟占空比= 50 % 自
    //我们在PMMCOREV =0的8MHz最大限制下运行。
    __BIC_SR_REGISTER(SCG0);//重新启用FLL控制
    //最大FLL稳定延迟= 1024 * f_MCLK / f_FLLREF
    __DELAY周期(25万lu);

    b超时=100; //最大尝试时间为100毫秒
    //等待所有振荡器故障标志清除
    同时(SFRIFG1和OFIFG)

    __delay_cycles (8000lu);//延迟~1ms
    //清除单个标记
    UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
    SFRIFG1 &=~OFIFG; //清除总和标志
    IF (--bTimeout ==0)

    //出错了
    software_BOR_reboot
    }
    }
    //ACLK = XT1 (默认),SMCLK = DCOCLKDIV (默认),MCLK = DCOCLKDIV (默认)
    UCSCTL4 =拉美__ XT1CLK + TELS_ DCOCLKDIV + SELM_ DCOCLKDIV;
    //------------------
    //在连续模式下启动TA08192Hz时钟源自ACLK/XT1
    //没有加班间隔
    TA0CCTL0 =0;//最初禁用所有TA0 CC中断
    TA0CCTL1 = 0;
    TA0CCTL2 = 0;
    TA0CCTL3 = 0;
    TA0CCTL4 = 0;
    //为ACLK配置TA0 /1 = 3.2768万Hz,定时器停止,
    // TAIFG中断仍被禁用:
    TA0CTL = TASEL1 & MSK_0|// tassel[1:0]=01 => ACLK (此处为3.2768万Hz)
    TASSEL0和MSK_1|
    标识1 & MSK_0 |// ID[1:0]= 00 =>输入分隔符= 1:1
    ID0 和MSK_0 |
    MC1 & MSK_0 |// mc_1:0]=00 => TA0已停止
    MC0 和MSK_0 |
    TALR & MSK_1 |// TALR = 1 =>立即清除TAN0R和分禾器
    TAIE & MSK_0|// TAIE =0 =>禁用TA0溢出中断
    TAIFG & MSK_0;// TAIFG = 0 =>清除TA0溢出中断标志

    TA0EX0 = TAIDEX2 & MSK_0 |// IDEX[2:0]= 000 =>额外输入除法器= 1:1
    TAIDEX1和MSK_0 |
    TAIDEX0和MSK_0;
    TA0CTL |= MC1; //在连续模式下启动TA0 (0..FFFFFFFFFFFF)

    TA0CCTL0 = CM1 & MSK_0 |// CM[1:0]=01 =>在上升边缘捕获
    CM0 和MSK_1 |
    通过1 & MSK_0 |// CCIS[1:0]=00 =>选择输入CCI0A (引脚)
    KONU0和MSK_0 |
    // SCS = 1 =>使捕获与时钟同步(推荐)
    SCS 和MSK_1 |
    // SCCI是同步的CCI输入,此处不在乎
    SCCI和MSK_0 |
    盖 & MSK_1 |// cap = 1 =>捕获模式
    OUTMOD2 & MSK_0 |// OUTMOD[2:0]=000 =>比较输出=输出位
    OUTMOD1 & MSK_0 |
    OUTMOD0和MSK_0 |
    CCIE和MSK_0|// CCIE =0 =>最初禁用CC中断
    CCI & MSK_0|// CCI为非同步CC输入,只读
    //输出= 0 => CC输出= 0当OUTMOD[2:0]=000时
    输出 和MSK_0 |
    COV & MSK_0 |// COV =0 =>清除捕获溢出标志
    CCIFG & MSK_0;// CCIFG =0 =>清除CC中断标志
    WiredRx_State = 0; //状态0 =>等待捕获第一个上升边缘
    TA0CCR0 =0;
    TA0CCTL0 &=~CCIFG;
    TA0CCTL0 |= CCIE; //为第一个起始位上升边缘启用中断

    //按钮
    TA0CCTL1 = CM1 & MSK_1|// CM[1:0]=10 =>在下降边缘捕获
    CM0 和MSK_0 |
    通过1 & MSK_0 |// CCIS[1:0]=00 =>选择输入CCI0A (引脚)
    KONU0和MSK_0 |
    // SCS = 1 =>使捕获与时钟同步(推荐)
    SCS 和MSK_1 |
    // SCCI是同步的CCI输入,此处不在乎
    SCCI和MSK_0 |
    盖 & MSK_1 |// cap = 1 =>捕获模式
    OUTMOD2 & MSK_0 |// OUTMOD[2:0]=000 =>比较输出=输出位
    OUTMOD1 & MSK_0 |
    OUTMOD0和MSK_0 |
    CCIE和MSK_0|// CCIE =0 =>最初禁用CC中断
    CCI & MSK_0|// CCI为非同步CC输入,只读
    //输出= 0 => CC输出= 0当OUTMOD[2:0]=000时
    输出 和MSK_0 |
    COV & MSK_0 |// COV =0 =>清除捕获溢出标志
    CCIFG & MSK_0;// CCIFG =0 =>清除CC中断标志
    KN2_State = 0; //状态0 =>等待捕获第一个上升边缘
    TA0CCR1 =0;
    TA0CCTL1 &=~CCIFG;
    TA0CCTL1 |= CCIE; //为第一个起始位上升边缘启用中断

    //为比较中断设置TA0 CC2:
    TA0CCTL2 = CM1 & MSK_0 |// CM[1:0]=00 =>无捕获
    CM0 和MSK_0 |
    电话1和MSK_1|// CCIS[1:0]=10 => CC输入= GND,未使用
    KONU0和MSK_0 |
    SCS & MSK_1 |// SCS = 1 =>使捕获与时钟同步(推荐)
    SCCI和MSK_0 |// SCCI是同步CCI输入,此处无需担心
    盖 & MSK_0 |// cap = 0 =>比较模式
    OUTMOD2 & MSK_0 |// OUTMOD[2:0]=000 => OUTPUT =输出位,此处不使用
    OUTMOD1 & MSK_0 |
    OUTMOD0和MSK_1|
    CCIE和MSK_0|// CCIE =0 =>最初禁用CC中断
    CCI & MSK_0|// CCI为非同步CC输入,只读
    输出 & MSK_0 |// out = 0 => CC output = 0 (当OUTMOD[2:0]= 000时)
    COV & MSK_0 |// COV =0 =>清除捕获溢出标志
    CCIFG & MSK_0;// CCIFG =0 =>清除CC中断标志

    TA0CCR2 =8191;

    TA0CCTL2 &=~CCIFG; //使用寄存器进行fiddling后清除中断标志
    TA0CCTL2 |= CCIE; //启用CC2中断

    …………
    __enable_interrupit(); // gie = 1
    …………
    //===================================================================================================
    //主回路
    //===================================================================================================
    同时(1)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为OSC故障可能是根本原因。 这是因为在进入LPM 3之前,软件会将时钟源更改为VLOCLK,并在始终从睡眠模式唤醒后返回到XT1,这可能会在运行时有时导致OSC故障。

    我要做的是在启动时启用NMI中断,并将NMI中断服务例程添加到软件重置,如下所示:

    #pragma vector=UNMI_vector
    __interrupt void UNMI_ISR(void)

    //重新启动
    software_BOR_reboot
    }

    void main()

    …………
    SFRIE1 |= OFIE; //启用OSC故障中断
    .

    }

    我将测试更新的代码,但请告诉我它是否可以解决问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    捕获OSC故障的方法不起作用,因为OSC故障始终存在。不知道原因。

    在下面的代码中,我在将时钟源更改为VLOCLK之前禁用全局中断,并在设置RF和看门狗计时器之后启用全局中断。 它看起来工作正常,但我不确定问题是否可以解决:

    //===================================================================================================
    //主回路
    //===================================================================================================
    同时(1)

    CLRWDT_16s

    __disable_interrupt (); // gie = 0

    //使VLO (10kHz)成为ACLK的时钟源
    UCSCTL4 =拉美_ VLOCLK + TELS_ DCOCLKDIV + SELM_ DCOCLKDIV;

    LED_OFF

    IF (*((unsigned char *) 0x1906)== 1)

    如果(状态!= STATE _RX_WOR_OLD)

    频闪(RF_Sidle);
    频闪灯(RF_SFRX);
    频闪(RF_SFTX);
    频闪灯(RF_SCAL);
    while (((Strobe(RF_SNOP)& 0xF0)!= 0x00);

    状态= STATE _RX_WOR_OLD;

    //将Fifo_thr RX更改为4
    WriteSingleReg (PKTCTRL1,(rfSettings_old.fifotr和0xF0));

    //设置2个前导码字节
    WriteSingleReg (MDMCFG1,(rfSettings_old.mdmcfg1和0x8F));
    //设置16位同步字(16/16)
    WriteSingleReg (MDMCFG2,(rfSettings_old.mdmcfg2和0xf4)| 0x02);

    //收到数据包后应该发生什么情况:
    //RXOFF模式和TXOFF模式处于空闲状态
    WriteSingleReg (MCSM1,0x30);
    //在数据包结束时禁用CRC
    WriteSingleReg (PKTCTRL0,(rfSettings_old.pktctrl0 &~0x04));
    //禁用在有效负载处附加RSSI和LQI信息
    WriteSingleReg (PKTCTRL1,(rfSettings_old.pktctrl1 & 0xFB);

    WriteSingleReg (PKTLEN,1);//设置数据包长度
    }

    T_WOR_1s =38;//2秒
    }
    否则

    如果(状态!= STATE _RX_WOR)

    频闪(RF_Sidle);
    频闪灯(RF_SFRX);
    频闪(RF_SFTX);
    频闪灯(RF_SCAL);
    while (((Strobe(RF_SNOP)& 0xF0)!= 0x00);

    状态= STATE _RX_WOR;

    //设置2个前导码字节
    WriteSingleReg (MDMCFG1,(rfSettings.mdmcfg1 & 0x8F));
    //设置16位同步字(16/16)
    WriteSingleReg (MDMCFG2,(rfSettings.mdmcfg2 & 0xf4)| 0x02);

    //收到数据包后应该发生什么情况:
    //RXOFF模式和TXOFF模式处于空闲状态
    WriteSingleReg (MCSM1,0x30);
    //在数据包结束时禁用CRC
    WriteSingleReg (PKTCTRL0,(rfSettings.pktctrl0 &~0x04));
    //禁用在有效负载处附加RSSI和LQI信息
    WriteSingleReg (PKTCTRL1,(rfSettings.pktctrl1 & 0xFB));

    WriteSingleReg (PKTLEN,2);//设置数据包长度
    }

    T_WOR_1s =72;//4秒
    }

    频闪(RF_Sidle);
    频闪灯(RF_SPWD);//关闭射频


    WDTCTL =WDTPW+WDTTMSEL+WDTCNTCL+WDTIS2+WDTSSEL_2+WDTIS1;//1/16s

    __enable_interrupit(); // gie = 1

    SFRIE1 |= WTIE; //启用WDT中断
    __bis_sr_register(LPM3_bits + GIE);//输入LPM3并重新启用中断
    // CPU在此休眠!
    __delay_cycles (800ul);//等待
    SFRIE1 &~WTIE; //禁用WDT中断
    //ACLK = XT1 (默认),SMCLK = DCOCLKDIV (默认),MCLK = DCOCLKDIV (默认)
    UCSCTL4 =拉美__ XT1CLK + TELS_ DCOCLKDIV + SELM_ DCOCLKDIV;
    //delay_cycles(x)在代码中停止并等待x MCLK周期

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

    您好,

    需要澄清的几个问题:

    • 当您说您从组中删除了其中一个设备时,我假设所有设备都是通过无线方式相互通信。 是这样吗?
    • 此问题是否重复出现? 这是您第一次遇到它吗?
    • 您是否检查过其他设备中的任何一台,以查看它们是否具有相同的更高功率?

    我认为您最近评论中的代码对于您正在尝试的操作是正确的。


    此致,

    Nathan

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

    你好,Nathan,

    是的,所有3台设备均已无线连接。

    问题可能会重复出现。 在其他2个组(一个组中有3个设备)中发现问题。

    问题是在运行一段时间(小时或天)后,电流被发现保持在1mA。

    我认为根本原因可能是指令UCSCTL4 = LAST__VLOCLK + SESL__DCOCLKDIV + SELM__DCOCLKDIV和 __BIST_SR_REGISTER (LPM3_Bits + GIE) 未能将CPU设置为超低功耗睡眠模式。  

    以下是我的建议:在睡眠模式下,检测时钟源是否真的在10K左右。 请告诉我这是否是解决方案。

    1.设置由 ACLK驱动的TA0 CC2中断的计时器T_MONITOR;

    2.进入睡眠模式之前,将T_MONITOR =100设置为;

    3.唤醒后检查T_monitor;

    4.如果VLOCLK在睡眠模式下工作,且IF (*((unsigned char *) 0x1906)=1),则T_moditor应大于95,否则ACLK时钟源不是10kHz。电源重置;

    //===================================================================================================
    //主回路
    //===================================================================================================
    同时(1)

    CLRWDT_16s

    //使VLO (10kHz)成为ACLK的时钟源
    UCSCTL4 =拉美_ VLOCLK + TELS_ DCOCLKDIV + SELM_ DCOCLKDIV;

    LED_OFF

    IF (*((unsigned char *) 0x1906)== 1)

    如果(状态!= STATE _RX_WOR_OLD)

    频闪(RF_Sidle);
    频闪灯(RF_SFRX);
    频闪(RF_SFTX);
    频闪灯(RF_SCAL);
    while (((Strobe(RF_SNOP)& 0xF0)!= 0x00);

    状态= STATE _RX_WOR_OLD;

    //将Fifo_thr RX更改为4
    WriteSingleReg (PKTCTRL1,(rfSettings_old.fifotr和0xF0));

    //设置2个前导码字节
    WriteSingleReg (MDMCFG1,(rfSettings_old.mdmcfg1和0x8F));
    //设置16位同步字(16/16)
    WriteSingleReg (MDMCFG2,(rfSettings_old.mdmcfg2和0xf4)| 0x02);

    //收到数据包后应该发生什么情况:
    //RXOFF模式和TXOFF模式处于空闲状态
    WriteSingleReg (MCSM1,0x30);
    //在数据包结束时禁用CRC
    WriteSingleReg (PKTCTRL0,(rfSettings_old.pktctrl0 &~0x04));
    //禁用在有效负载处附加RSSI和LQI信息
    WriteSingleReg (PKTCTRL1,(rfSettings_old.pktctrl1 & 0xFB);

    WriteSingleReg (PKTLEN,1);//设置数据包长度
    }

    T_WOR_1s =38;//2秒
    }
    否则

    如果(状态!= STATE _RX_WOR)

    频闪(RF_Sidle);
    频闪灯(RF_SFRX);
    频闪(RF_SFTX);
    频闪灯(RF_SCAL);
    while (((Strobe(RF_SNOP)& 0xF0)!= 0x00);

    状态= STATE _RX_WOR;

    //设置2个前导码字节
    WriteSingleReg (MDMCFG1,(rfSettings.mdmcfg1 & 0x8F));
    //设置16位同步字(16/16)
    WriteSingleReg (MDMCFG2,(rfSettings.mdmcfg2 & 0xf4)| 0x02);

    //收到数据包后应该发生什么情况:
    //RXOFF模式和TXOFF模式处于空闲状态
    WriteSingleReg (MCSM1,0x30);
    //在数据包结束时禁用CRC
    WriteSingleReg (PKTCTRL0,(rfSettings.pktctrl0 &~0x04));
    //禁用在有效负载处附加RSSI和LQI信息
    WriteSingleReg (PKTCTRL1,(rfSettings.pktctrl1 & 0xFB));

    WriteSingleReg (PKTLEN,2);//设置数据包长度
    }

    T_WOR_1s =72;//4秒
    }

    频闪(RF_Sidle);
    频闪灯(RF_SPWD);//关闭射频

    WDTCTL =WDTPW+WDTTMSEL+WDTCNTCL+WDTIS2+WDTSSEL_2+WDTIS1;//1/16s
    SFRIE1 || WTIE;//启用WDT中断

    T_MONITOR =100;

    __bis_sr_register(LPM3_bits + GIE);//输入LPM3并重新启用中断
    // CPU在此休眠!

    __delay_cycles (800ul);//等待
    SFRIE1 &=~WDTI;//禁用WDT中断

    IF (*((unsigned char *) 0x1906)== 1)

    IF (T_MONITOR <96)

    //重新启动
    software_BOR_reboot
    }
    }
    否则

    IF (T_MONITOR <94)

    //重新启动
    software_BOR_reboot
    }
    }

    //ACLK = XT1 (默认),SMCLK = DCOCLKDIV (默认),MCLK = DCOCLKDIV (默认)
    UCSCTL4 =拉美__ XT1CLK + TELS_ DCOCLKDIV + SELM_ DCOCLKDIV;
    //delay_cycles(x)在代码中停止并等待x MCLK周期

    //===================================================================
    //处理挂起的唤醒标志
    //===================================================================

    以下是中断服务例程的一部分:

    静态__interrupt void TIMER0_A1_ISR (void)

    开关(__偶 数_范围内(TA0IV,14))

    案例0x04://TA0 CC2每0.25秒

    TA0CCR2 +=8191;
    TA0CCTL2 &=~CCIFG;//清除中断标志

    IF (T_MONITOR)
    t_monitor--;

    中断;

     

     

     

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

    我刚刚检查了另一组1mA的10天记录功率电流,发现在1mA电流出现之前和之后,然后保持在VLOCLK上,仍在以相同的低频工作。

    我的问题是为什么在指令UCSCTL4 = LAST__VLOCLK + SLS__DCOCLKDIV + SELM__DCOCLKDIV和__BIS_SR_REGISTER (LPM3_Bits + GIE)之后,电源没有设置为ultrl-低功耗模式?

    我们在中国苏州设有一家工厂。 PCB布局已经过中国上海的TI技术支持人员的检查。

    某些CC430F5137芯片是否在超低功耗模式下运行不稳定?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Nathan,

    我在2017年6月发布的"CC430F5137设备错误表"中找到了勘误表CCS7。 当CC430F5137处于休眠模式时,您是否可以帮助我检查程序的时钟设置是否有任何错误,是否会导致电流保持在1mA?

    //------------------
    /* MCU时钟系统(UCS)初始化
    *-启动3.2768万Hz晶体振荡器XT1
    *-将FLL配置为使用XT作为参考生成8MHz时钟
    *- MCLK = SMCLK = 244 * FXT1 = 7.99.5392万MHz,来自DCO/2。
    */
    UCSCTL3 |= SELREF_2; //设置DCO FLL参考= REFO
    UCSCTL4 =拉美经济体系_2+SELS_3+SELM_3;//ACLK =反向,MCLK=SMCLK=DCOCLK。
    UCSCTL6 = XT2OFF & MSK_1|//XT2已关闭
    XT1OFF和MSK_1;// XT1已关闭

    __bis_sr_register(SCG0);//禁用DCO的FLL提取
    UCSCTL0 = 0x0000; //将DCO设置为最低分接头
    // FLL循环除以2,Fsys/FXT1比率=243+1 =244
    UCSCTL2 = FLLD__2|243;
    UCSCTL1 = DCORSEL_5;//对于10..20MHz,运行Fdco =16MHz并除法
    //按2以确保时钟占空比= 50 % 自
    //我们在PMMCOREV =0的8MHz最大限制下运行。
    __BIC_SR_REGISTER(SCG0);//重新启用FLL控制
    //最大FLL稳定延迟= 1024 * f_MCLK / f_FLLREF
    __DELAY周期(25万lu);

    b超时=100; //最大尝试时间为100毫秒
    //等待所有振荡器故障标志清除
    同时(SFRIFG1和OFIFG)

    __delay_cycles (8000lu);//延迟~1ms
    //清除单个标记
    UCSCTL7 &=~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
    SFRIFG1 &=~OFIFG; //清除总和标志
    IF (--bTimeout ==0)

    //出错了
    software_BOR_reboot
    }
    }
    //ACLK = XT1 (默认),SMCLK = DCOCLKDIV (默认),MCLK = DCOCLKDIV (默认)
    UCSCTL4 =拉美__ XT1CLK + TELS_ DCOCLKDIV + SELM_ DCOCLKDIV;
    // UCSCTL5 = 0;重置默认值= 0,所有时钟输出分频器= 1:1
    // UCSCTL8 = 0x77;重置默认值= 0x77,请参阅UG!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Nathan,

    如果程序每小时或每天重置UCS,1mA问题是否会得到解决?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    要确定设备是否处于LPM3中,您可以在调试器处于高功率状态时暂停调试器,并查看寄存器值以确保关闭了正确的时钟。

    至于重新发送UCS,我不知道这是否可以解决问题,但应该没有必要。 断开设备与其他2台设备的无线通信会导致电流再次下降,对吗? 那么,无线通信可能导致了该问题。 该通信是否可能导致收发器消耗较高的电流? 您是否在测量中包含该电流?

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

    你好,Nathan,

    问题是我们产品中的一些CC430F5137芯片在运行数天后仍处于LPM3 (睡眠)模式时,不会真正进入“超低功耗”。 2组装置(一组3个装置)同时运行相同的代码。良好的装置自12月14日开始运行。 2017年,仍在良好状态下运行。但发现另一组中的坏单元在2周后保持1mA电流。

    测试期间没有进行射频通信,因此测试的设备在正常唤醒循环中运行------- >睡眠-------- >唤醒------- >睡眠。  

    我使用Pico示波器测试与蓄电池串联的10欧姆电阻器的电压,以便 测量组的消耗电流。  

    谢谢!

    德荣园

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

    是否可以通过检查任何寄存器来检查执行__bis_sr_register(LPM3_bits + GIE)后CPU是否实际未处于LPM 3休眠模式?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Derong,

    我有点困惑。 您之前曾说过,当您将设备从三个设备组中移出时,电流会下降,而三个设备组正在进行无线通信。 但现在您说没有RF通信。 您能澄清一下吗?

    此外,您是否检查了寄存器值以确保关闭了正确的时钟? 因为这将告诉我们这些设备是否真的在LPM3中。 如果是,则还有其他一些原因导致电流升高。 低功率模式下的预期电流值只是基本电流。 例如,如果打开了其他功能,电流将增加。

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

    你好,Nathan,

    3台设备均通过无线方式连接。 每个装置都与烟雾传感器和蜂鸣器相连,因此,通常在未检测到火灾时,不会传输RF命令,每个装置都会在短时间内打开其RF接收器,然后返回休眠状态。 但是,如果检测到烟雾,设备将发送RF警报命令,以便其他人发出警报。

    如果我理解正确,我可以将CC430设置为检查寄存器UCSCTL4的位0~2。如果读取位是001b,则时钟源 实际上是VLOCLK,否则必须发生振荡器故障,因此必须执行软件重置。

    请告诉我这是否是正确的解决方案。

    谢谢!

    德荣园  

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

    为确保1mA不会耗尽产品中的电池,我认为我可能需要检查看门狗计时器中断服务例程中的UCSCTL4_H,CPUOFF,SCG0和SCG1位。

    当CPU在LPM3模式下运行时,watchdong计时器将在固定时间内中断CPU。

    请告诉我添加检查所有这些寄存器位是否可以确保芯片真正进入超低功耗LPM3模式。

    以下是更新的代码。

    我用该代码测试了一台设备,发现该设备运行状况良好。

    //监视器计时器中断服务例程
    #pragma vector=WDT_vector
    __interrupt void WDT_ISR(void)

    T_WOR_1s--;

    IF (UCSCTL4_H!= 1)

    //重新启动
    software_BOR_reboot
    }

    IF (!CPUOFF)

    //重新启动
    software_BOR_reboot
    }

    IF (!SCG0)

    //重新启动
    software_BOR_reboot
    }

    IF (!SCG1)

    //重新启动
    software_BOR_reboot
    }

    IF (T_WOR_1s = 0)

    g_bWakeUpFlags |=bmWUF_WOR;
    __BIC_SR_REGISTER_ON_EXIT (LPM3_bits);
    }
    }

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

    你好,Nathan,

    以下是监视计时器中断例程的更新代码,用于检查CPU是否处于超低功耗模式,CPUOFF,SCG0和SCG1位是否在睡眠模式下设置。

    //监视器计时器中断服务例程
    #pragma vector=WDT_vector
    __interrupt void WDT_ISR(void)

    INT SR;

    T_WOR_1s--;

    IF (UCSCTL4_H!= 1)

    //重新启动
    software_BOR_reboot
    }

    //状态寄存器(SR)
    //位7:SCG1
    //位6:SCG0
    //位4:CPUOFF
    SR =__GET_SR_REGISTER();

    //IF (!SCG1)
    如果(SR和0x80 ==0)

    //重新启动
    software_BOR_reboot
    }

    //IF (!SCG0)
    如果(SR和0x40 ==0)

    //重新启动
    software_BOR_reboot
    }

    //IF (!CPUOFF)
    如果(SR和0x10 ==0)

    //重新启动
    software_BOR_reboot
    }

    IF (T_WOR_1s = 0)

    g_bWakeUpFlags |=bmWUF_WOR;
    __BIC_SR_REGISTER_ON_EXIT (LPM3_bits);
    }
    }

    谢谢!

    德荣园

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

    是的,这些是您需要检查的寄存器。 如果它们与LPM3需要设置的位一致,则是,设备位于LPM3中。

    我很高兴运行您的新代码的装置运行良好。

    此致,
    Nathan