标签:
(一)中断唤醒
一、实验内容
通过中断唤醒在睡眠模式下的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); }
标签:
原文地址:http://www.cnblogs.com/BlueMountain-HaggenDazs/p/4321465.html