历史上的今天
返回首页

历史上的今天

今天是:2025年04月09日(星期三)

正在发生

2019年04月09日 | ZigBee基础实验(八)--定时器一

2019-04-09 来源:eefocus

1、概述

  睡眠定时器用于设置系统进入和退出低功耗睡眠模式之间的周期。睡眠定时器还用于当进入低功耗睡眠模式时,维持定时器2 的定时。

  睡眠定时器的主要功能如下:

● 24 位的定时器正计数器,运行在32kHz 的时钟频率
● 24 位的比较器,具有中断和DMA 触发功能
● 24 位捕获

  睡眠定时器是一个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闪烁现象。

代码:

  1 /****************************************************************************

  2 * 文 件 名: main.c

  3 * 描    述: LED1闪烁3次后进入睡眠状态,通过按下按键S1产生外部中断进行唤醒

  4 ****************************************************************************/

  5 #include

  6 

  7 typedef unsigned char uchar;

  8 typedef unsigned int  uint;

  9 

 10 #define LED1 P1_0            //P1.0口控制LED1

 11 #define KEY1 P0_1            //P0.1口控制S1

 12 

 13 

 14 /****************************************************************************

 15 * 名    称: DelayMS()

 16 * 功    能: 以毫秒为单位延时 16M时约为535,系统时钟不修改默认为16M

 17 * 入口参数: msec 延时参数,值越大,延时越久

 18 * 出口参数: 无

 19 ****************************************************************************/

 20 void DelayMS(uint msec)

 21 { 

 22     uint i,j;

 23     

 24     for (i=0; i

 25         for (j=0; j<535; j++);

 26 }

 27 

 28 /****************************************************************************

 29 * 名    称: InitLed()

 30 * 功    能: 设置LED灯相应的IO口

 31 * 入口参数: 无

 32 * 出口参数: 无

 33 ****************************************************************************/

 34 void InitLed(void)

 35 {

 36     P1DIR |= 0x01;           //P1.0定义为输出口

 37     LED1 = 1;                //LED1灯上电默认为熄灭 

 38 }

 39 

 40 /****************************************************************************

 41 * 名    称: InitKey()

 42 * 功    能: 设置KEY相应的IO口,采用中断方式 

 43 * 入口参数: 无

 44 * 出口参数: 无

 45 ****************************************************************************/

 46 void InitKey()

 47 {

 48     P0IEN |= 0x2;            // P0.1 设置为中断方式 1:中断使能

 49     PICTL |= 0x2;            //下降沿触发   

 50     IEN1 |= 0x20;            //允许P0口中断; 

 51     P0IFG = 0x00;            //初始化中断标志位

 52     EA = 1;                  //打开总中断

 53 }

 54 

 55 /****************************************************************************

 56 * 名    称: SysPowerMode()

 57 * 功    能: 设置系统工作模式

 58 * 入口参数: mode等于0为PM0 1为PM1 2为PM2 3为PM3             

 59 * 出口参数: 无

 60 ****************************************************************************/

 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 }

 71 

 72 /****************************************************************************

 73 * 名    称: P0_ISR(void) 中断处理函数 

 74 * 描    述: #pragma vector = 中断向量,紧接着是中断处理程序

 75 ****************************************************************************/

 76 #pragma vector = P0INT_VECTOR 

 77 __interrupt void P0_ISR(void) 

 78 { 

 79     if(P0IFG > 0) 

 80     { 

 81         P0IFG = 0;           //清标志位

 82     } 

 83     

 84     P0IF = 0; //清中断

 85     SysPowerMode(4);         //正常工作模式

 86 } 

 87 

 88 /****************************************************************************

 89 * 程序入口函数

 90 ****************************************************************************/

 91 void main(void)

 92 {   

 93     uchar i=0;  

 94       

 95     InitLed();                 //设置LED灯相应的IO口     

 96     InitKey();               //设置KEY相应的IO口

 97     

 98     while(1)

 99     {

100         for (i=0; i<6; i++)  //LED1闪烁3次提醒用户将进入睡眠模式

101         {

102             LED1 = ~LED1;

103             DelayMS(500);

104         }

105 

106         SysPowerMode(3);     //进入睡眠模式PM3,按下按键S1中断唤醒系统 

107     }

108 }


第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,使系统重新进入活动状态。


推荐阅读

史海拾趣

FASTRAX公司的发展小趣事

随着公司业务的不断发展,FASTRAX开始积极拓展海外市场,并与多家国际知名企业建立了战略合作关系。通过与这些企业的合作,FASTRAX不仅获得了更多的市场份额,也学习到了先进的管理经验和技术知识。这些合作经验为FASTRAX的持续发展奠定了坚实的基础。

CW Industries公司的发展小趣事

随着全球电子市场的不断扩大,CW Industries也积极拓展其国际业务。公司通过参加各种国际电子展会和交流活动,与全球各地的客户和合作伙伴建立了广泛的联系。这不仅为公司带来了更多的商机,还使得CW Industries能够及时了解国际市场的最新动态和技术趋势。通过这些国际交流活动,CW Industries不断提升其品牌影响力和市场竞争力。

3D PLUS公司的发展小趣事

随着技术的不断发展和市场的不断扩大,3D PLUS公司开始将目光投向国际市场。公司积极参加国际电子行业的展会和交流活动,与国际同行进行技术合作和交流,不断提升自身的技术水平和国际影响力。同时,公司还积极拓展海外销售渠道,将3D技术和产品推向全球市场,为全球客户提供高效、便捷的3D解决方案。这些努力不仅提升了公司在国际市场的知名度,也为公司的长期发展奠定了坚实的基础。

以上五个故事均基于3D PLUS公司在电子行业中的实际发展情况编写,旨在客观描述公司在3D技术领域的成长与进步。

Endicott Research Group Inc (ERG)公司的发展小趣事

自1979年起,Endicott Research Group(ERG)就开始涉足电源转换产品的制造领域。在初创时期,公司面临着资金紧张和技术挑战,但团队坚持创新,专注于为LCD背光供电的LED驱动器及相关电源设备的研发。通过不断的试验和改进,他们成功地开发出了一系列高效稳定的产品,为公司的后续发展奠定了坚实的基础。这一时期的艰苦奋斗和技术积累,成为了ERG发展历程中的重要篇章。

DBS Microwave Inc公司的发展小趣事

随着公司产品的不断成熟和技术的不断进步,DBS Microwave开始积极拓展国际市场。公司参加了多个国际电子展会,与全球各地的客户建立了联系。同时,公司还积极寻求与国际知名企业的合作机会,通过技术交流和合作研发等方式,不断提升自身的技术水平和市场竞争力。这些努力使得DBS Microwave在国际市场上取得了良好的业绩。

DL Instruments LLC公司的发展小趣事

DL Instruments LLC的前身是Ithaco Corporation的精密仪器部门。在Edgar Seymour总裁的领导下,这个部门于1995年被出售给当时担任Ithaco Corporation质量总监的David Woolston先生。这一决定标志着公司从一个大型企业的一个部门,转型为一个独立的、专注于精密仪器制造的新实体——DL Instruments LLC。

问答坊 | AI 解惑

lm741的资料

本帖最后由 paulhyde 于 2014-9-15 09:01 编辑 rt  …

查看全部问答>

两款直流开关电源设计分析

简易型直流开关电源     由TEA1520系列构成的简易型直流开关电源电路如图1所示。                   图1由TEA1520系列构成简易型直流开关电源的电路     为防止 ...…

查看全部问答>

关于铝电解电容漏电流

目前国内设计都用哪些公司的铝电解电容啊! 不同的电压等级的铝电解电容漏电流应该不一样,但是一般大家确定电压等级和容量,没确定型号之前,这个漏电流是怎么估计的?…

查看全部问答>

IA4421无线模块的问题

#include        \"reg52.h\" #include    \"uart.h\" sbit                sdi=        P1^4; sbit            &n ...…

查看全部问答>

在dll里用了这个代码,g_hInst,videownd是从外部传过来的. IDD_CAMERA_DIALOG是dll里的资源,这样为什么不行?如果把IDD_

在dll里用了这个代码,g_hInst,videownd是从外部传过来的.  IDD_CAMERA_DIALOG是dll里的资源,这样为什么不行?如果把IDD_CAMERA_DIALOG也从外部传进来就可以.DialogBoxParam(g_hInst, MAKEINTRESOURCE( IDD_CAMERA_DIALOG ),videownd, (DLG ...…

查看全部问答>

程序列表

  最近想做一个程序列表,就是显示当前正在运行的所有应用程序列表(不是进程),但不知道怎么获取,有没有直接获取的?进程我知道怎么获取。   谢谢大家提供信息。…

查看全部问答>

如何降低嵌入式设备中的电视卡的工作能耗?

一个装有Linux的嵌入式设备,要减少其电视卡的功耗该如何处理啊?(电视卡为mini pci接口) 我的想法有: 1. 让系统待机。但是不知道让系统待机的话,该电视卡是否还在继续接收电视信号? 2. 关闭电视卡的接收端口,但不知怎么写啊,那位大虾推 ...…

查看全部问答>

STM32F103的USB/CAN怎么共用?(电路设计问题)

请问一下STM32的USB/CAN口在不能remap的条件下,接口电路(CAN收发器/usb总线)能否实现两个应用并存但是不同时应用:指的是在用CAN时不用USB,在用USB时不用CAN,能否实现?需要注意什么? 补充一下:我测试了TJA1050的RX/TX脚有内部上拉也不知 ...…

查看全部问答>

单片机设计电路应如何考虑

我是名初学者,只会一点编程,对于设计电路时就老是会遇到问题,比如再把74hc245接入电路时,就老是会想这个芯片的需要的 驱动电流多少,最大负载多少,看技术手册又看不懂,都是英文,而且那些参数标的我的是一头雾水,不知道那个才是我的那个答 ...…

查看全部问答>

这是我写的lcd1602液晶显示的数字钟,编译没错,但不能显示,请大...

library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity LCD3 is port( clk: in std_logic; en,rs,rw:out std_logic; data:out std_logic_vector(7 downto 0) ); end LCD3; ...…

查看全部问答>