嵌入式系统(九)电源低功耗管理
Published in:2023-12-10 | category: 嵌入式系统

1 低功耗基本介绍

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

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

1.1 五种运行模式

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

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

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

image-20231201200510123

运行的影响如表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 系统睡眠+定时器唤醒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//初始化休眠定时器,设定后经过指定时间自行唤醒程序如下:
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;
}
Prev:
嵌入式系统(十)直接访问内存DMA
Next:
嵌入式系统(八)看门狗