应广单片机 PMS150G 161 171 基础例子【sleep】

此例子可以测试sleep时候的功耗,测试的时候 要注意sleep退出时间,不能让其反复立马进去,要不然,不好测试。

 

 参考miniC编程助手测试例子,方便自己测试验证

//===========================================//
//					休眠
//主要介绍了省电模式和掉电模式
//省电模式介绍了用计数器唤醒和IO唤醒,
//	例中介绍了T16唤醒后且num自加超过100后退出休眠,即针对不是IO脚电平变化的唤醒条件的唤醒
//	IO唤醒的唤醒条件可参考掉电模式,其他不变
//掉电模式介绍了IO唤醒
//	例中介绍了IO脚电平变化后唤醒,即针对IO脚电平变化的唤醒条件的唤醒
//===========================================//
#include	"extern.h"

byte	CLKMD_BK;

//=======省电模式=========
byte	num;
word	reload_T16;

BIT     KEY	    :   PA.4;  
bit		LED		:	PA.3		//定义LED灯的引脚

void	Save_power(void)
{
	//======User can add code=====
	//进入省电模式前动作,如关灯、关计数器等
	//============================
	CLKMD_BK = CLKMD;					//保存休眠前的时钟
	num = 0;
	while(1)
	{
		$ CLKMD ILRC/1,En_IHRC,En_ILRC;	//系统时钟选择,是否启用IHRC,是否启用ILRC,(En_IHRC和En_ILRC不写为停用,写为启用)
										//系统时钟可选择IHRC/4, IHRC/16, IHRC/2, IHRC/8, ILRC/16, EOSC/4, IHRC/32, EOSC/2, IHRC/64, EOSC/1, EOSC/8, ILRC/4, ILRC/1
										//选择系统时钟为ILRC/1,启用IHLC和IHRC;(注:两个RC振荡器至少有一个开启,否则会出现宕机)
		CLKMD.En_IHRC = 0;				//关闭高频IHRC
		nop;
	//========设置T16定时,详情请参考T16=========
		$ T16M ILRC,/1,bit8;
		reload_T16 = 0;
		stt16 reload_T16;

		stopexe;						//进入省电模式,T16计时溢出时唤醒
		$ CLKMD IHRC/64,EN_IHRC,EN_ILRC;//选择系统时钟为IHRC/64,启用IHLC和IHRC;
		CLKMD.En_ILRC = 0;				//关闭低频ILRC
		nop;
	//=======编写唤醒条件=========
		//例如num自加超过100后唤醒,该方法针对不是IO脚电平变化的唤醒条件
		num++;
		if(num > 100)					//假如发生唤醒而且满足唤醒条件,就返回正常工作
		{								//否则停留在省电模式,继续休眠
			break;
		}
	}
	CLKMD = CLKMD_BK;					//恢复休眠前的时钟

	//======User can add code=====
	//唤醒后打开需要的动作,比如开灯、定时器等
	//============================							
}
//=======掉电模式=========
void	Power_down(void)
{
	//======User can add code=====
	//进入省电模式前动作,如关灯、关计数器等
	//============================

	CLKMD_BK = CLKMD;					//保存休眠前的时钟
	//PAC.0 = 0;PAPH.0 = 1;				//将PA0设置为输入上拉
	//PADIER = 0b0001_0001;				//将PA0设置为数字模式
	//休眠前需要切换低频ILRC用来防止唤醒失败
	$ CLKMD ILRC/1,En_IHRC,En_ILRC;		//系统时钟选择,是否启用IHRC,是否启用ILRC,(En_IHRC和En_ILRC不写为停用,写为启用)
										//系统时钟可选择IHRC/4, IHRC/16, IHRC/2, IHRC/8, ILRC/16, EOSC/4, IHRC/32, EOSC/2, IHRC/64, EOSC/1, EOSC/8, ILRC/4, ILRC/1
										//选择系统时钟为ILRC/1,启用IHLC和IHRC;(注:两个RC振荡器至少有一个开启,否则会出现宕机)
	CLKMD.En_IHRC = 0;					//关闭高频
	nop;
	while(1)
	{
		stopsys;						//进入断电模式
	//=======编写唤醒条件=========
		//例如PA0由高变低唤醒,该方法针对IO脚电平变化的唤醒条件
		if(!PA.0)						//假如发生唤醒而且检查OK,就返回正常工作
		{								//否则停留在断电模式
			break;
		}
	}
	$ CLKMD IHRC/64,EN_IHRC,EN_ILRC;	//选择系统时钟为IHRC/64,启用IHLC和IHRC;
	nop;

	CLKMD = CLKMD_BK;					//恢复休眠前的时钟

	//======User can add code=====
	//唤醒后打开需要的动作,比如开灯、定时器等
	//============================	
}

void	IO_Init(void)
{
	//----------------------------
	PA		=	0b0001_1000;
	PAC		=	0b0000_1000;	//1:输出   0:输入
	PAPH	=	0b0001_1001;	//1:加上拉 0:不加上拉
	PB		=	0b0000_0000;
	PBC		=	0b0000_0000;
	PBPH	=	0b0000_0000;

	PADIER	=	0b0001_0001;	//将PA4 PA0设置为数字模式
	PBDIER	=	0b0000_0000;	//1: 设置为数字模式  
  
		//单个IO设置
	//$ PA.0 out,high;	//PA0输出高
	//$ PA.3 out,low;		//PA3输出低
}
void	FPPA0 (void)
{
	.ADJUST_IC	SYSCLK=IHRC/16, IHRC=16MHz, VDD=5V;
   .delay 40000;

    IO_Init();
 	$ KEY in,pull;		//PA4输入上拉
	$ LED out,high;				//初始把灯点亮(高电平点灯)

	while (1)
	{
		//Save_power();					//省电模式休眠
		
		if(!KEY)  //KEY PA3 拉低进入Sleep模式,PA0拉低退出睡眠模式,方便测试Sleep功耗
	    {
			.delay 10000;   //.delay 1000000;  1000ms = 1s
			if(!KEY) 
			{
		        Power_down();					//掉电模式休眠

				//Save_power();					//省电模式休眠
		
				//$ LED toggle;
			}
		}

	}
}


void	Interrupt (void)
{
	pushaf;

	if (Intrq.T16)
	{	//	T16 Trig
		//	User can add code
		Intrq.T16	=	0;
		//...
	}

	popaf;
}

最小系统板子 测试电流,可惜我自己的万用表精度太差,无法体现出来ua级别 就不上图了

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值