(一)中断唤醒

一、实验内容

通过中断唤醒在睡眠模式下的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开发板学习笔记(七)—— 睡眠唤醒的更多相关文章

  1. CC2540开发板学习笔记(五)——串口通信

    (一)串口发送 一.实验现象: 开发板实现功能发送 二.实验过程 1.PL2303 USB转串口电路图 2.串口发送 (1)查看用户手册有: UART0 对应的外部设备 IO 引脚关系为: P0_2 ...

  2. CC2540开发板学习笔记(三)——外部中断

    一.实验内容 通过外部中断方式依次按下按键S1控制LED1的亮灭 二.实验过程 1.电路原理图同上 2.中断的概念 比如说我们在执行main函数时,突然来了个指令.优先级比现在执行的main还高,那我 ...

  3. CC2540开发板学习笔记(二)——按键

    一.实验内容 用按键S1控制LED1的亮和灭 二.实验过程 1.电路原理: 可以看出,当S按下P0.0和P0.1接地,反之则接高电压. 2.寄存器使用: 依旧应该首先进行3个基本寄存器的设定,对LED ...

  4. CC2540开发板学习笔记(九)—— BLE协议简介

    一.BLE协议简介 1.协议是什么? 协议是一系列的通信标准,双方需要共同按照这进行正常数据 协议是一系列的通信标准,双方需要共同按照这进行正常数据发射和 接收.协议栈是的具体实现形式,通俗点来理解就 ...

  5. CC2540开发板学习笔记(一)——LED点亮

    一.实验内容: 点亮LDE1.2 二.实验原理: 1.电路原理图: 就一个发光二极管串联一个电阻.电阻是为了防止电流过大.利用发光二极管的单向导电性,在P1为高电平是点亮LED,在低电平是熄灭LED. ...

  6. CC2540开发板学习笔记(八)—— 看门狗

    一.功能: 防止程序跑飞,使得系统重新进入工作状态,即一种复位操作吧. 但需要不停地喂狗= =(就是不断的执行某种操作),假如说你的程序跑到了不知道哪里去的错误时,即不会实现喂狗,就会发生复位,程序就 ...

  7. CC2540开发板学习笔记(六)——AD控制(自带温度计)

    一.实验目的 将采集的内部温度传感器信息通过串口发送到上位机 二.实验过程 1.寄存器配置 ADCCON1(0XB4)ADC控制寄存器1 BIT7:EOC   ADC结束标志位0:AD转换进行中    ...

  8. CC2540开发板学习笔记(四)——定时器

    一.实验内容 分别使用定时器T1和T3使得LED周期性闪烁 二.实验过程 1.定时器T1(查询IRCON来控制) (1)需要调配的寄存器 T1CTL(0XE4) Timer1控制寄存器   BIT3, ...

  9. 【4412嵌入式开发板学习笔记】认识uboot

    转自迅为讨论群:http://www.topeetboard.com 重要说明:这份笔记不是4412开发配套的,是我在网上看视频的时候下载上课老师的笔记后修改的.所以我试了一下笔记上的uboot命令, ...

随机推荐

  1. Jquery中的 height(), innerHeight() outerHeight()区别

    jQuery中的 height innerHeight outerHeight区别 标准浏览器下: height:高度 innerHeight:高度+补白 outerHeight:高度+补白+边框,参 ...

  2. UISearchBar和 UISearchDisplayController的使用

    感觉好多文章不是很全面,所以本文收集整合了网上的几篇文章,感觉有互相补充的效果. 如果想下载源码来看:http://code4app.com/search/searchbar .本源码与本文无关 1. ...

  3. 陷阱~EF中的Update与Insert共用一个数据上下文

    事情是这样的,有一个列表,里面有很多用户信息,可能会有重复的用户,将这个列表的用户插入到数据表中,如果用户已经存在,就更新这个用户的FillTimes 字段,让它加1,使用的底层ORM是entity ...

  4. apache配置多个虚拟主机

    设置apache 多个虚拟目录记录 #配置第2个虚拟目录<VirtualHost 127.0.0.2:80>ServerName www.xx.comDocumentRoot " ...

  5. 构建seajs业务模块之grunt VS spm build

    在最开始,我并不知道grunt可以构建CMD模块.(以下spm指代spm build) 当时正困惑于如何用spm方便的构建业务模块,后来看到@twinstony (感谢@twinstony的分享)使用 ...

  6. [整理]Ajax Post请求下的Form Data和Request Payload

    Ajax Post请求下的Form Data和Request Payload 通常情况下,我们通过Post提交表单,以键值对的形式存储在请求体中.此时的reqeuest headers会有Conten ...

  7. js实现剪切、复制、粘贴——clipBoard.js

    摘要: 最近项目上要实现一个点击按钮复制链接的功能,刚开始查找了一些资料,找了几款插件,ZeroClipboard是通过flash实现的复制功能,随着越来越多的提议废除flash,于是就想能不能通过j ...

  8. centos linux从无到有安装wordpress

    序:本博客从无到有搭建wordpress,包括从服务器和域名购买,会将步骤一步一步记录下来.如果你也是新手,那你有福了,因为我的系统是centos,对号入座啊. 目录 一.准备域名和服务器一.安装ph ...

  9. c++字符串详解(转)

    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是 ...

  10. 二叉树建立,先序、中序、后序遍历(c实现)

    建立树ABC##DE#G##F###,输出 #include <stdio.h> #include <stdlib.h> #define ElemType char //节点声 ...