嵌入式(八)电源低功耗管理 | 五种运行模式 模式转换 睡眠定时器唤醒

2024-01-09 23:49:07

1 低功耗基本介绍

对于嵌入式系统而言,一个非常重要的内容就是低功耗,尽可能减少电量损耗,然后获得更多的续航时间

当然功耗越低,被关闭的功能也就越多

1.1 五种运行模式

CC2530有5种不同的运行模式(供电模式):

分别为主动模式、空闲模式、PM1、PM2 和PM3。

越靠后,被关闭的功能越多,功耗也越低,PM3具有最低的功耗。

在这里插入图片描述

运行的影响如表8.1所示,其中还给出了稳压器和振荡器选择。

主动模式是一般模式。主动模式:完全功能模式。稳压器的数字内核开启,16MHz RC振荡

器或32MHz晶体振荡器运行,或者两者都运行。32kHz RCOSC振荡器或32kHz XOSC运行。

空闲模式:除CPU 内核停止运行(即空闲外),其他功能和主动模式一样。

PM1:高频晶振(16MHz或32MHz)关闭,低频晶振(32.768kHzRCOSC/XOSC)工作,数字核心模块正常工作。

PM2:低频晶振(32.768KHz RCOSC/XOSC )工作, 数字核心模块关闭,系统通过 RESET,外部中断或睡眠计数器溢出唤醒。

PM3:晶振全部关闭,数字核心模块关闭,系统只能通过 RESET 或外部中断唤醒。

2 低功耗控制相关寄存器

睡眠模式控制寄存器SLEEPCMD

? 可以设置我们刚刚讲到的那五种睡眠模式

供电模式控制寄存器PCON

? 设置睡眠模式之后,还要设置供电模式

睡眠计数器STx,

? 通过设置STx可以设置睡眠的时间长短

读睡眠定时器读的流程为:读ST0→读ST1→读ST2。

3 睡眠唤醒实现方式

从PM1和PM2唤醒可以通过三种方式:复位、外部中断和睡眠定时器,

从PM3唤醒可以通过两种方式:复位和外部中断。

对于复位方式,进行系统的复位,即RESET来唤醒即可,不涉及到编程。

所以编程主要涉及到外部中断和睡眠定时器唤醒

对于睡眠定时器方式,涉及到ST2、ST1和ST0寄存器。首先从这三个寄存器中读取到当前定时器的计数值,接着对该计数值进行修改(表示睡眠的时长),最后将该修改后的计数值写入到三个寄存器中,使定时器能够进行比较。对于该种方式,首先要明白,寄存器和定时器是两个独立的东西,当不读ST2、ST1和ST0寄存器时,其中始终保存一个比较值,当定时器值与寄存器值相等时发生中断,而定时器的值会在正边沿时进行一次更新。当读ST2、ST1和ST0寄存器时,会自动获取24位定时器的值

对于外部中断模式,需要根据选择的外部中断方式编写中断函数,在中断函数中,对标志位进行清零,最后将模式设置为主动模式即可。

3.1 系统睡眠+定时器唤醒

//初始化休眠定时器,设定后经过指定时间自行唤醒程序如下:
void InitSleepTimer(void)
{
	ST2 = 0X00;
	ST1 = 0X0F;
	ST0 = 0X0F;
	EA = 1; //开中断
	STIE = 1; //睡眠定时器中断使能0:中断禁止 1:中断使能
	STIF = 0; //睡眠定时器中断标志 0:无中断未决 1: 中断未决
}

//设置系统工作模式程序如下。
void SysPowerMode(uchar mode)
{
if(mode < 4)
{
	SLEEPCMD |= mode; //设置系统睡眠模式
	PCON = 0x01; //进入睡眠模式 ,通过中断唤醒
}
else
	PCON = 0x00; //通过中断唤醒系统
}

//设置睡眠时间
void Set_ST_Period(uint sec)
{
	ulong sleepTimer = 0;
	sleepTimer |= (ulong)ST1 << 8;
	sleepTimer |= (ulong)ST2 << 16;
	sleepTimer += ((ulong)sec * (ulong)32768);
	ST2 = (uchar)(sleepTimer >> 16);
	ST1 = (uchar)(sleepTimer >> 8);
	ST0 = (uchar) sleepTimer;
}

文章来源:https://blog.csdn.net/Q52099999/article/details/135490089
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。