- 打卡等级:初来乍到
- 打卡总天数:1
- 最近打卡:2024-04-27 10:34:46
中级会员
- 积分
- 207
|
发表于 2024-3-29 13:43:30
|
显示全部楼层
/*
//////////////////IE
bit7* bit6 bit5* bit4* bit3 bit2 bit1* bit0
EA ELVD EADC 串口1 time1 外部中断1 time0 外部中断0
总开 adc 调试 串口1 滴答
//////////////////IE2
bit7* bit6 bit5* bit4 bit3 bit2 bit1 bit0*
触摸 time4 time3 串口4 串口3 time2 SPI 串口2
按键 pwm
//////////////////P0INTE P06-BAT P07-DC
//////////////////P0WKUE P06-BAT P07-DC
//////////////////RTCIEN rtc中断
//////////////////P5INTE P51,电机对射
*/
#define ENTER_SLEEP_CFG_PIN() do{\
WIFI_SLEEP_IO();\
LED_SLEEP_IO();\
ADC_SLEEP_IO();\
PWM_SLEEP_IO();\
MOTOR_SLEEP_IO();\
REMAIN_SLEEP_IO();\
}while(0)
#define ENTER_SLEEP_DOING() do{\
IE &= ~((1<<5)|(1<<4)|(1<<1));\
_nop_();\
_nop_();\
_nop_();\
_nop_();\
PCON = 0x02;\
_nop_();\
_nop_();\
_nop_();\
_nop_();\
_nop_();\
_nop_();\
IE |= ((1<<5)|(1<<4)|(1<<1));\
}while(0)
#define BREAK_SLEEP_CFG_PIN() do{\
WIFI_CFG_PIN();\
RTC_CFG_PIN();\
TOUCH_CFG_PIN();\
LED_CFG_PIN();\
ADC_CFG_PIN();\
PWM_CFG_PIN();\
MOTOR_CFG_PIN();\
REMAIN_CFG_PIN();\
}while(0)
//休眠处理
void gui_sleep_while(SLEEP_TYPE type)
{
unsigned char rtcbuf[6];//默认深度休眠
rtcbuf[0] = 0xff;
rtcbuf[1] = 0xff;
rtcbuf[2] = 0xff;
/////////////////////////////////// 进入休眠
// 正常休眠--按键、闹钟唤醒
if(type == SLEEP_NORMAL){
// 休眠前准备,检索喂食计划设置闹钟
if(feed_sleep_before(rtcbuf)==0){
return;//休眠时间和喂食时间太近,直接不休眠
}
// 触摸休眠--触摸唤醒
touch_sleep_set(KEY_SLEEP_ENTER);
// 打开闹钟唤醒
RTC_IEN_ALARM();
}
// 深度休眠--仅RTC工作
else{
// 触摸休眠--触摸失能
touch_sleep_set(KEY_SLEEP_DISABLE);
// 深度休眠--RTC不唤醒
RTC_IEN_OFF();
}
// 关闭5V电源
POWER_ALL5V_SET(0);
POWER_MCU3V3_SET(0);
// 关闭屏幕
gui_display_full_set(0);
bsp_sys_delay_n10ms(5);
// 打印闹钟唤醒时间
gui_queue_rtc_alarm(rtcbuf);
gui_queue_push2uart();
// 立即刷新时间和主显
gui_time_ref();
// 发送主显内容,立即显示
gui_main_info.cmd = QUEUE_CMD_MAIN_SLEEP;
gui_queue_main_display();
gui_queue_push2uart();
// 外设IO配置为低功耗
ENTER_SLEEP_CFG_PIN();
bsp_sys_delay_n10ms(5);//稳定IO
// 正式进入休眠
gui_queue_debug_value_api(0x24);
gui_queue_debug_value_api(IE);
gui_queue_debug_value_api(IE2);
gui_queue_debug_value_api(RTCIEN);
gui_queue_debug_value_api(RTCIF);
gui_queue_debug_value_api(DAY);
ENTER_SLEEP_DOING();
gui_queue_debug_value_api(0x24);
gui_queue_debug_value_api(IE);
gui_queue_debug_value_api(IE2);
gui_queue_debug_value_api(RTCIEN);
gui_queue_debug_value_api(RTCIF);
/////////////////////////////////// 退出休眠
// 退出休眠后,设置锁屏状态
gui_main_info.cmd = QUEUE_CMD_MAIN_LOCK;
// 立即刷新时间和主显
gui_time_ref();
gui_queue_main_display();
gui_queue_push2uart();
// 立刻检查喂食计划是否有出粮
feed_check_now();
// 外设IO配置恢复正常模式
BREAK_SLEEP_CFG_PIN();
// 开启秒中断
RTC_IEN_SEC();
// 触摸恢复
touch_sleep_set((type==SLEEP_DEPTH)?KEY_SLEEP_ENABLE:KEY_SLEEP_BREAK);
// 有接DC或电池才打开MCU3.3V
if((POWER_DC_PIN)||(POWER_BAT_PIN)){
POWER_MCU3V3_SET(1);
}
}
其中gui_queue_debug_value_api函数内部用的是串口发送等待while (!TI),
疑问点在于PCON = 0x02;后会有概率性唤不醒,尝试打印各种标志也都是正常的。
|
|