目录
一、实验介绍
低功耗运行是通过不同的运行模式(供电模式)使能的。各种运行模式指的是主动模式、空闲模式和供电模式1、2 和3(PM1-PM3)。超低功耗运行的实现通过关闭电源模块以避免静态(泄露)功耗,还通过使用门控时钟和关闭振荡器来降低动态功耗。
二、实验目的
- 通过本实验了解CC2530 的电源相关寄存器的配置;
- 通过本实验了解CC2530的电源不同休眠模式的运用。
三、实验设备
3.1、硬件设备
- ZIGBEE开发板
- SmartRF04EB仿真器
3.2、软件环境
- IAR Embedded Workbench for 8051集成开发环境
四、实验原理
4.1、电源管理简介
不同的运行模式或供电模式用于低功耗运行。超低功耗运行的实现通过关闭电源模块以避免静态(泄露) 功耗,还通过使用门控时钟和关闭振荡器来降低动态功耗。
有五种不同的运行模式(供电模式),叫做主动模式、空闲模式、PM1、PM2 和 PM3。主动模式是一般模式,而 PM3 具有最低的功耗。

主动模式:全速运行,高速时钟(32M/16M)运行。
空闲模式:CPU停止,时钟不停。
PW1:高速时钟停止,低速时钟运行。
PW2:内部稳定器工作,内存内容全部保留。
PW3:内部稳定器不工作,低速时钟停止,内存内容全部保留。
4.2、供电模式
4.2.1、主动模式
完全功能模式。CPU\外设、RF收发器都活动,稳压器的数字内核开启。
主动模式用于一般操作。在主动模式下,通过往PCON寄存器低0位写入1,CPU内核就停止运行,并进入空闲模式。从空闲模式转换到主动模式,所有其他外设正常工作,CPU内核将被任何使能的中断唤醒。
4.2.2、空闲模式模式
处于空闲模式时,CPU内核停止运行,稳压器的数字内核照常开启。
4.2.3、PW1模式
在PW1模式下,高频振荡器掉电,稳压器和32kHz振荡器开启。
当进入PW1模式时,只运行一个掉电序列,复位、外部中断或睡眠定时器使能时系统返回主动模式。
PW1使用的上电/掉电序列较快,等待唤醒事件的预期时间相对较短,小于3ms。
4.2.4、PW2模式
PW2具有较低的功耗。在PW2下的上电复位时刻、外部中断、所选的32kHz振荡器和睡眠定时器外设是活动的。
在进入PW2模式前,将保留IO口的模式和输出电平。进入PW2模式,就只运行一个掉电序列,所有其他电路都是掉电的,稳压器也是关闭的。
当睡眠定时器作为唤醒事件并结合外部中断时,一般会进入PW2模式。但睡眠时间超过3ms时选择PW2模式。
4.2.5、PW3模式
PW3是功耗最低的运行模式。在该模式下,稳压器供电的所有内容电路都关闭,内部稳压器和振荡器也关闭。
在进入PW3模式前,将保留IO口的模式和输出电平。在该模式下RAM和寄存器内容可以部分保留,只有复位和外部IO口中断可运行,使能复位或外部中断将唤醒设备并进入主动模式。
在等待外部事件时PW3模式下可获得超低功耗。
4.3、电源管理控制
通过配置SLEEPCMD寄存器后2位和PCON寄存器第0位可以选择供电模式。
来自端口引脚或睡眠定时器使能的中断,或上电复位将葱任意供电模式唤醒设备,并返回主动模式。
当进入PW1、PW2或PW3时,将运行一个掉电序列。
4.4、相关寄存器
往PCON寄存器的第0位写入1进入供电模式控制,写入0时返回主动模式。

配置SLEEPCMD寄存器的后2位可以配置供电模式。

五、实验演示
现在我们要实现外部中断唤醒系统,期间LED1常亮,LED2进行0.5s闪烁10次后休眠。
首先创建pw.c和pw.h文件,在pw.c文件内进行供电模式的切换:
#include "headfile.h"
void sys_powermode(uint8_t mode)
{
if(mode<4) //0-主动/空闲模式 1-PW1 2-PW2 3-PW3
{
PCON = 0x01; //0000 0001 进入供电模式控制
SLEEPCMD |= mode; //进入对应的供电模式
}
else PCON = 0x00; //唤醒设备
}
由于我们用外部中断来唤醒设备,所以我们用按键1使能外部中断,使用外部中断一定要初始化IO口和对应的外部中断初始化,这里的按键1外部中断配置可参考实验“4-CC2530 外部中断配置”。
#include "iocc2530.h" //头文件
#include "headfile.h"
void main(void)
{
uint8_t i;
led_init();
key_init();
while(1)
{
LED2 = !LED2;
LED1 = 1;
delayms(500);
if(++i == 20) //当LED2闪烁10次进入睡眠
{
i = 0;
LED1 = 0;
sys_powermode(3); //进入PW3模式
}
}
}
#pragma vector = P0INT_VECTOR
__interrupt void p0interrupt(void)
{
if(P0IFG & 0x01) //判断是否进入中断
{
delayms(10); //按下消抖
while(KEY1 == 0);
delayms(10); //释放消抖
}
sys_powermode(4); //唤醒设备返回主动模式
//消除中断状态标志位
P0IFG = 0;
P0IF = 0;
}
可以明显观察到上电时LED1常亮,LED2进行0.5s闪烁10次后LED1和LED2熄灭,当按下KEY1时LED恢复上述现象。
有疑问可以加入QQ群交流:324611467
4913

被折叠的 条评论
为什么被折叠?



