wonderwhy 发表于 2026-2-9 09:24:32

MCU死机,无法唤醒

使用芯片:STC32G12K128, 目前产品已经出货约3000套,现在客户陆续退回来5台,
现象:产品处于卡死状态,对充电/按键/通讯等行为无反应;且断电MCU重新供电后恢复正常,测量了一些状态后发现芯片处于进入休眠后的状态,且充电/按键/通讯都无法唤醒;
唤醒的中断源有:按键检测中断,充电唤醒IO口中断,负载检测IO口中断,通讯检测IO口中断;此外通过外部晶振32.768k晶振设置了定时1小时唤醒的RTC;卡死的产品没有RTC唤醒的现象,且对设置的中断均无反应;
备注:产品已开启了看门狗;且我检查代码,并未发现有关闭中断IO的数字输入语句,麻烦帮忙看一下,这个死机问题是什么导致的?



神农鼎 发表于 2026-2-9 17:43:19












青穗三三 发表于 2026-2-9 10:43:08

你可以做个日志,把重要代码的执行过程,记录到日志中,对于那些死机的,这样就能看到究竟是卡死到那一步不能继续运行了

newlined 发表于 2026-2-9 10:48:26

正在做掉电唤醒的程序,关注下。

wonderwhy 发表于 2026-2-9 11:09:29

青穗三三 发表于 2026-2-9 10:43
你可以做个日志,把重要代码的执行过程,记录到日志中,对于那些死机的,这样就能看到究竟是卡死到那一步不 ...

嗯嗯,你说的是一种后续的处理方法而且不是解决方案,都是现在的问题是客户需要现在就找出原因给出解决方案,客户的设备不可能给你用来测试排除问题的

wonderwhy 发表于 2026-2-9 11:10:26

wonderwhy 发表于 2026-2-9 11:09
嗯嗯,你说的是一种后续的处理方法而且不是解决方案,都是现在的问题是客户需要现在就找出原因给出解决方 ...

而且这个问题不是必现的,这个就很麻烦,我也是没招了,不知道STC有没有什么办法

青穗三三 发表于 2026-2-9 11:50:11

第一,怎么确定,就算现在找出这个解决办法,因为问题不是必现的,你怎么确定你解决了。所以我说的程序上这部分加上日志,你还得弄
第二,可以外边挂上一个电路,主要作用是一段时间能没有和这个电路通信,就把你这个产品重启供电。
第三,给你看一下我的低功耗操作逻辑
                  //低功耗进入
                  if (myADCDat.ad_Vref>1218 && PIN_KEY_Get()==0)//若电压低于4V,并且按键检测到0
                  {
                        //关闭耗电设备
                        P35 = 1;//关闭红灯
                        P36 = 1;//关闭绿灯
                        P33 = 0;//取消阀动作
                        P54 = 0;//不短路5.1K电阻

                        RecordAdd(RECORD_TYPE_POWER_DOWN);//掉电记录

                        EXT0_MODE_RiseFall();//设置外部中断边沿触发
                        EXT0_ENABLE();//使能外部中断

                        //将所有端口置为高阻状态
                        P1M1=0xFF; P1M0=0;
                        P3M1=0xFF; P3M0=0;
                        P5M1=0xFF; P5M0=0;
                        //将一些引脚的数字输入功能给关闭
                        P1IE=0x00; P3IE=0x04;
                        
                        ADC_CONTR &= ~0x80;//关闭ADC电源
                        CMPCR1 &= ~0x80;//关闭比较器

                        while (1)//避免被非唤醒目标唤醒
                        {
                            SYSTEM_PD();//进入掉电模式
                            _nop_();
                            _nop_();
                            _nop_();
                            _nop_();
                            FeedDog();
                        }
                  }


void X0_ISR() interrupt INTERRUPT_X0
{
    RTC_TimeGet(&rtc);
    Flash_WritesU8(MCU_STORAGE_RTC,(u8 *)&rtc,sizeof(rtc));
    SYSTEM_RESET_ISP();
}

DebugLab 发表于 2026-2-9 12:51:14

主频接近极限频率需要在初始化时正确设置IAP_TPS并设置IRCDB=16尤其是需要使用省电模式唤醒的情况

wonderwhy 发表于 2026-2-9 13:39:36

青穗三三 发表于 2026-2-9 11:50
第一,怎么确定,就算现在找出这个解决办法,因为问题不是必现的,你怎么确定你解决了。所以我说的程序上这 ...

嗯嗯,你说的也是;日志确实后面需要加上;外挂电路这个搞不了,产品做了认证至少硬件层面动不了;感谢分享

wonderwhy 发表于 2026-2-9 13:40:10

DebugLab 发表于 2026-2-9 12:51
主频接近极限频率需要在初始化时正确设置IAP_TPS并设置IRCDB=16尤其是需要使用省电模式唤醒的情况 ...

目前MCU频率为24M,这个是否接近极限频率

wonderwhy 发表于 2026-2-9 14:43:48

DebugLab 发表于 2026-2-9 14:19
后缀-24A的可能算是,不管这些直接加上就行,又没有坏处

目前代码确实没有加IRCDB=16这句,我排查我们用的这个芯片的后缀是-35I;我想知道不加的话会出现怎么样;手册上说的稳定是什么意思,会是导致死机的原因吗

页: [1] 2
查看完整版本: MCU死机,无法唤醒