[ZigBee] 10、ZigBee之睡眠定时器
0、概述
睡眠定时器用于设置系统进入和退出低功耗睡眠模式之间的周期。睡眠定时器还用于当进入低功耗睡眠模式时,维持定时器2 的定时。
睡眠定时器的主要功能如下:
● 24 位的定时器正计数器,运行在32kHz 的时钟频率
● 24 位的比较器,具有中断和DMA 触发功能
● 24 位捕获
1、概述
睡眠定时器是一个24 位的定时器,运行在一个32kHz 的时钟频率(可以是RCOSC 或XOSC)上。定时器在复位之后立即启动,如果没有中断就继续运行。定时器的当前值可以从SFR 寄存器ST2:ST1:ST0 中读取。
2、定时器比较
一次定时器比较发生在定时器的值等于24位比较器的值,寄存器ST2:ST1:ST0可以用来设置比较器的值。 当STLOAD.LDRDY=1写入ST0发起加载新的比较值。当STLOAD.LDRDY=0软件不能开始一个新的加载,直到它为1。
Reading ST0 captures(捕获) the current value of the 24-bit counter. Thus, the ST0 register must be read before ST1 and ST2 to capture a correct Sleep Timer count value.
When a timer compare occurs the interrupt flag STIF is asserted.
The current timer value is updated each time a positive clock edge on the 32 kHz clock is detected by the system clock. Thus, when returning from PM1/2/3 (where the system clock is shut down) the Sleep Timer value in ST2:ST1:ST0 is not up-to-date if a positive edge on the 32 kHz clock has not been detected yet. To ensure an updated value is read, wait for a positive transition on the 32 kHz clock by polling(轮询) the SLEEPSTA.CLK32K bit, before reading the Sleep Timer value.
The interrupt enable bit for the ST interrupt is IEN0.STIE, and the interrupt flag is IRCON.STIF.
当运行在除了PM3之外的所有供电模式,睡眠定时器才会运行。因此,睡眠定时器的值在PM3模式下不保存。在PM1和PM2模式下,睡眠定时器捕获事件用来唤醒设备到active模式进行active操作。The default value of the compare value after reset is 0xFF FFFF。
The Sleep Timer compare can also be used as a DMA trigger, here I don't want to talk about.
Note that: if supply voltage drops below 2 V while in PM2, 睡眠间隔 might be affected.
3、定时器捕获
当设置了已选I/O 引脚的中断标志,且32 kHz 时钟检测到这一事件时,发生定时器捕获。 Sleep Timer capture is enabled by setting STCC.PORT[1:0] and STCC.PIN[2:0] to the I/O pin that is to be used to trigger the capture. When STCS.VALID goes high, the capture value in STCV2:STCV1:STCV0 can be read.
捕获值多于在I/O 引脚上的事件瞬间的值,因此如果时序需要,软件必须从捕获的值中间减去一个。要使能一个新的捕获,遵循以下步骤:
1. 清除STCS.VALID。
2. 等待直到SLEEPSTA.CLK32K 变为低电平。
3. 等待直到SLEEPSTA.CLK32K 变为高电平。
4. 清除P0IFG/P1IFG/P2IFG 寄存器中的引脚中断标志。
This sequence, using rising edge on P0.0 as an example, is shown in following:
It is not possible to switch input capture pin while capture is enabled. Capture must be disabled before a new input capture pin can be selected. To disable capture follow these steps (if disabling interrupts for up to half a 32 kHz cycle (~15.26 ms) is OK):
1. Disable interrupts
2. Wait until SLEEPSTA.CLK32K is high.
3. Set STCC.PORT[1:0] to 3. This disables capture.
4、睡眠定时器寄存器
睡眠定时器使用的寄存器是:
• ST2 – 睡眠定时器2
• ST1 – 睡眠定时器1
• ST0 – 睡眠定时器0
· STLOAD – 睡眠定时器加载状态
· STCC – 睡眠定时器捕获控制
· STCS – 睡眠定时器捕获状态
· STCV0 – 睡眠定时器捕获值字节0
· STCV1 – 睡眠定时器捕获值字节1
· STCV2 – 睡眠定时器捕获值字节2
5、DEMO PROJECT——系统睡眠中断唤醒
Zigbee的特点是远距离低功耗的无线传输设备,节点模块闲时可以进入睡眠模式,在需要传输数据时候进行唤醒,能进一步节省电量。
系统电源有以下几种管理模式:
- * 全功能模式:高频晶振(16M或者32M)和低频晶振(32.768K RCOSC/XOSC)全部工作,数字处理器模块正常工作;
* PM1:高频晶振关闭,低频晶振正常工作,数字核心模块正常工作;
* PM2:低频晶振工作,数字核心模块关闭,系统通过RESET,外部中断或者睡眠计数器溢出唤醒;
* PM3:晶振全部关闭,数字处理器核心模块关闭,系统只能通过RESET或者外部中断唤醒,此模式功耗最低;
本工程实现的功能是:将睡眠模式下的CC2530通过安检中断唤醒,观察LED闪烁现象。
代码:
/****************************************************************************
* 文 件 名: main.c
* 描 述: LED1闪烁3次后进入睡眠状态,通过按下按键S1产生外部中断进行唤醒
****************************************************************************/
#include <ioCC2530.h> typedef unsigned char uchar;
typedef unsigned int uint; #define LED1 P1_0 //P1.0口控制LED1
#define KEY1 P0_1 //P0.1口控制S1 /****************************************************************************
* 名 称: DelayMS()
* 功 能: 以毫秒为单位延时 16M时约为535,系统时钟不修改默认为16M
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{
uint i,j; for (i=; i<msec; i++)
for (j=; j<; j++);
} /****************************************************************************
* 名 称: InitLed()
* 功 能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
P1DIR |= 0x01; //P1.0定义为输出口
LED1 = ; //LED1灯上电默认为熄灭
} /****************************************************************************
* 名 称: InitKey()
* 功 能: 设置KEY相应的IO口,采用中断方式
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitKey()
{
P0IEN |= 0x2; // P0.1 设置为中断方式 1:中断使能
PICTL |= 0x2; //下降沿触发
IEN1 |= 0x20; //允许P0口中断;
P0IFG = 0x00; //初始化中断标志位
EA = ; //打开总中断
}
/****************************************************************************
* 名 称: SysPowerMode()
* 功 能: 设置系统工作模式
* 入口参数: mode等于0为PM0 1为PM1 2为PM2 3为PM3
* 出口参数: 无
****************************************************************************/
void SysPowerMode(uchar mode)
{
if(mode > && mode < )
{
SLEEPCMD |= mode; //设置系统睡眠模式
PCON = 0x01; //进入睡眠模式 ,通过中断唤醒
}
else
PCON = 0x00; //主动/空闲模 通过中断唤醒系统
}
/****************************************************************************
* 名 称: P0_ISR(void) 中断处理函数
* 描 述: #pragma vector = 中断向量,紧接着是中断处理程序
****************************************************************************/
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
if(P0IFG > )
{
P0IFG = ; //清标志位
} P0IF = ; //清中断
SysPowerMode(); //正常工作模式
} /****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
uchar i=; InitLed(); //设置LED灯相应的IO口
InitKey(); //设置KEY相应的IO口 while()
{
for (i=; i<; i++) //LED1闪烁3次提醒用户将进入睡眠模式
{
LED1 = ~LED1;
DelayMS();
} SysPowerMode(); //进入睡眠模式PM3,按下按键S1中断唤醒系统
}
}
第46~53行按键中断可以参考[ZigBee] 4、ZigBee基础实验——中断中的介绍,我们重点看:
61 void SysPowerMode(uchar mode)
62 {
63 if(mode > 0 && mode < 4)
64 {
65 SLEEPCMD |= mode; //设置系统睡眠模式
66 PCON = 0x01; //进入睡眠模式 ,通过中断唤醒
67 }
68 else
69 PCON = 0x00; //主动/空闲模 通过中断唤醒系统
70 }
其中SLEEPCMD:在main函数中设置为3表示进入10模式即power mode2模式,此时低频晶振工作,数字核心模块关闭,系统可通过RESET,外部中断或者睡眠计数器溢出唤醒,也就是进入了休眠模式~
PCON为:给该位赋值1导致设备强制进入SLEEPCMD.MODE设置的Power Mode,在活动时任何使能的中断都会导致该位被清0,设备重新进入活动模式。因此当触发按键中断传入SysPowerMode中的参数为4,将执行PCON=0x00,使系统重新进入活动状态。
该工程本应该在电源管理部分讲完之后讲,不过放在这里大家就照着寄存器逐行代码去理解吧~~~
Zigbee系列文章:
[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭
[ZigBee] 5、ZigBee基础实验——图文与代码详解定时器1(16位定时器)(长文)
[ZigBee] 6、ZigBee基础实验——定时器3和定时器4(8 位定时器)
[ZigBee] 7、ZigBee之UART剖析(ONLY串口发送)
[ZigBee] 8、ZigBee之UART剖析·二(串口收发)
[ZigBee] 9、ZigBee之AD剖析——AD采集CC2530温度串口显示
PS:如果您觉得还不错,点个赞,让更多人受益~
@beautifulzzzz 2016-07-16 continue~
e-mail:beautifulzzzz@qq.com
sina:http://weibo.com/beautifulzzzz?is_all=1
[ZigBee] 10、ZigBee之睡眠定时器的更多相关文章
- [ZigBee] 11、ZigBee之睡眠定时器二
1.前言 上一节讲了Zigbee的睡眠定时器利用外部按键使系统从休眠态唤醒到工作态,其核心在于: 61 void SysPowerMode(uchar mode) 62 { 63 if(mode &g ...
- zigbee学习之路(八):定时器1(中断)
一.前言 通过上次的实验,我们已经学会了定时器3的中断方式,这次,我们来看看定时器1通过中断怎么控制. 二.原理分析 定时器1的初始化跟前面提到的一样,也是要配置寄存器T1CTL,还要进行开中断的操作 ...
- zigbee学习之路(七):定时器3(中断方式)
一.前言 上次我们学习了了用定时器3进行查询方式来进行溢出判断,今天我们来换一种方式,用中断方式来检测和查询定时器3的溢出. 二.原理与分析 要使用定时器3,我们必须先要配置的是T3CTL,来把定时器 ...
- zigbee学习之路(五):定时器1(查询方式)
一.前言 今天,我们来学习几乎所有单片机都有的功能,定时器的使用,定时器对单片机来说是相当重要的,有了它,单片机就可以进行一些复杂的工作. 二.原理与分析 谈到定时器的控制,我们最先想到的是要给它赋初 ...
- [ZigBee] 13、ZigBee基础阶段性回顾与加深理解——用定时器1产生PWM来控制LED亮度(七色灯)
引言:PWM对于很多软件工程师可能又熟悉又陌生,以PWM调节LED亮度为例,其本质是在每个周期都偷工减料一些,整体表现出LED欠压亮度不同的效果.像大家看到的七色彩灯其原理也类似,只是用3路PWM分别 ...
- [ZigBee] 12、ZigBee之看门狗定时器——饿了就咬人的GOOD DOG
引言:硬件中的看门狗,不是门卫的意思,而是一只很凶的狗!如果你不按时喂它,它就会让系统重启!这反而是我们想要的功能~ 1.看门狗概述 看门狗定时器(WDT,Watch Dog Timer)是单片机的一 ...
- [ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)
说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入 ...
- [ZigBee] 15、Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子(长文,OSAL及Zigbee入门知识)
1.Zigbee协议栈简介 协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收.协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通过使用协议栈来使用 ...
- [ZigBee] 14、Zigbee无线通信前奏——BasicRF 简单无线点对点传输协议
本工程不带zigbee协议栈,作为过渡 实验现象: 一个EB2530(终端A)定义为发射模块,另一个EB2530(终端B)定义为接收模块. 按EB2530(终端A)上的按键,无线控制另一个EB2530 ...
随机推荐
- oracle 11gr2 官方文档下载
http://www.oracle.com/technetwork/database/enterprise-edition/documentation/index.html
- 使用TFS 自动编译时的一点设置
MSBuild参数: /p:VisualStudioVersion=10.0 指定使用的VS编译版本
- 13.Xcode开发的快捷键
1.文件 CMD + N: 新文件: CMD + SHIFT + N: 新项目: CMD + O: 打开: CMD + S: 保存: CMD + SHIFT + S: 另存为: CMD + W: 关闭 ...
- linux指令记录
sudo mount /dev/sda3 data 挂载硬盘到当前目录下的data文件夹
- nginx日常运维
pid丢失办法: 1.查找nginx进程ID ps -ef | grep nginx 2.将进程ID写入pid > /tmp/nginx.pid 3.重启nginx
- 一台MySQL服务器启动多个端口
一台MySQL服务器启动多个端口 在测试Mysql多主一从服务器,即一个从服务器多端口同步不同主库.本文记录了开启不同端口的操作. 详细步骤: 1.首先要先把my.cnf配置文件复制一份,开几个端口要 ...
- Linux下Bash入门学习笔记
学习好shell编程是很有用的,可以使用shell脚本轻巧地完成有趣的工作. 本文地址:http://www.cnblogs.com/yhLinux/p/4047516.html 1. Bash实例, ...
- 「2014-2-8」Reading a blog on the pain points of Global Variables of C language
晚上读到一篇<C 语言全局变量那些事儿>.我先前对链接的理解不深,算是涨了一番姿势.此文吐槽的重点,是「非 static 限定的全局变量」带来的看似出人意料(实则可以被合理解释)的行为.虽 ...
- 黑马程序员-NSDictionary和NSMutableDictionary
NSDictionary和NSMutableDictionary:通过key和value进行对应,进行存储元素,能够方便提取所需的元素.key是不能够重复出现,但是value能够重复出现.NSDict ...
- sqlserver 2008 数据库表结构脚本及数据导出
sqlserver2008 在xp上尝试安装了 sqlserver2008 express版本,但是和公司的sqlserver2008 r2 版本不兼容.升级的时候,出了问题.所以换了中思路,将数据 ...