- 打卡等级:初来乍到
- 打卡总天数:3
- 最近打卡:2026-01-23 11:03:43
已绑定手机
新手上路
- 积分
- 35
|
发表于 2026-1-22 17:38:47
|
显示全部楼层
// 准备进入休眠
if(waitingFlag == FALSE)
{
// 准备进入休眠状态时:
// 显示界面处于非电量界面则立即休眠(用于)
if(sleepFlag == SLEEP_AT_ONCE)
{
// 为下次唤醒后超时休眠做准备
sleepFlag = WILL_SLEEP;
// 关闭显示屏
oled_Off();
// 如果无外设接入则关闭指示灯
if(sinkSrcAccessFlag == 0)
{
setLedMode(LED_OFF_NO_WAIT, 0, 0, 0);
mcuStatus = MCU_SLEEP;
}
// 按键1计时及状态变量清零
keyStatus.keyAction = NO_CLICK;
keyStatus.pressTimeCntEn = FALSE;
keyStatus.pressTimeCnt = 0;
keyActionFlag = FALSE;
menu.cartoonSet = FALSE;
// 休眠后长按允许进入小电流设置模式
trickle_Set_En_flag = TRUE;
// 配置外部中断(满足休眠状态下充电唤醒)
exti_Config();
// 设置0.5秒定时唤醒(设置为1000,实际定时为0.5秒)
SetWakeUpTime(1000);
while(1)
{
// 如果当前无外设接入时则关闭定时唤醒功能并直接进入休眠节能状态
// 避免充放电状态下,休眠状态导致LED指示灯失控
if(sw6236d_irq_chkPin)
{
// 关闭定时唤醒
WKTCH &= 0x7F;
// 关闭LED指示灯
setLedMode(LED_OFF_NO_WAIT, 0, 0, 0);
#ifdef CONSOLE_DEBUG
printf("ledStatus = 4!\r\n");
#endif
}
// 有外设接入的状态下,继续采集电量数据,方便后续屏显数据的实时同步
// 无线充模块反应比较滞后,当充电设备(比如手机)退出后,无线充模块仍然会导致协议芯片状态管脚保持低电平约1分钟左右
else
{
// 已通过I2C接口获取到变量值
if(getDataFlag)
{
batCapValue = batCapValueCpy;
chargeInOutFlag = chargeInOutFlagCpy;
sinkSrcAccessFlag = chargeInOutFlag;
getDataFlag = FALSE;
if((chargeInOutFlag == INPUT_STATUS) || (chargeInOutFlag == INPUT_OUTPUT_STATUS))
{
inputPwrValue = pwrValue;
outputPwrValue = 0;
}
else if(chargeInOutFlag == OUTPUT_STATUS)
{
inputPwrValue = 0;
outputPwrValue = pwrValue;
}
else
{
inputPwrValue = 0;
outputPwrValue = 0;
chargeInOutFlag = NO_ACCESS_STATUS;
sinkSrcAccessFlag = NO_ACCESS_STATUS;
}
}
// 确认有外设保持接入
if(sinkSrcAccessFlag == TRUE)
{
// 指示灯之前已经熄灭,则此次为外设再次接入,需要等同于中断响应效果,跳出当前预休眠循环并亮屏(用于处理无线充功能的缺陷)
// 无线充模块的缺陷:当无线充电设备退出后,无线充模块还会继续导致协议芯片SW6201的状态脚持续拉低,造成外设仍然接入的假象,导致指示灯延迟熄灭
if(ledStatus == FALSE)
{
sinkSrcAccessIntFlag = TRUE;
EA = 0;
pwrSavingCnt = 0;
pwrSavingTimeMax = PWR_SAVING_TIME_120S;
pwrSavingEn = TRUE;
waitingFlag = TRUE;
sleepFlag = SLEEP_AT_ONCE;
EA = 1;
#ifdef CONSOLE_DEBUG
printf("ledStatus = 5!\r\n");
#endif
}
// 如果处于放电状态且电量低于警戒值则闪灯提示
if((chargeInOutFlag == 0) && (batCapValue <= LOW_PWR))
{
setLedMode(LED_BLINK_WAIT, 0, 500, 500);
}
else
{
setLedMode(LED_ON_WAIT, 0, 0, 0);
}
}
// 无外设接入,但协议芯片的状态管脚仍然处于被无线充模块拉低的状态
else
{
setLedMode(LED_OFF_NO_WAIT, 0, 0, 0);
#ifdef CONSOLE_DEBUG
printf("ledStatus = 6!\r\n");
#endif
}
}
feedDog();
// 进入休眠状态
PCON |= 0x02;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
// 如果因外界因素导致唤醒则跳出当前循环(外设接入或者按键按压动作)
if(sinkSrcAccessIntFlag || keyActionFlag)
{
#ifdef CONSOLE_DEBUG
printf("Running!\r\n");
#endif
mcuStatus = MCU_NO_SLEEP;
batCapValue = batCapValueCpy;
chargeInOutFlag = chargeInOutFlagCpy;
sinkSrcAccessFlag = chargeInOutFlag;
if((chargeInOutFlag == INPUT_STATUS) || (chargeInOutFlag == INPUT_OUTPUT_STATUS))
{
inputPwrValue = pwrValue;
outputPwrValue = 0;
}
else if(chargeInOutFlag == OUTPUT_STATUS)
{
inputPwrValue = 0;
outputPwrValue = pwrValue;
}
else
{
inputPwrValue = 0;
outputPwrValue = 0;
chargeInOutFlag = NO_ACCESS_STATUS;
sinkSrcAccessFlag = NO_ACCESS_STATUS;
}
break;
}
}
}
// 进入休眠前卡通动画
else
{
// 无外设接入则倒计时为0时切换到休眠类动画
if(sinkSrcAccessFlag == FALSE)
{
EA = 0;
pwrSavingCnt = 0;
pwrSavingTimeMax = PWR_SAVING_TIME_120S;
pwrSavingEn = TRUE;
waitingFlag = TRUE;
sleepFlag = SLEEP_AT_ONCE;
EA = 1;
if(type > MENU_CARTOON_NIGHT_MARE)
type = MENU_CARTOON_SLEEP;
menu.menuIndexLast = MEUN_NO;
menu.menuIndex = type;
type++;
}
// 有外设接入时(充放电状态),倒计时时间到则直接关屏并进入预休眠状态
else
{
waitingFlag = FALSE;
sleepFlag = SLEEP_AT_ONCE;
}
}
} |
|