码迷,mamicode.com
首页 > 其他好文 > 详细

CC2540开发板学习笔记(七)—— 睡眠唤醒

时间:2015-03-08 12:57:45      阅读:495      评论:0      收藏:0      [点我收藏+]

标签:

(一)中断唤醒

一、实验内容

     通过中断唤醒在睡眠模式下的CC2540

二、实验原理

1、系统电源管理(工作方式)

(1)全功能模式:

       高频晶振(16M或者32M)和低频晶振(32.768K RCOSC/XOSC)全部工作,数字梳理模块正常工作

(2)PM1:

       高频晶振(16或者32M)关闭,低频晶振(32.768K RCOSC/XOSC)工作,数字核心模块正常工作。

(3)PM2:

       低频晶振(32.768K RCOSC/XOSC)工作,数字核心模块关闭,系统通过RESET,外部中断或者睡眠计时器溢出唤醒

(3)PM3:

        晶振全部关闭,数字处理核心模块关闭,系统只能通过RESET或外部中断唤醒。此模式的功耗最低。

2、LED硬件原理图

技术分享

3、寄存器配置

PCON(0X87)
系统电源模式控制寄存器
BIT0
置1将强制系统进入SLEEPCMD所指定的电源模式,所有中断信号都可以清除此置位 
SLEEPCMD(0XBE)
系统电源模式设定
BIT1:BIT0
00:全功能模式
01:PM1模式
10:PM2模式
11:PM3模式

三、实验代码

#include<ioCC2540.h>

//宏定义声明
#define uint unsigned int
#define uchar unsigned char

#define LED2 P1_1
#define KEY1 P0_0

//函数声明
void Delayms(uint); //延时函数
void InitLed(void); //初始化P1
void SysPowerMode(uchar);   //系统工作模式选择



//延时
void Delayms(uint t)
{
  uint i,j;
  for(i=t;i>0;i--)
  {
    for(j=587;j>0;j--)
    {
      
    }
  }
}


//初始化
void InitLed(void)
{
 P1DIR |= 0x02;  //P1_1 ,LED2 定义为输出
 LED2=0;         //LED2熄灭

 P0INP &= ~0x01;    //设置P0口输入电路模式为上下拉
 P0IEN |= 0X01;    //P0_0设置为中断方式
 PICTL |= 0x01;    //下降沿触发
}


  //系统工作模式选择
void SysPowerMode(uchar mode)
{
 uchar i,j;
 i=mode;
 if(mode<4)
 {
   SLEEPCMD |= i;        //设置系统睡眠模式
     for(j=0;j<4;j++)
     {
       PCON=0x01;     //进入睡眠模式,通过中断关闭
     }
 }
 else
 {
   PCON=0x00;   //唤醒系统
 }
}

//主函数
void main(void)
{
 uchar count=0;   
 InitLed();
 IEN1 |= 0X20;   //开PO口总中断
 P0IFG |= 0x00;  //清中断标志
 EA=1;
 while(1)
 {
  LED2=~LED2;
  if(++count>=10)
  {
    count=0;
    SysPowerMode(3);   //5次闪烁后进入睡眠状态PM3,等待按键S1中断唤醒
  }
  Delayms(500);
 }
}

#pragma vector = P0INT_VECTOR
__interrupt void func(void)
{
 if(P0IFG>0)
 {
   P0IFG=9;
 }
 P0IF=0;
 SysPowerMode(4);
}

CC2540开发板学习笔记(七)—— 睡眠唤醒

标签:

原文地址:http://www.cnblogs.com/BlueMountain-HaggenDazs/p/4321465.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!