主题中讨论的其他部件: MSP-TS430RHB32A
我们在产品(自动调温器)中使用msp430i2041,但在使用此产品时存在一些问题。工作一段时间后崩溃,所有IO都没有任何输出。 CPU似乎未进入其工作状态。 刚安装时自动调温器可以正常运行,但运行几天之后就出现了这种问题。 有三个这样的自动调温器出现了这个问题。 我们估计这是由干扰造成的。 电路显示在所附的图纸上,相对简单。 干扰只会引入电源和模拟输入。 功率和模拟输入均被过滤(功率添加到两级滤波器,模拟输入增加电容), 但崩溃会再次发生,电重启。后来我们通过实验发现,如果我们给芯片的IO一些干扰(给JTAG提供高静态脉冲),CPU崩溃,所有IO都转到输入模式,但WDT软件是打开的。 当干扰消失时,CPU仍无法启动。
另一个在实验过程中发现了一个问题,当外部复位电路添加到SP706或不添加时,如果压降不是零,保持在2.1V左右,然后打开电源,CPU无法再启动,手动RST信号无法重新启动。 必须完全关闭电源,才能启动电源。 SP706小于2.6V当电压被给予RST低信号时,CPU应进入重置状态,直至电压满足要求。当获得高电压信号时,CPU应启动。 但是CPU没有启动,这并不是绝对的。
请分析,原因是什么。 解决方案是什么? 非常感谢!
添加:代码的一部分,示意图。
int __low_lever_init (void)
{
unsigned long *jtagPwd =(unsigned long *)JTAG_DIS_PWD1;
/*为看门狗计时器供电*/
WDTCTL = WDTPW | WDTCNTCL;
/*检查JTAG密码位置,如果密码不匹配,则禁用JTAG。
*否则,JTAG将在重置后的第64个周期中启用。
*/
如果(*jtagPwd != 0x0万)&&(*jtagPwd != 0xFFFFFFFFFFFFFFF))
{
/*禁用JTAG */
SYSJTAGDIS = JTAGDISKEY;
}
/*校准部分
*检查IFG1中是否有BORIFG标志。 如果这是一个BorIFG,则执行校准。
*否则跳过校准
*/
IF (IFG1和BORIFG)
{
//对62字节TLV数据执行2的补码校验和
无符号int校验和=0;
unsigned char *TLV_address_for _parse =(unsigned char *)TLV_start);
unsigned int *TLV_address_for校验和=(unsigned int *) TLV_start + 1);
做
{
checksum ^=* TLV_address_for校验和++;
}同时(TLV_address_for校验和<=(unsigned int *)TLV_end);
checksum ^= 0xFFFF;
校验和++;
//如果校验和不正确,请转至LPM4
如果(*(unsigned int *)TLV_start)!=校验和)
{
//如果校验和失败,请输入LPM4
__bis_sr_register (LPM4_bits);
}
//校验和匹配,现在设置校准值
//校准参考
REFCAL1 =*(TLV_ADDRESS_FOR_PARse + TLV_CAL_REFCAL1);
REFCAL0 =*(TLV_address_for _parse + TLV_CAL_REFCAL0);
//校准DCO
CSIRFCAL =*(TLV_address_for _parse + TLV_CAL_CSIRFCAL);
CSIRTCAL =*(TLV_ADDRESS_FOR_PARse + TLV_CAL_CSIRTCAL);
CSERFCAL =*(TLV_ADDRESS_FOR_PARse + TLV_CAL_CSERFCAL);
CSERTCAL =*(TLV_ADDRESS_FOR_PARse + TLV_CAL_CSERTCAL);
//校准SD24
SD24TRIM =*(TLV_address_for _parse + TLV_CAL_SD24TRIM);
//清除BorIFG
IFG1 &=~(BORIFG);
}
/*为看门狗计时器供电*/
WDTCTL = WDTPW | WDTCNTCL;
/*返回值:
* 1 -执行数据段初始化。
*0-跳过数据段初始化。
*/
返回1;
}
Void主(void)
{
静态调整状态=0;
U8温度;
_DINT();
_NOP();
WDTCTL = WDTPW | WDTHOLD;//关闭WDT
CSCTL1 = DIVs__4 + DIVM__4;// MCLK=SMCLK=4096K
FCTL2 = FWKEY | FSSEL_1 |FN2 |FN3;// FN1 | FN3 |FN5;// MCLK/12,用于闪存定时发生器257k~476K
// FCTL2 = FWKEY | FSSEL_1 |FN1 | FN3 |FN5;// MCLK/42用于闪存定时发生器257k~476K
WDTCTL=WDT_ARST_1000;
init_TimerA0();
InitTimeA1Pwm();
InitCfg();//congif init
init_adi();//ad init
init_485();//UART初始化
_EINT();
同时(1)
{
IF (needRset==0)
WDTCTL=WDT_ARST_1000;
IF ((needInitAd=1)&&(CommSent()=0))
{
needInitAd=0;
_DINT();
init_adi();//ad init
_EINT();
}
IF (GetBeChanged()=Yes)
{
DealData (0);
}
temp = GetKeyCode();
IF (temp == key_Setup_QQ)
{
SetRange(1);
AdjustState = set_range1;
}
}
}


显示正常工作时的Vrst VCC波形,VCC为黄色,Vrst为绿色。



