您好,
在某些使用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时测得的电流图表。