【ZIGBEE(CC2530)学习】10-CC2530基础实验——电源管理模式配置


在这里插入图片描述

一、实验介绍

  低功耗运行是通过不同的运行模式(供电模式)使能的。各种运行模式指的是主动模式、空闲模式和供电模式1、2 和3(PM1-PM3)。超低功耗运行的实现通过关闭电源模块以避免静态(泄露)功耗,还通过使用门控时钟和关闭振荡器来降低动态功耗。

二、实验目的

  1. 通过本实验了解CC2530 的电源相关寄存器的配置;
  2. 通过本实验了解CC2530的电源不同休眠模式的运用。

三、实验设备

3.1、硬件设备

  1. ZIGBEE开发板
  2. SmartRF04EB仿真器

3.2、软件环境

  1. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值