虽然这是个有线键盘,但为了未来使用无线的场景,还是提前把低功耗做进去了。
一、全速运行
全速运行的判断标准就是有灯效在运行,用户一旦打开灯效,就从浅休眠模式、深度休眠模式下恢复到该状态继续运行。
二、浅休眠
在用户关闭后灯效后,就进入了该模式,此时定时器会修改成低频时钟运行,每20ms唤醒,检测按键,然后发送数据给RF芯片,时间可以变动,时间越快功耗也就越高。目前在20ms唤醒,正常打字mcu功耗大概在200-300uA。
case Green: //低功耗
SLEEP(); //休眠
Keyboard_Event();
Btn_LongPress();
Keyboard_AutoSleep(); //自动休眠
if((KeyParam.LedEn)||(RGBRemoveFlag))
{
SystemState_Shift(FullSpeed);
}
else
{
if(UsbSend.U8)
UE = 1;
while(UsbSend.U8)
{
Keyboard_Report();
if(!TX0IE && T0MCLR) //等待串口发送完成
break;
}
UE = 0;
}
break;
三、深度休眠
此状态下,mcu完全休眠,仅通过按键电平唤醒或者电脑唤醒,如果不是usb状态下mcu功耗小于1uA,处于usb模式下则功耗在160uA。
进入前配置:
void SystemState_Shift(system_state_t state)
{
if(state != SystemState)
{
switch(state)
{
case FullSpeed:
if(SystemState==Green)
{
TC2C = 0;
TC2PR = T2Value;
}
RGBMgr_Config();
TC0EN = 1;
TC0IE = 1;
TC0IF = 0;
break;
case Green:
{
TC0EN = 0;
TC2C = 0;
TC2PR = 6399; //定时器2切为20ms
RGBMgr_DeConfig();
STPL = 0;
}
break;
case DeepSleep:
TC0EN = 0;
TC0IE = 0;
TC0IF = 0;
RGBMgr_DeConfig();
Delayms(100); //等待灯全部关闭,并且VDD稳定
OEF = 0XFC; //按键行输出低,用于按键唤醒
IOF = 0;
INTCR1 |= 0x0e; //按键列打开IO中断
INTF1 &= ~0x0e;
if(KeyParam.DeviceType==DevUsb)
{
if(!USBRemoteWake) //检查是否允许远程唤醒
{
INTCR1 &= ~0x0e; //按键列关闭IO中断
}
USBD_SwBusDeinit();
}
STPL = 1;
break;
default:break;
}
SystemState = state;
}
}