文章目录

  • 一、硬件连接
  • 二、寄存器描述(外部中断)
    • (一)、睡眠模式设置
    • (二)、电源模式控制设置
  • 三、示例代码(外部中断)
  • 四、实验现象(外部中断)
  • 五、寄存器描述(睡眠时钟中断)
    • (一)、睡眠模式设置和电源模式控制设置(同上外部中断)
    • (二)、配置定时器比较值
    • (三)、开启中断
  • 六、示例代码(睡眠时钟中断)
  • 七、实验现象(睡眠时钟中断)

一、硬件连接

LED灯阴极接地,通过三极管控制阳极导通状态。按钮电平检测引脚接上拉电阻,当按键按下时电平被拉低。

二、寄存器描述(外部中断)

(一)、睡眠模式设置

睡眠模式通过寄存器**SLEEPCMD的[1:0]**来设置。

其中各个模式的作用如图所示。

  • PM0 16/32M高速晶振启动 32768晶振启动,数字核心模块正常工作
  • PM1 16/32M高频晶振关闭 32768晶振启动,数字核心模块正常工作
  • PM2 16/32M高速晶振关闭 32768晶振启动,数字核心模块关闭,系统通过RESET/External Interrupt/SLEEP TIMER唤醒
  • PM3 晶振全部关闭,数字核心模块关闭,系统只能通过RESET/External Interrupt唤醒

(二)、电源模式控制设置

开启SLEEPCMD.MODE设置的电源睡眠模式,通过置位PCON的bit0设备进入电源模式。当该位设置为0时唤醒设备。

三、示例代码(外部中断)

#include <ioCC2530.h>#define LED P0_1void delay_ms(int xms)
{     int  i,j;for(i=xms;i>0;i--)for(j=587;j>0;j--);
}void LED_Init(void)
{P0SEL &= ~0X02;P0DIR |= 0X02;
}void Key_Init(void)
{P0IEN |= 0X04;//使能P0.2中断PICTL |= 0X01;//设置全部端口中断方式为下降沿触发IEN1 |= 0X20;//允许P0口中断P0IFG = 0X00;//初始化中断标志位EA = 1;//开中断
}
/*
PM0 16/32M高速晶振启动 32768晶振启动,数字核心模块正常工作
PM1 16/32M高频晶振关闭 32768晶振启动,数字核心模块正常工作
PM2 16/32M高速晶振关闭 32768晶振启动,数字核心模块关闭,系统通过RESET/External Interrupt/SLEEP TIMER唤醒
PM3 晶振全部关闭,数字核心模块关闭,系统只能通过RESET/External Interrupt唤醒
*/
void SysPowerMode(char mode)
{if(mode<4){SLEEPCMD |= mode;//设置睡眠模式delay_ms(5);//延时大于3msPCON = 0X01;//进入指定的mode睡眠模式}else{PCON = 0;//系统唤醒}
}int main(int argc, char* argv[])
{char count = 0;LED_Init();Key_Init();
//  IEN0 |= 0X20;//开启睡眠定时器中断while(1){LED = !LED;if(++count>=10){count = 0;SysPowerMode(3);//灯闪烁5次后进入PM3睡眠模式}delay_ms(500);}return 0;
}#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{P0IFG &= ~0X04;//请P0.2中断标志位P0IF = 0;//清中断标志位SysPowerMode(4);//这里写0也可以吧
}

四、实验现象(外部中断)

LED灯闪烁5次后CC2530进入PM3休眠模式,通过按键的外部中断唤醒芯片。

五、寄存器描述(睡眠时钟中断)

首先看定时器描述,睡眠时钟(Sleep Timer)是一个通过ST2:ST1:ST0但各寄存器组成的24位定时器,在配置ST的比较值时注意要在配置ST0之前要先配置好ST2和ST1,然后等到STDLOAD.LDRDY位为1时计数值加载完成。同时ST中断标志位是STIF,通过置位IEN0.STIE位来开启它的中断。

(一)、睡眠模式设置和电源模式控制设置(同上外部中断)

略略略~

(二)、配置定时器比较值

下面三个寄存器用于配置睡眠定时器三个寄存器的数值。

在对上面三个寄存器赋完值之后需要添加一个等待配置完成的阻塞程序。while(STLOAD&0X01); 避免配置错误。

(三)、开启中断

开启睡眠定时器ST中断STIE和总中断EA

六、示例代码(睡眠时钟中断)

#include <ioCC2530.h>#define LED P0_1void delay_ms(int xms)
{     int  i,j;for(i=xms;i>0;i--)for(j=587;j>0;j--);
}void LED_Init(void)
{P0SEL &= ~0X02;P0DIR |= 0X02;LED = 0;
}void Key_Init(void)
{P0IEN |= 0X04;//使能P0.2中断PICTL |= 0X01;//设置全部端口中断方式为下降沿触发IEN1 |= 0X20;//允许P0口中断P0IFG = 0X00;//初始化中断标志位EA = 1;//开中断
}
/*
PM0 16/32M高速晶振启动 32768晶振启动,数字核心模块正常工作
PM1 16/32M高频晶振关闭 32768晶振启动,数字核心模块正常工作
PM2 16/32M高速晶振关闭 32768晶振启动,数字核心模块关闭,系统通过RESET/External Interrupt/SLEEP TIMER唤醒
PM3 晶振全部关闭,数字核心模块关闭,系统只能通过RESET/External Interrupt唤醒
*/
void SysPowerMode(char mode)
{if(mode<4){SLEEPCMD |= mode;//设置睡眠模式delay_ms(5);//延时大于3msPCON = 0X01;//进入指定的mode睡眠模式}else{PCON = 0;//系统唤醒}
}void SleepTimer_Init(void)
{ST2 = 0X00;//设置初值,ST2 ST1 ST0默认值为0xFF 0xFF 0xFFST1 = 0XFF;ST0 = 0XFF;while(!STLOAD&0x01);//等待加载定时时间STIE = 1;//IEN0 |= 0X20; 开启睡眠定时器中断STIF = 0;//清空中断标志位EA = 1;//开启总中断
}void SleepTimer_Set(int sec)
{unsigned long sleepTime = 0;sleepTime |= ST0;sleepTime |= (long)ST1<<8;sleepTime |= (long)ST2<<16;sleepTime += sec * 32768;//定时时间为sec秒ST2 = (char)(sleepTime>>16);ST1 = (char)(sleepTime>>8);ST0 = (char)sleepTime;while(!STLOAD&0x01);//等待加载完定时时间
}int main(int argc, char* argv[])
{char count = 0;int i = 0;LED_Init();SleepTimer_Init();while(1)//睡眠定时器唤醒{for(i = 0;i < 4;i++)//LED闪烁两次{LED = !LED;delay_ms(500);}SleepTimer_Set(3);//设置3s后唤醒SysPowerMode(2);//PM2可以被睡眠定时器唤醒}
//  return 0;
}#pragma vector = ST_VECTOR
__interrupt void ST_ISR(void)
{STIF = 0;//清空标志位SysPowerMode(4);//唤醒,进入正常工作模式
}

七、实验现象(睡眠时钟中断)

LED灯闪烁2次后CC2530进入PM2休眠模式,3s后设备自动唤醒,继续执行程序。

CC2530学习(四)休眠模式配置及外部中断/睡眠时钟唤醒相关推荐

  1. stm32芯片休眠模式_STM32的运行、睡眠、停止和待机四种工作模式

    01 前言 按功耗由高到低排列,STM32具有运行.睡眠.停止和待机四种工作模式.上电复位后 STM32 处于运行状态,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式降低功耗,这三种模式中, ...

  2. 【STM32学习笔记】(13)——外部中断详解

    EXTI 简介         EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20 个中断/事件线.每个输入线可以独立地配置 ...

  3. 玩转 ESP32 + Arduino (四) 电容按键 霍尔传感器 外部中断 延时 脉冲检测

    一. 电容输入 touchRead(pin) 及电容输入中断touchAttachInterrupt(pin, TSR , threshold) ESP32专门提供了电容触摸传感器的功能, 共有T0, ...

  4. esp32外部中断_玩转 ESP32 + Arduino (四) 电容按键 霍尔传感器 外部中断 延时 脉冲检测...

    一. 电容输入 touchRead(pin) 及电容输入中断touchAttachInterrupt(pin, TSR , threshold) ESP32专门提供了电容触摸传感器的功能, 共有T0, ...

  5. stm32f407 休眠模式_STM32进入和退出睡眠模式

    1.设计要求 要求系统按如下方式进入和退出睡眠模式:在系统启动2秒后,将RTC在3秒钟之后配置为产生一个报警事件,接着通过WFI指令使系统进入停机模式.如果要唤醒系统到正常模式,可通过按Key按钮;否 ...

  6. nmi中断配置_外部中断NMI中断.ppt

    外部中断NMI中断.ppt * 1.先看其引脚结构再看功能1. 可编程的含义:通过对芯片编程,使芯片实现不同的功能. 中断比较多的情况下,使用中断控制器来管理中断. 用来管理系统的硬件中断. * 1. ...

  7. RabbitMQ学习(四) 订阅模式-Direct(直连)

    直连模式说明 在fanout模式中,一条消息,会被所有订阅的队列都消费,但是在某些场景下,我们希望不同的消息被不同的队列消费,这时就要用到Direct类型的Exchange. 使用说明 1.相较于fa ...

  8. 微信小程序学习(四)路由页面配置

    创建路由,也就是把我们之前几个示例的页面连起来,可以相互跳转 在app.json添配置  是给主页面添加tab页 代码 {"pages": ["pages/todo/to ...

  9. 【STM32笔记】低功耗模式配置及避坑汇总

    [STM32笔记]低功耗模式配置及配置汇总 文章总结:(后续更新以相关文章为准) [STM32笔记]低功耗模式.WFI命令等进入不了休眠的可能原因(系统定时器SysTick一直产生中断) [STM32 ...

最新文章

  1. 一次挂死(hang)的处理过程及经验
  2. Varnish3.0中文入门教程-应用篇2
  3. 枚举类型的定义与使用
  4. 【工具】TFT彩屏图片点阵取模工具,Img2Lcd图片取模软件,图片生成c语言头文件...
  5. mysqlbinlog -v与-vv --base64-output 与不加的区别
  6. 一个自动完成插件的类(TextBox 版)
  7. [转]TCP协议中的三次握手和四次挥手(图解)
  8. Project编写功能点的规划时间
  9. 消融实验——Ablation experiment
  10. python的目的_Python-** wargs的目的和用途是什么?
  11. 关于python安装scipy模块的问题
  12. What's new document web part for SharePoint v1.1 [Free]
  13. spring-第四篇之让bean获取所在的spring容器
  14. brctl 设置ip_Linux 网桥配置命令:brctl | 学步园
  15. 1.14阅读论文:A Composite Failure Precursor for Condition Monitoring...Shuai Zhao等
  16. SpringBoot2.x系列教程84--SpringBoot中整合日志功能
  17. 智慧消防三维地理信息应急指挥平台
  18. 扫描转换html,html+css实现图片扫描仪特效
  19. 中粮集团智慧园区网,锐捷用匠心打造工业4.0时代智能工厂
  20. 【论文阅读】A Comprehensive Study on Cross-View Gait Based Human Identification with Deep CNNs

热门文章

  1. 2021-11-06 编程打印空心菱形
  2. 将杂乱无章的数字排序
  3. cisco路由器ios升级宝典
  4. MaterialInstanceDynamic /Game/Map/UEDPIE_0_MainMap.MainMap:PersistentLevel.None.MaterialInstanceDyna
  5. 灵性·挖掘:自我迭代之路
  6. 中心极限与大数定理律的关系_素数定理的介绍+非常简单的推导
  7. Linux统计文件行数的几种方法
  8. SDSC2018 Day1
  9. pytorch的下载解决方案(下载出错、下载过慢问题)
  10. 使用canvas画布实现高斯模糊效果