if (events & ZCL_DEVICE_OPEN_DOOR_EVENT) {
osal_pwrmgr_task_state(zclOnOffLight_TaskID, PWRMGR_HOLD);
osal_pwrmgr_device(PWRMGR_ALWAYS_ON);
uint8 writedatalen = 0;
PERCFG = 0x00;
P0SEL |= BV(3); //TX
P0DIR |= BV(3);
P0INP &= ~BV(3);
P2INP &= ~BV(3);
// HalUARTResume();
// HalUARTResume();
DelayMS2(20);//20ms
U0UCR |= BV(7);
// MicroWait(10000);
writedatalen = HalUARTWrite(0,u8_zbOpenDoorBuf,6);
// DelayMS2(100);
// MicroWait(60000);
if ( writedatalen == 6 )
{
// HalUARTSuspend();
opendoorlockcount = 0;
// osal_pwrmgr_device(PWRMGR_ALWAYS_ON);
// osal_pwrmgr_device(PWRMGR_BATTERY);
osal_start_timerEx(zclOnOffLight_TaskID,
ZCL_DEVICE_WEEK_UP_IO_EVENT,
10000);
osal_pwrmgr_task_state(zclOnOffLight_TaskID, PWRMGR_CONSERVE);
osal_pwrmgr_device(PWRMGR_BATTERY);
}
}
本意唤醒CPU后,HOLD住电源,让串口发送数据,但发送数据不完整
Viki Shi:
低功耗下32M晶振关闭,确实会影响串口功能;“本意唤醒CPU后,HOLD住电源,让串口发送数据,但发送数据不完整”是指唤醒后串口还不正常吗?建议唤醒后等待一段时间再发送
Sleeping Forest:
回复 Viki Shi:
已经加了延时的,这是我后面注释掉的,20ms串口还醒不来?
斌斌有礼:
我不知道我们是否是一样的情况,如果你这个事件ZCL_DEVICE_OPEN_DOOR_EVENT是在中断函数里osal_start_timerEx的 那么就会因为休眠对程序有影响。解决方法就是在中断函数里采用osal_set_event这个函数开始一个事件,在这个事件里在开始这个事件
Sleeping Forest:
回复 斌斌有礼:
不是,这个是在接收命令的时候调用的事件,中断没关系,中断和OSAL_START_TIMEREX都可以让CPU醒来,操作就在事件里hold住电源就好。中断里用EX会有影响?
斌斌有礼:
回复 Sleeping Forest:
如果是从PM3模式唤醒的,在中断函数里使用OSAL_START_TIMEREX会有影响
user4381970:
pm2就是不能用串口的,跟事件没有关系,需要外部中断唤醒pm2之后串口数据才能完整。只有使用单独的io设置外部中断唤醒,也可以吧rx引脚设置成外部中断唤醒,这样串口通信的前几个字节是用来唤醒的,后面数据是完整的