当 CPU 的 Wake Timer0 或 者 Wake Timer1 计数为 0 时 CPU 将会被唤醒,并触发 vISR_SystemController 硬件中断 ISR 服务函数。在 PWRM_vWakeInterruptCallback 中将会调用 PWRM_eScheduleActivity 注册的 Wake Event 回调函数。如果 Wake Event 链表中仍有其他未超时的事件,则继续启动 Wake Timer1 定时器准备休眠。
在实际开发阶段,需要特别注意 PWRM_eScheduleActivity 函数调用时机,否则将无法使 J N 516x 进入低功耗休眠状态:
A. 在调用 PWRM_eScheduleActivity 函数之前应该保证没有激活的软件定时器。否则将不会调用 PreSleep 函数,无法进入睡眠状态。当调用 PWRM_u16GetActivityCount 函数返回当前活跃的个数为 0 时,表示系统允许进入低功耗睡眠。
B. 不能重复调度同一个 Wake Event,否则 PWRM_eScheduleActivity 将返回 PWRM_E_TIMER_RUNNING 错误。即使 PWRM_eScheduleActivity 返回成功后 JN516x 并不会马上休眠。只有当 PWRM_vManagePower 判断满足休眠条件后 JN516x 才会进入休眠。
C. 当 Wake Timer 启动后,将在 32 kHz 时钟驱动下自动递减计数器。需要通过特殊步骤才能修改 Wake Timer 计数器。例如,应用设定 10 s 的 Wake Timer 当在第 9 秒时由于 GPIO 唤醒了 CPU 后 重新进入休眠,则 1 s 后 Wake Timer 将会唤醒 CPU。如果需要在当前时刻点起重新设定 Wake Timer1 唤醒时间,可以调用 vAHI_WakeTimerStartLarge 函数重新设置计数器。
D. 即使 PWRM_eScheduleActivity 函数返回成功后,ZigBee 协议栈内部某些软件定时器例如 MAC 重传定时器、APS 重传定时器等将会阻止 PWRM_vManagePower 使 CPU 进入休眠状态。在 vISR_SystemController 中断服务函数不要遗漏执行 PWRM_vWakeInterruptCallback 函数,否则 Wake Event 事件不会被被触发,下 一次 PWRM_eScheduleActivity 函数将返回 PWRM_E_TIMER_RUNNING 错误错误,导致系统无法进入休眠。
E. 如果在执行某些重要代码过程中不希望 CPU 进入休眠,可以使用 PWRM_eStartActivity 禁止休眠,执行完毕后需要使用 PWRM_eFinishActivity 允许休眠,这个二个函数改变 s_u16ActivityCounter 计数值。
F. ZigBee SDK 默认使用 Wake Timer1 作为唤醒定时器。用户可以使用 Wake Timer0 作为睡眠计时器。在设备进入睡眠前启动 Wake Timer0 并设置计数值,当唤醒时通过 u64AHI_WakeTimerReadLarge 函数读取 Wake Timer0 的当前计数值,即可获得睡眠时间。Wake Timer 的详细使用方法请参考 <>文档。