1 硬件方案:6972+按键+电池供电电压采样+SPI接口无线模块+小电机驱动+LED,一节锂电池供电。产品低功耗模式
2 程序烧录:主要采用TI的GANG430,编程器供电。
3 出现概率、数量:
第一批次,去年15张样板出现一例:运行1天后32K、8M停振、RST脚复位无效,需断电重新启动,更换CPU之后恢复正常。问题CPU换 到 裸 板上运行可反复重现;
第二次,最近30张样板:1)先有2张发生在配置阶段:烧程序之后电脑通过USB-TTL模块配置样机参数,先连接电缆,再上电池,无其他外设, 发现 不能配置,LED跑马灯运行10秒左右随机停在某个位置,RST复位后32K\8M晶体停振,后来只运行闪灯程序反复休眠和激活也会 停下来;2) 更换CPU之后再次发现一张同样现象。3)样机测试中不久发现1张直接32K 8M停振,断电重启5分钟内重现。
4 共性问题:1这些现场发生CPU只能断电重启。
5 问题求助:1 )这些现象是CPU是否已经发生损伤部分失效?
2)这些现象的原因:发生现象的直接原因是什么?哪个环节导致?
3)芯片有无特殊需要注意的地方?5418A,4152量产也没出现过这类问题。
灰小子:
可能的原因比较多:
1、mcu的问题,建议核实mcu进货来源,建议从ti官网或者正规代理商进货,不要在某宝采购
2、pcb,建议检查晶振相关电路的pcb走线、打样的质量,干扰源等
Maka Luo:
sir feng
1 硬件方案:6972+按键+电池供电电压采样+SPI接口无线模块+小电机驱动+LED,一节锂电池供电。产品低功耗模式
2 程序烧录:主要采用TI的GANG430,编程器供电。
3 出现概率、数量:
第一批次,去年15张样板出现一例:运行1天后32K、8M停振、RST脚复位无效,需断电重新启动,更换CPU之后恢复正常。问题CPU换 到 裸 板上运行可反复重现;
第二次,最近30张样板:1)先有2张发生在配置阶段:烧程序之后电脑通过USB-TTL模块配置样机参数,先连接电缆,再上电池,无其他外设, 发现 不能配置,LED跑马灯运行10秒左右随机停在某个位置,RST复位后32K\8M晶体停振,后来只运行闪灯程序反复休眠和激活也会 停下来;2) 更换CPU之后再次发现一张同样现象。3)样机测试中不久发现1张直接32K 8M停振,断电重启5分钟内重现。
4 共性问题:1这些现场发生CPU只能断电重启。
5 问题求助:1 )这些现象是CPU是否已经发生损伤部分失效?
2)这些现象的原因:发生现象的直接原因是什么?哪个环节导致?
3)芯片有无特殊需要注意的地方?5418A,4152量产也没出现过这类问题。
sir feng:
回复 Maka Luo:
谢谢!芯片走的正规渠道。
问题CPU拆到裸板上面只看灯和按键,同样现象,而且已经测到32K死掉不是原因而是结果。复位后起振前可以输出IO口。晶体布局如下:
32K晶体为圆柱 负载电容12.5PF ,匹配电容为15PF 实测晶体32.7682KHZ,晶体在顶层,晶体下面有铜区。
即使晶体32K不振,但是复位为何不响应?
Delta:
回复 sir feng:
复位后也很难确定是否不运行。取决于振荡器配置。
排查方法有几个方法:
1,做以下测试时,把时钟总线输出到IO口做监测,看是否真的停振了?
2,时钟配置的代码是否可以发上来看看?
3,只使用内部DCO,不休眠,会不会出现以上现象?
4,32K配的电容应该是不对的,再仔细看看你的晶振规格书,和IC规格书的有关参数。
sir feng:
回复 Delta:
#include <msp430.h>#include <inttypes.h>
#define LIGHT_NET_FLASH P3OUT ^= 0x01#define LIGHT_RSSI_FLASH P3OUT ^= 0x02#define LIGHT_FLASH P6OUT ^= 0x20
#define F_CPU 8000000UL
void HAL_Init(){ WDTCTL = WDTPW + WDTHOLD; P3DIR = 0xFF; P6DIR = 0xFF; PM5CTL0 &= ~LOCKLPM5;
PJSEL0 |= 0xF0; PJSEL1 &= 0x0F;
CSCTL0_H = CSKEY >> 8;
CSCTL1 = DCOFSEL_0; CSCTL2 = (CSCTL2 & ~(SELM_7 | SELS_7 | SELA_7)) | (SELM__HFXTCLK | SELS__HFXTCLK | SELA__LFXTCLK); CSCTL3 = DIVM__1 + DIVS__1 + DIVA__1; CSCTL4 = HFFREQ_1 | HFXTDRIVE_0 | VLOOFF; do { CSCTL5 &= ~(LFXTOFFG + HFXTOFFG); SFRIFG1 &= ~OFIFG; uint16_t i; for (i = 0; i < 0xFFFF; i++) ; } while (SFRIFG1 & OFIFG); CSCTL0_H = 0;}
void Timer_Init(){ TA0CTL = TACLR; TA0CTL = TASSEL__ACLK | MC__CONTINOUS | TAIE; TA0CCTL0 &= ~CCIE;}
void Timer_ASNStart(){ TB0CTL = TBCLR; TB0CTL = TBSSEL__ACLK | MC__UP; TB0CCR0 = 1000; TB0CCTL0 = CCIE;}
#pragma vector=TIMER0_A1_VECTOR__interrupt void Timer0_A1_Handler(){ if (TA0CTL & TAIFG) { TA0CTL &= ~TAIFG; LIGHT_NET_FLASH; }}
#pragma vector=TIMER0_B0_VECTOR__interrupt void Timer0_B0_Handler(){ LIGHT_RSSI_FLASH; LPM3_EXIT;}
int main(){ HAL_Init();
Timer_Init(); Timer_ASNStart(); _EINT(); while (1) { LIGHT_FLASH; LPM3; }
}
zhifang yang1:
回复 sir feng:
1 打开watch dog,watch dog 的主要用途就是用来cover你所述的这种case,程序跑飞之后可以reset回来。
按我们公司的设计标准watch dog是不允许常关或长时间关闭的。
2 把NMI打开。 不清楚你所说的无法重置,是软重置还是硬件重置。 拉RST/NMI 这个脚不可能不能让MCU重置的。
看一下你系统中断向量 0xFFFE(Reset) 0xFFFC (PMM) 0xFFFA(flash,oscillator ) 这几个中断向量指向哪里? 是否有做ISR函数?
看你的描述很有可能是外部(比如ESD)或者内部(flash 读写操作未按流程进行)等触发了以上的NMI , 而你又没配置相应的 ISR ,默认我记得应该是跳转到TI_ISR_TRAP 里,spin forever了。
3 未用或者悬空的脚从 input 改成output low with pull down,抗外部干扰能力会更强。
外部IO如果出现高于系统Vdd + 0.7V 的情况会从端口的施密特触发器上管倒灌到芯片内部。