掉电休眠后不能再次唤醒
芯片:IAP15W413AS
功能:设备使用电池供电,电池电压4.5V。平时处于掉电休眠状态,按键中断唤醒后,采集并显示数据。然后再次进入休眠。
问题:25年2月生产1K只,其中200只某客户使用中退回50多只,经测试,工作电流为2uA,无法唤醒。断电重启后,恢复正常,可正常唤醒和休眠。
背景:此产品已生产两年多,累计出货上万只,第一次出现此状况。怀疑是客户处有干扰,造成MCU不能被唤醒。
https://www.stcaimcu.com/data/download/Datasheet/STC15-CN.pdf
电路图参考上面
//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz
#include "reg51.h"
#include "intrins.h"
//-----------------------------------------------
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
bit FLAG; //1:上升沿中断 0:下降沿中断
sbit P10 = P1^0;
sbit P32 = P3^2;
sbit P33 = P3^3;
//-----------------------------------------
//中断服务程序
void exint0() interrupt 0 //INT0中断入口
{
P10 = !P10; //将测试口取反
FLAG = P32; //保存INT0口的状态, INT0=0(下降沿); INT0=1(上升沿)
}
//-----------------------------------------------
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
P6M0 = 0x00;
P6M1 = 0x00;
P7M0 = 0x00;
P7M1 = 0x00;
IT0 = 0; //设置INT0的中断类型为上升沿和下降沿,上升沿和下降沿均可唤醒
//IT0 = 1; //设置INT0的中断类型为仅下降沿,下降沿唤醒
EX0 = 1; //使能INT0中断
EA = 1;
while (1)
{
PCON = 0x02; //MCU进入掉电模式
_nop_(); //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
//多加几个_nop_();
PCON|=0x02前后分别加4个或以上NOP 大概率是死机了。
我有遇到一些情况,比如强干扰之后串口发送的数据里面掺杂了一些非常窄的脉冲,这导致接收端出现无法解析的情况,通讯失败,此时即便硬件复位芯片依然不能解决问题。只能断电重启才能恢复。这个问题困扰我很多年了。通讯失败状态下,并不影响其他的功能。
MCU-VCC/GND 管脚就近加 2个 电容 抗干扰
页:
[1]