串口透传在没做省电的时候,发射时功耗在8mA左右,接收时在4mA左右,所以平均电流也是有几个毫安的。完全打不到蓝牙低功耗的要求。
低功耗省电需要做以下几步:
第一步打开宏POWER_SAVING;此时电流应该可以降到1mA以下。
第二步开流控,睡眠时P04,P05流控脚,即CTS,RTS同时为低;往串口发数据时RTS拉高,接收串口数据时CTS拉高;
第三步用IO口P20控制蓝牙广播状态,高时关闭广播,低时打开广播;
经过以上三步后串口透传的睡眠电流基本被控制在30uA左右,但是还需要再优化;但是发现在往下优化已经很难,后来经过调试发现是扫描P20这个IO口的问题,程序在
#if (defined HAL_KEY) && (HAL_KEY == TRUE)
/* Check for keys */
HalKeyPoll();
/* if interrupt disabled, do next polling */
if (!Hal_KeyIntEnable)
{
osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);
}
#endif
设置了KEY事件被100ms扫描一次,执行一次事件动作2ms,程序未做处理的时候,每次扫描事件的时候,就扫描一次按键,即P20口,即
100ms内要被扫描50次,损耗了一部分电流。
所以我们让它对P20口少扫描几次,当无按键中断产生的时候,我们STOP掉KEY事件扫描;当有中断产生后P20被拉低,此时我们再开启
KEY事件扫描,即20ms后(前面有10几个事件)执行到KeyFobApp_ProcessEvent事件后,我们做以下处理
if(!(P2&BV(0)))
{
//HalUARTWrite(0, "Hello word\n", 12);
//Hal_KeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;
osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);
}
执行完KEY后,KEY事件又会回到先前的设置,做完以上处理后,再用万用表或示波器测量电流,已经降到10uA以下。
阅读(4164) | 评论(0) | 转发(0) |