CC2540开发板学习笔记(七)—— 睡眠唤醒
(一)中断唤醒
一、实验内容
通过中断唤醒在睡眠模式下的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);
}
定时器唤醒睡眠模式
可以做到一段时间工作,一段时间休眠的效果,也就是说定时器会先使得系统在睡眠模式下也会有一个定时器进行计时,在计时到一段时间后进入中断,改变工作模式,即可做到唤醒睡眠模式,或者在不同的模式下进行切换。
下面是代码
#include<ioCC2540.h> #define uint unsigned int
#define uchar unsigned char #define UINT8 unsigned char
#define UINT16 unsigned int
#define UINT32 unsigned long //定义控制LED灯的端口
#define LED2 P1_1 //定义LED2为P1.1口控制 //函数声明
void Delayms(uint); //延时函数
void InitLed(void); //初始化P1口
void SysPowerMode(uchar sel); //系统工作模式 /****************************
//延时函数
*****************************/
void Delayms(uint xms) //i=xms 即延时i毫秒
{
uint i,j;
for(i=xms;i>0;i--)
for(j=587;j>0;j--);
}
/****************************
//初始化程序
*****************************/
void InitLed(void)
{
P1DIR |= 0x02; //P1_0、P1_1定义为输出
LED2 = 0; //LED2灯熄灭
} /****************************************************************
系统工作模式选择函数
* para1 0 1 2 3
* mode PM0 PM1 PM2 PM3
****************************************************************/
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; // 系统唤醒 ,通过中断打断
}
} /*****************************************
//初始化 Sleep Timer (设定后经过指定时间自行唤醒)
*****************************************/
void Init_SLEEP_TIMER(void)
{
ST2 = 0X00;
ST1 = 0X0F;
ST0 = 0X0F;
EA = 1; //开中断
STIE = 1; //SleepTimerinterrupt enable
STIF = 0; //SleepTimerinterrupt flag 还没处理的
} /*********************************************************************
//设置睡眠时间
*********************************************************************/
void Set_ST_Period(uint sec)
{
UINT32 sleepTimer = 0;
sleepTimer |= ST0;
sleepTimer |= (UINT32)ST1 << 8;
sleepTimer |= (UINT32)ST2 << 16;
sleepTimer += ((UINT32)sec * (UINT32)32768);
ST2 = (UINT8)(sleepTimer >> 16);
ST1 = (UINT8)(sleepTimer >> 8);
ST0 = (UINT8) sleepTimer;
} /***************************
//主函数
***************************/
void main(void)
{
uchar i;
InitLed(); //调用初始化函数
Init_SLEEP_TIMER(); //初始化SLEEPTIMER
while(1)
{
for(i=0;i<6;i++) //闪烁3下
{
LED2=~LED2;
Delayms(200);
}
Set_ST_Period(3); //重新进入睡眠模式
SysPowerMode(2); //进入PM2低频晶振模式
}
}
//中断唤醒
#pragma vector = ST_VECTOR
__interrupt void ST_ISR(void)
{
STIF = 0; //清标志位
SysPowerMode(4); //进入正常工作模式
}
CC2540开发板学习笔记(七)—— 睡眠唤醒的更多相关文章
- CC2540开发板学习笔记(五)——串口通信
(一)串口发送 一.实验现象: 开发板实现功能发送 二.实验过程 1.PL2303 USB转串口电路图 2.串口发送 (1)查看用户手册有: UART0 对应的外部设备 IO 引脚关系为: P0_2 ...
- CC2540开发板学习笔记(三)——外部中断
一.实验内容 通过外部中断方式依次按下按键S1控制LED1的亮灭 二.实验过程 1.电路原理图同上 2.中断的概念 比如说我们在执行main函数时,突然来了个指令.优先级比现在执行的main还高,那我 ...
- CC2540开发板学习笔记(二)——按键
一.实验内容 用按键S1控制LED1的亮和灭 二.实验过程 1.电路原理: 可以看出,当S按下P0.0和P0.1接地,反之则接高电压. 2.寄存器使用: 依旧应该首先进行3个基本寄存器的设定,对LED ...
- CC2540开发板学习笔记(九)—— BLE协议简介
一.BLE协议简介 1.协议是什么? 协议是一系列的通信标准,双方需要共同按照这进行正常数据 协议是一系列的通信标准,双方需要共同按照这进行正常数据发射和 接收.协议栈是的具体实现形式,通俗点来理解就 ...
- CC2540开发板学习笔记(一)——LED点亮
一.实验内容: 点亮LDE1.2 二.实验原理: 1.电路原理图: 就一个发光二极管串联一个电阻.电阻是为了防止电流过大.利用发光二极管的单向导电性,在P1为高电平是点亮LED,在低电平是熄灭LED. ...
- CC2540开发板学习笔记(八)—— 看门狗
一.功能: 防止程序跑飞,使得系统重新进入工作状态,即一种复位操作吧. 但需要不停地喂狗= =(就是不断的执行某种操作),假如说你的程序跑到了不知道哪里去的错误时,即不会实现喂狗,就会发生复位,程序就 ...
- CC2540开发板学习笔记(六)——AD控制(自带温度计)
一.实验目的 将采集的内部温度传感器信息通过串口发送到上位机 二.实验过程 1.寄存器配置 ADCCON1(0XB4)ADC控制寄存器1 BIT7:EOC ADC结束标志位0:AD转换进行中 ...
- CC2540开发板学习笔记(四)——定时器
一.实验内容 分别使用定时器T1和T3使得LED周期性闪烁 二.实验过程 1.定时器T1(查询IRCON来控制) (1)需要调配的寄存器 T1CTL(0XE4) Timer1控制寄存器 BIT3, ...
- 【4412嵌入式开发板学习笔记】认识uboot
转自迅为讨论群:http://www.topeetboard.com 重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的.所以我试了一下笔记上的uboot命令, ...
随机推荐
- jquery基础总结
什么是jQuery? 就是一个JavaScript函数库,开源的.jQuery能做什么 JavaScript是做什么的,jQuery就是做什么的,Jquery是对javas ...
- 我的电脑右下角的日期也不见了只剩下时间,Win7系统,请问是什么原因啊?
A:今天是2013/10/10,日期变为八位,宽度就不够了,把任务栏拉宽就好了 Q:win7 任务栏时间区可以拉宽吗?使之显示日期等 A:你的任务栏锁定了的,右键单击任务栏-锁定任务栏前面的勾去掉,鼠 ...
- mac os 安装 pkg-config
wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.29.tar.gz . env LDFLAGS="-framework ...
- AspectJ报错:error at ::0 can't find referenced pointcut XXX
今天在使用AspectJ进行注解切面时,遇到了一个错误. 切点表达式就是无法识别——详细报错信息如下: Exception in thread "main" org.springf ...
- [flag飞起]
重度Flag: Rush 未来程序・改 (note: 由于代码存放地址原因(物理)无法本周完成) 轻度Flag: 未来程序・改写完后刷QTREE与主席树 严重Flag: 计算几何...
- Java RMI 框架
RMI(即Remote Method Invoke 远程方法调用).在Java中,只要一个类extends了java.rmi.Remote接口,即可成为存在于服务器端的远程对象,供客户端访问并提供一定 ...
- local variable 'xxx' referenced before assignment
这个问题很囧,在外面定义了一个变量 xxx ,然后在python的一个函数或类里面引用这个变量,并改变它的值,结果报错local variable 'xxx' referenced before as ...
- sybaseIQ索引类型和使用注意事项
1. FP(Fast Projection)此索引为默认的索引形式,在创建表时系统自动设置此索引. 特点:用于SELECT.LIKE '%sys%'.SUM(A+B).JOIN操作等语句. 此类型索引 ...
- iOS 关于Layer的疑问
很久很久以前,就对ios的Layer十分的不解,学习了android后,打算通过android中的相关实现,分析一下ios中layer的作用,结果没有找到android中的对应的内容!十分让人郁闷.于 ...
- CSS鼠标样式整理
鼠标样式的标签: cursor:*; //该属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状: 鼠标样式: 值 描述 url 需使用的自定义光标的 URL. 注释:请在此列表的末端始终定义一 ...