我之前用SensorDemo做的休眠实验,加上POWER_SAVING,但是没有改成按键中断,所以闪烁的非常快,现在用SampleApp工程,加上了POWER_SAVING和按键中断,但是LED3没有规律的闪烁,我不知道系统还在那里分配了任务阻止节点休眠。所以进行了仿真,在这个过程中我发现一个问题就是当程序运行到这里时:
if ((timeout > HAL_SLEEP_MS_TO_320US(PM_MIN_SLEEP_TIME)) ||
(timeout == 0))
#endif
{
halIntState_t ien0, ien1, ien2;
HAL_ASSERT(HAL_INTERRUPTS_ARE_ENABLED());
HAL_DISABLE_INTERRUPTS();直接从这里跳出去了,执行了
if (halSleepPconValue == 0)
{
/* An interrupt may have changed the sleep decision. Do not sleep at all. Turn on * the interrupt, exit normally, and the next sleep will be allowed.
*/
HAL_ENABLE_INTERRUPTS();
}自此跳出halsleep()函数,第二次进入halsleep()的时候又从
else if (timeout > PM_MIN_IDLE_TIME)
{
/* Timeout is too close to enter power mode. Try idle mode. */
HAL_DISABLE_INTERRUPTS();
/* Interrupt will be enabled in halSleepEnterIdleMode(). */
halSleepEnterIdleMode(timeout); 跳出halsleep()函数,继续运行
void halSleepEnterIdleMode(uint32 timeout)
{
/* enable sleep timer interrupt */
if (timeout != 0)
{
if (timeout > HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME ))
{
timeout = HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME );
}
/* set sleep timer */
halSleepSetTimer(timeout);
/* set up sleep timer interrupt */
HAL_SLEEP_TIMER_CLEAR_INT();
HAL_SLEEP_TIMER_ENABLE_INT();
}
HAL_SLEEP_PREP_IDLE_MODE();
HAL_ENABLE_INTERRUPTS();
HAL_SLEEP_SET_POWER_MODE();
为什么会是这样呢?这到底是进入到PW2了没有啊?而且单步运行的时候LED3就不闪。
VV:
有没有测过电流,看电流值可以确定是否有进PM2模式