八、低功耗

虽然这是个有线键盘,但为了未来使用无线的场景,还是提前把低功耗做进去了。

一、全速运行

全速运行的判断标准就是有灯效在运行,用户一旦打开灯效,就从浅休眠模式、深度休眠模式下恢复到该状态继续运行。

二、浅休眠

在用户关闭后灯效后,就进入了该模式,此时定时器会修改成低频时钟运行,每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;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值