CC2530学习(四)休眠模式配置及外部中断/睡眠时钟唤醒

文章目录

      • 一、硬件连接
      • 二、寄存器描述(外部中断)
        • (一)、睡眠模式设置
        • (二)、电源模式控制设置
      • 三、示例代码(外部中断)
      • 四、实验现象(外部中断)
      • 五、寄存器描述(睡眠时钟中断)
        • (一)、睡眠模式设置和电源模式控制设置(同上外部中断)
        • (二)、配置定时器比较值
        • (三)、开启中断
      • 六、示例代码(睡眠时钟中断)
      • 七、实验现象(睡眠时钟中断)

一、硬件连接

LED灯阴极接地,通过三极管控制阳极导通状态。按钮电平检测引脚接上拉电阻,当按键按下时电平被拉低。

二、寄存器描述(外部中断)

(一)、睡眠模式设置

睡眠模式通过寄存器**SLEEPCMD的[1:0]**来设置。

CC2530学习(四)休眠模式配置及外部中断/睡眠时钟唤醒_第1张图片

其中各个模式的作用如图所示。

CC2530学习(四)休眠模式配置及外部中断/睡眠时钟唤醒_第2张图片

  • PM0 16/32M高速晶振启动 32768晶振启动,数字核心模块正常工作
  • PM1 16/32M高频晶振关闭 32768晶振启动,数字核心模块正常工作
  • PM2 16/32M高速晶振关闭 32768晶振启动,数字核心模块关闭,系统通过RESET/External Interrupt/SLEEP TIMER唤醒
  • PM3 晶振全部关闭,数字核心模块关闭,系统只能通过RESET/External Interrupt唤醒

(二)、电源模式控制设置

开启SLEEPCMD.MODE设置的电源睡眠模式,通过置位PCON的bit0设备进入电源模式。当该位设置为0时唤醒设备。

CC2530学习(四)休眠模式配置及外部中断/睡眠时钟唤醒_第3张图片

三、示例代码(外部中断)

#include 

#define LED P0_1

void delay_ms(int xms)
{     
  int  i,j;
  for(i=xms;i>0;i--)
    for(j=587;j>0;j--);
}

void LED_Init(void)
{
  P0SEL &= ~0X02;
  P0DIR |= 0X02;
}

void Key_Init(void)
{
  P0IEN |= 0X04;//使能P0.2中断
  PICTL |= 0X01;//设置全部端口中断方式为下降沿触发
  IEN1 |= 0X20;//允许P0口中断
  P0IFG = 0X00;//初始化中断标志位
  EA = 1;//开中断  
}
/*
PM0 16/32M高速晶振启动 32768晶振启动,数字核心模块正常工作
PM1 16/32M高频晶振关闭 32768晶振启动,数字核心模块正常工作
PM2 16/32M高速晶振关闭 32768晶振启动,数字核心模块关闭,系统通过RESET/External Interrupt/SLEEP TIMER唤醒
PM3 晶振全部关闭,数字核心模块关闭,系统只能通过RESET/External Interrupt唤醒
*/
void SysPowerMode(char mode)
{
  if(mode<4)
  {
    SLEEPCMD |= mode;//设置睡眠模式
    delay_ms(5);//延时大于3ms
    PCON = 0X01;//进入指定的mode睡眠模式
  }
  else
  {
    PCON = 0;//系统唤醒
  }
}

int main(int argc, char* argv[])
{
  char count = 0;
  LED_Init();
  Key_Init();
//  IEN0 |= 0X20;//开启睡眠定时器中断
  while(1)
  {
    LED = !LED;
    if(++count>=10)
    {
      count = 0;
      SysPowerMode(3);//灯闪烁5次后进入PM3睡眠模式
    }
    delay_ms(500);
  }
  return 0;
}

#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
  P0IFG &= ~0X04;//请P0.2中断标志位
  P0IF = 0;//清中断标志位
  SysPowerMode(4);//这里写0也可以吧
}

四、实验现象(外部中断)

LED灯闪烁5次后CC2530进入PM3休眠模式,通过按键的外部中断唤醒芯片。

五、寄存器描述(睡眠时钟中断)

首先看定时器描述,睡眠时钟(Sleep Timer)是一个通过ST2:ST1:ST0但各寄存器组成的24位定时器,在配置ST的比较值时注意要在配置ST0之前要先配置好ST2和ST1,然后等到STDLOAD.LDRDY位为1时计数值加载完成。同时ST中断标志位是STIF,通过置位IEN0.STIE位来开启它的中断。

CC2530学习(四)休眠模式配置及外部中断/睡眠时钟唤醒_第4张图片

(一)、睡眠模式设置和电源模式控制设置(同上外部中断)

略略略~

(二)、配置定时器比较值

下面三个寄存器用于配置睡眠定时器三个寄存器的数值。

在这里插入图片描述CC2530学习(四)休眠模式配置及外部中断/睡眠时钟唤醒_第5张图片

在对上面三个寄存器赋完值之后需要添加一个等待配置完成的阻塞程序。while(STLOAD&0X01); 避免配置错误。
在这里插入图片描述

(三)、开启中断

开启睡眠定时器ST中断STIE和总中断EA

CC2530学习(四)休眠模式配置及外部中断/睡眠时钟唤醒_第6张图片

六、示例代码(睡眠时钟中断)

#include 

#define LED P0_1

void delay_ms(int xms)
{     
  int  i,j;
  for(i=xms;i>0;i--)
    for(j=587;j>0;j--);
}

void LED_Init(void)
{
  P0SEL &= ~0X02;
  P0DIR |= 0X02;
  LED = 0;
}

void Key_Init(void)
{
  P0IEN |= 0X04;//使能P0.2中断
  PICTL |= 0X01;//设置全部端口中断方式为下降沿触发
  IEN1 |= 0X20;//允许P0口中断
  P0IFG = 0X00;//初始化中断标志位
  EA = 1;//开中断  
}
/*
PM0 16/32M高速晶振启动 32768晶振启动,数字核心模块正常工作
PM1 16/32M高频晶振关闭 32768晶振启动,数字核心模块正常工作
PM2 16/32M高速晶振关闭 32768晶振启动,数字核心模块关闭,系统通过RESET/External Interrupt/SLEEP TIMER唤醒
PM3 晶振全部关闭,数字核心模块关闭,系统只能通过RESET/External Interrupt唤醒
*/
void SysPowerMode(char mode)
{
  if(mode<4)
  {
    SLEEPCMD |= mode;//设置睡眠模式
    delay_ms(5);//延时大于3ms
    PCON = 0X01;//进入指定的mode睡眠模式
  }
  else
  {
    PCON = 0;//系统唤醒
  }
}

void SleepTimer_Init(void)
{
  ST2 = 0X00;//设置初值,ST2 ST1 ST0默认值为0xFF 0xFF 0xFF
  ST1 = 0XFF;
  ST0 = 0XFF;
  while(!STLOAD&0x01);//等待加载定时时间
  STIE = 1;//IEN0 |= 0X20; 开启睡眠定时器中断
  STIF = 0;//清空中断标志位
  EA = 1;//开启总中断
}

void SleepTimer_Set(int sec)
{
  unsigned long sleepTime = 0;
  sleepTime |= ST0;
  sleepTime |= (long)ST1<<8;
  sleepTime |= (long)ST2<<16;
  sleepTime += sec * 32768;//定时时间为sec秒
  ST2 = (char)(sleepTime>>16);
  ST1 = (char)(sleepTime>>8);
  ST0 = (char)sleepTime;
  while(!STLOAD&0x01);//等待加载完定时时间
}

int main(int argc, char* argv[])
{
  char count = 0;
  int i = 0;
  LED_Init();
  SleepTimer_Init();
  while(1)//睡眠定时器唤醒
  {
    for(i = 0;i < 4;i++)//LED闪烁两次
    {
      LED = !LED;
      delay_ms(500);
    }
    SleepTimer_Set(3);//设置3s后唤醒
    SysPowerMode(2);//PM2可以被睡眠定时器唤醒
  }
//  return 0;
}

#pragma vector = ST_VECTOR
__interrupt void ST_ISR(void)
{
  STIF = 0;//清空标志位
  SysPowerMode(4);//唤醒,进入正常工作模式
}

七、实验现象(睡眠时钟中断)

LED灯闪烁2次后CC2530进入PM2休眠模式,3s后设备自动唤醒,继续执行程序。

你可能感兴趣的:(CC2530)