1、CC2530 ZigbeeStack中功耗管理是如何实现的?
方法:动态调整睡眠定时器的溢出周期,MCU进入睡眠模式,由睡眠定时器中断或者外部中断唤醒MCU
2、程序实现:
(1)void osal_pwrmgr_powerconserve( void )
(2)uint32 osal_next_timeout( void )
(3)void halSleep( uint32 osal_timeout )
不理解void halSleep( uint32 osal_timeout )中的轮询,时间递减的原理。
(1)为什么每次减去的是HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME );
(2)设置电源模式: HAL_SLEEP_SET_POWER_MODE()中, HAL_DISABLE_INTERRUPTS();
唤醒源:睡眠定时器中断或者外部中断,但是这里关闭了中断,那系统是如何唤醒的??
do
{
/* 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 );
halSleepSetTimer(HAL_SLEEP_MS_TO_320US( MAX_SLEEP_TIME ));
}
else
{
/* set sleep timer */
halSleepSetTimer(timeout);
timeout = 0;
}
/* set up sleep timer interrupt */
HAL_SLEEP_TIMER_CLEAR_INT();
HAL_SLEEP_TIMER_ENABLE_INT();
}
/* Prep CC2530 power mode */
HAL_SLEEP_PREP_POWER_MODE(halPwrMgtMode);
/* save interrupt enable registers and disable all interrupts */
HAL_SLEEP_IE_BACKUP_AND_DISABLE(ien0, ien1, ien2);
HAL_ENABLE_INTERRUPTS();
/* set CC2530 power mode, interrupt is disabled after this function
* Note that an ISR (that could wake up from power mode) which runs
* between the previous instruction enabling interrupts and before
* power mode is set would switch the halSleepPconValue so that
* power mode shall not be entered in such a case.
*/
HAL_SLEEP_SET_POWER_MODE();
/* the interrupt is disabled - see halSetSleepMode() */
/* restore interrupt enable registers */
HAL_SLEEP_IE_RESTORE(ien0, ien1, ien2);
/* disable sleep timer interrupt */
HAL_SLEEP_TIMER_DISABLE_INT();
} while(timeout != 0);