(一)中断唤醒

一、实验内容

通过中断唤醒在睡眠模式下的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 enableSTIF = 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();    //初始化SLEEPTIMERwhile(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开发板学习笔记(一)——LED点亮

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

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

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

  3. 阿里云HaaS100物联网开发板学习笔记(六)做个智能灯---一个完整的开发例子

    摘要:本篇文章将前期几个专题综合起来,基于阿里云HaaS100的新固件设计制作一个智能灯.这个智能灯由云平台.手机APP端和设备端组成,基本上涵盖了一个物联网小项目所需的主要步骤. 目录 1.在阿里云 ...

  4. 阿里云HaaS100物联网开发板学习笔记(二)硬件控制初步--让小灯闪烁起来

    摘要:无论是哪种开发板,要想开发特定的功能,必先从GPIO开始,HaaS100开发也是一样.如果仅仅利用HaaS100的联网功能,那简直是太浪费了.HaaS100拥有其他开发板所具备的所有的功能,比如 ...

  5. 阿里云HaaS100物联网开发板学习笔记(四)轻应用初步--用javascript连接阿里云物联网平台

    摘要:本篇文章讲解如何使用JavaScript"轻应用"连接阿里云物联网平台并上报一个数据.仍然延续前几篇文章的结构,从安装软件环境开始讲,以使零基础的同学看了本篇文章之后,也能够 ...

  6. 阿里云HaaS100物联网开发板学习笔记(三)轻应用初步--用js让小灯闪烁起来

    摘要:能让JavaScript应用运行在haas100开发板上,这实在是太酷了,这种方式被阿里云称之为"轻应用".本文带各位从零开始,先了解啥是轻应用,然后搭建环境,再一步步将一个 ...

  7. 涂鸦LZ201-CN开发板学习笔记(一)

    涂鸦LZ201-CN开发板学习笔记(一) 前言 一.引出 二.准备流程 1.购买开发板 2.创建产品 (1)创建产品 (2)功能定义 (3)设备交互 (4)硬件开发 3.检查开发板 第一步: 第二步: ...

  8. HaaS600物联网开发板学习笔记(二)---轻应用方式让LED闪烁起来

    摘要:轻应用开发非常方便快捷,gitee上的例程也都是基于HaaS600的,所以,拿HaaS600来逐个测试例程,学习轻应用开发和物联网应用是最合适的.本文介绍一下HaaS600如何使用轻应用来开发. ...

  9. iTOP-RK3568开发板学习笔记(1)编译+烧录系统

    迅为 RK3568 开发板学习笔记 文章目录 准备开发环境 复制 Linux SDK 编译 Buildroot 烧录固件 准备开发环境 将 ITOP-RK3568 资料包中的虚拟机开发环境解压到自己的 ...

最新文章

  1. TensorFlow22: 手写汉字识别
  2. 新加坡广告科技公司AdAsia Holdings获1200万美元A轮融资
  3. 使用 ABAP 控制 Android 原生应用
  4. MVC Model验证
  5. mysql传入乱码_mysql 插入中文乱码解决方案 --转了
  6. 黑马程序员-Java学习笔记之抽象类,接口,多态和内部类
  7. 4. HTTP Status Code
  8. jsp后台页面登录html代码,炫酷的登录jsp页面完整代码
  9. android手机通讯录格式转换,手机通讯录csv格式转vcf格式工具 安卓电话本数据格式转换程序...
  10. 计算机无法显示外接硬盘,移动硬盘不显示怎么办解决教程
  11. android 锁屏界面来电话,android锁屏界面短信解锁指向怎么修改?
  12. OpenCV4学习笔记(27)——轮廓的最大内接圆
  13. 89c51单片机32个心形流水灯
  14. 逻辑删除数据库中的数据。
  15. 读取金山词霸的词库程序
  16. Chrome电脑免安装多个浏览器版本号共存
  17. mysql左连接查询慢
  18. 关于微信小程序的wx.request执行后sucess和fail的问题
  19. 如何在微信分享的网页中显示描述和图片
  20. 数学符号--罗马字母

热门文章

  1. Building with Gulp
  2. 数字经济的发展需要什么样的人才
  3. Visual Prompt
  4. IO流之字节流 +字符流 (复制文件)
  5. zabbix监控redis信息
  6. Mini LED:屏动未来,中国智造闪耀世界
  7. android 6.0 官方下载6,解析工具app v6.0安卓版下载-解析工具app v6.0安卓版官方下载 v6.5_手机乐园...
  8. [CVPR2021-best]GIRAFFE: Representing Scenes as Compositional Generative Neural Feature Fields
  9. 1U和2U服务器应如何正确选择?各有什么优缺点?
  10. rx6700xt和rtx3060ti的差距大吗 哪个好