首先是低功耗的代码分析:
main
–>osal_start_system()
–>osal_run_system()
–>osal_pwrmgr_powerconserve()
上面的代码就是轮询代码,只要你设置了宏POWER_SAVING,程序就会进入低功耗。
接下来就是我自己控制程序什么时候进入低功耗什么时候退出低功耗(方法很多,这只是本人走过的道):
①宏配置
Option-->c/c++ compoler-->Preprocessor:
INT_HEAP_LEN=3080
HALNODEBUG
OSAL_CBTIMER_NUM_TASKS=1
HAL_AES_DMA=TRUE
HAL_DMA=TRUE
HAL_LCD=FALSE
HAL_LED=FALSE
HAL_KEY=FALSE
HAL_UART=TRUE
POWER_SAVING
xCC2540_MINIDK
②修改文件_hal_uart_dma.c,注释掉后编译,再注释相应报错。
③_Main.c文件这里注释,不注释系统很快就进入低功耗了,因为我们项目工程还需要做很多进入低功耗前的一些设置,因此,我们手动进入低功耗,由此牵扯出了第四步设置
④ OSAL_PwrMgr.c文件,主要是if语句那里加多一个限制,因为系统太智能了,你option配置了低功耗的宏,程序跑起来会一直来到这里,然后自动进去低功耗,我们需要控制它。要不然进入低功耗前的配置(io口,外设等)还没有做好就进入了导致其他地方有电流消耗。
上面第④步加了个限制,那个限制可以在应用层代码我们自己进行随意控制。
void Lowmode_set(uint8 data)
{
Lowmode_exit_flag = data;
}
void Lowmode_get(uint8 *data)
{
*data = Lowmode_exit_flag;
}
/**************
**@brief-- 进入低功耗前的操作准备
**
************************/
void Lowmode_into(void)
{
...(进入低功耗前的配置)
osal_pwrmgr_device(PWRMGR_BATTERY);//低功耗
Lowmode_set(PWRMGR_BATTERY);
}
/**************
**@brief-- 退出低功耗后的操作准备
**
************************/
void Lowmode_exit(void)
{
...(添加退出低功耗前的操作,串口初始化。。。)
Lowmode_set(PWRMGR_ALWAYS_ON);//内部低功耗管理操作用到--OSAL_PwrMgr.c->240行
osal_pwrmgr_device(PWRMGR_ALWAYS_ON);//把低功耗关了,才能正常使用串口
}
PWRMGR_BATTERY & PWRMGR_ALWAYS_ON这两个宏很重要,可以自己去爬代码,深入了解。