打印
[Zigbee]

CC2530系统睡眠唤醒--定时器唤醒

[复制链接]
1320|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gwsan|  楼主 | 2019-8-2 10:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1 理论分析
当定时器的值等于 24 位比较器的值,就发生一次定时器比较。通过写入寄存器 ST2:ST1:ST0 来设置比较值。当 STLOAD.LDRDY 是 1 写入 ST0 发起加载新的比较值,即写入 ST2、ST1 和 ST0 寄存器的最新的值。

加载期间 STLOAD.LDRDY 是 0,软件不能开始一个新的加载,直到 STLOAD.LDRDY 回到 1。读 ST0 将捕获 24 位计数器的当前值。因此,ST0 寄存器必须在 ST1和 ST2 之前读,以捕获一个正确的睡眠定时器计数值。当发生一个定时器比较,中断标志 STIF 被设置。每次系统时钟,当前定时器值就被更新。因此,当从 PM1/2/3(这期间系统时钟关闭)返回,如果尚未在 32kHz 时钟上检测到一个正时钟边沿,ST2:ST1:ST0 中的睡眠定时器值不更新, 要保证读出一个最新的值, 必须在读睡眠定时器值之前,在 32kHz 时钟上通过轮询 SLEEPSTA.CLK32K 位,等待一个正的变换。

ST 中断的中断使能位是 IEN0.STIE,中断标志是 IRCON.STIF。

当运行在所有供电模式,除了 PM3 时,睡眠定时器将开始运行。因此,睡眠定时器的值在 PM3 下不保存。在 P1 和 PM2 下睡眠定时器比较事件用于唤醒设备,返回主动模式的主动操作。复位之后的比较值的默认值是 0xFFFFFF。
睡眠定时器比较还可以用作一个 DMA 触发。

注意:如果电压降到 2V 以下同时处于 PM2,睡眠间隔将会受到影响


使用特权

评论回复
评论
dirtwillfly 2019-8-3 20:44 回复TA
感谢分享 

相关帖子

沙发
gwsan|  楼主 | 2019-8-2 10:53 | 只看该作者
2 实验详解
2.1实验目的
掌握几种系统电源模式的基本设置及切换。
将睡眠模式下的CC2530 通过定时器唤醒,观察LED 闪烁现象
2.2实验设备
硬件:PC 机一台ZB2530(底板、核心板、仿真器、USB 线) 一套
软件:win7 系统,IAR 8.20 集成开发环境

使用特权

评论回复
板凳
gwsan|  楼主 | 2019-8-2 10:54 | 只看该作者
2.3实验相关电路图

图1 LED电路图

使用特权

评论回复
地板
gwsan|  楼主 | 2019-8-2 10:55 | 只看该作者
2.4实验分析及相关寄存器

相关寄存器PCON,SLEEPCMD, ST0,ST1,ST2,如下表所示:

表1 供电模式控制


使用特权

评论回复
5
gwsan|  楼主 | 2019-8-2 10:56 | 只看该作者
表2 睡眠模式控制


使用特权

评论回复
6
gwsan|  楼主 | 2019-8-2 10:56 | 只看该作者
表3 休眠定时器0


使用特权

评论回复
7
gwsan|  楼主 | 2019-8-2 10:57 | 只看该作者
表4 休眠定时器1


使用特权

评论回复
8
gwsan|  楼主 | 2019-8-2 10:57 | 只看该作者
表5 休眠定时器2


使用特权

评论回复
9
gwsan|  楼主 | 2019-8-2 10:58 | 只看该作者
表6中断使能


使用特权

评论回复
10
gwsan|  楼主 | 2019-8-2 10:58 | 只看该作者
表6中断使能


使用特权

评论回复
11
gwsan|  楼主 | 2019-8-2 10:59 | 只看该作者
表7中断标志


使用特权

评论回复
12
gwsan|  楼主 | 2019-8-2 10:59 | 只看该作者
设置睡眠时间具体配置如下:

sleepTimer |= ST0;
sleepTimer |= (ulong)ST1 << 8;
sleepTimer |= (ulong)ST2 << 16;
sleepTimer += ((ulong)sec * (ulong)32768);
ST2 = (uchar)(sleepTimer >> 16); //应该最先设定
ST1 = (uchar)(sleepTimer >> 8);
ST0 = (uchar) sleepTimer;

配置完毕后sleepTimer 与ST2<<16|ST1<<8|ST0 相差即为睡眠秒数

使用特权

评论回复
13
gwsan|  楼主 | 2019-8-2 10:59 | 只看该作者
2.5参考代码
/**Includes*********************************************************************/
#include <ioCC2530.h>

/**宏定义***********************************************************************/
//定义数据类型
typedef unsigned char uchar;
typedef unsigned int  uint;
typedef unsigned long ulong;
//端口定义
#define LED1 P1_0            //P1.0口控制LED1
#define LED2 P1_1            //P1.1口控制LED2

/**函数声明*********************************************************************/
void DelayMS(uint msec);
void InitLed(void);
void SysPowerMode(uchar mode);
void InitSleepTimer(void);
void Set_ST_Period(uint sec);

使用特权

评论回复
14
gwsan|  楼主 | 2019-8-2 10:59 | 只看该作者
/**
  * @brief     主函数
  * @param     None
  * @retval    None
  */
void main(void)
{  
  uchar i=0;  
      
  InitLed();                         //设置LED灯相应的IO口     
  InitSleepTimer();        //初始化休眠定时器
   
   
  while(1)
  {
    for (i=0; i<6; i++)  //LED1闪烁3次提醒用户将进入睡眠模式
    {
      LED1 = ~LED1;
      DelayMS(500);
    }

    Set_ST_Period(5);   //设置睡眠时间,睡眠5秒后唤醒系统
    SysPowerMode(2);    //重新进入睡眠模式PM2
   
    LED2 = ~LED2;
  }
}

使用特权

评论回复
15
gwsan|  楼主 | 2019-8-2 11:00 | 只看该作者
/**
  * @brief     延时函数
  * @param     msec 延时参数,值越大,延时越久
  * @retval    None
  */
void DelayMS(uint msec)
{
  uint i,j;
   
  for (i=0; i<msec; i++)
    for (j=0; j<535; j++);
}

使用特权

评论回复
16
gwsan|  楼主 | 2019-8-2 11:01 | 只看该作者
/**
  * @brief     设置LED灯相应的IO口
  * @param     None
  * @retval    None
  */
void InitLed(void)
{
  P1DIR |= 0x03;           //P1.0定义为输出口
  LED1 = 1;                //LED1灯上电默认为熄灭
}

使用特权

评论回复
17
gwsan|  楼主 | 2019-8-2 11:02 | 只看该作者
/**
  * @brief     设置系统工作模式
  * @param     mode等于0为PM0 1为PM1 2为PM2 3为PM3
  * @retval    None
  */
void SysPowerMode(uchar mode)
{
    if(mode < 4)
    {  
        SLEEPCMD |= mode;    //设置系统睡眠模式
        PCON = 0x01;         //进入睡眠模式 ,通过中断唤醒
    }
    else
        PCON = 0x00;         //通过中断唤醒系统
}

使用特权

评论回复
18
gwsan|  楼主 | 2019-8-2 11:03 | 只看该作者
/**
  * @brief      ST_ISR(void) 中断处理函数
  * @param     None
  * @retval    None
  */
#pragma vector = ST_VECTOR
__interrupt void ST_ISR(void)
{
    STIF = 0;          //清标志位
    SysPowerMode(4);   //进入正常工作模式
}

使用特权

评论回复
19
gwsan|  楼主 | 2019-8-2 11:03 | 只看该作者
/**
  * @brief     初始化休眠定时器,设定后经过指定时间自行唤醒
  * @param     None
  * @retval    None
  */
void InitSleepTimer(void)
{
    ST2 = 0X00;
    ST1 = 0X0F;
    ST0 = 0X0F;
    EA = 1;     //开中断
    STIE = 1;   //睡眠定时器中断使能 0: 中断禁止     1: 中断使能
    STIF = 0;   //睡眠定时器中断标志 0: 无中断未决   1: 中断未决
}

使用特权

评论回复
20
gwsan|  楼主 | 2019-8-2 11:06 | 只看该作者
/**
  * @brief     设置睡眠时间
  * @param     sec 睡眠时间
  * @retval    None
  */
void Set_ST_Period(uint sec)
{
    ulong sleepTimer = 0;
   
    sleepTimer |= ST0;
    sleepTimer |= (ulong)ST1 <<  8;
    sleepTimer |= (ulong)ST2 << 16;
    sleepTimer += ((ulong)sec * (ulong)32768);
    ST2 = (uchar)(sleepTimer >> 16);
    ST1 = (uchar)(sleepTimer >> 8);
    ST0 = (uchar) sleepTimer;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

3426

帖子

1

粉丝