对于嵌入式系统而言,一个非常重要的内容就是低功耗,尽可能减少电量损耗,然后获得更多的续航时间
当然功耗越低,被关闭的功能也就越多
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 或外部中断唤醒。
睡眠模式控制寄存器SLEEPCMD
? 可以设置我们刚刚讲到的那五种睡眠模式
供电模式控制寄存器PCON
? 设置睡眠模式之后,还要设置供电模式
睡眠计数器STx,
? 通过设置STx可以设置睡眠的时间长短
读睡眠定时器读的流程为:读ST0→读ST1→读ST2。
从PM1和PM2唤醒可以通过三种方式:复位、外部中断和睡眠定时器,
从PM3唤醒可以通过两种方式:复位和外部中断。
对于复位方式,进行系统的复位,即RESET来唤醒即可,不涉及到编程。
所以编程主要涉及到外部中断和睡眠定时器唤醒
对于睡眠定时器方式,涉及到ST2、ST1和ST0寄存器。首先从这三个寄存器中读取到当前定时器的计数值,接着对该计数值进行修改(表示睡眠的时长),最后将该修改后的计数值写入到三个寄存器中,使定时器能够进行比较。对于该种方式,首先要明白,寄存器和定时器是两个独立的东西,当不读ST2、ST1和ST0寄存器时,其中始终保存一个比较值,当定时器值与寄存器值相等时发生中断,而定时器的值会在正边沿时进行一次更新。当读ST2、ST1和ST0寄存器时,会自动获取24位定时器的值
对于外部中断模式,需要根据选择的外部中断方式编写中断函数,在中断函数中,对标志位进行清零,最后将模式设置为主动模式即可。
//初始化休眠定时器,设定后经过指定时间自行唤醒程序如下:
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;
}