zoukankan      html  css  js  c++  java
  • 嵌入式成长轨迹56 【Zigbee项目】【CC2430基础实验】【睡眠定时器的使用】

    在小灯快速闪烁5 次后进入睡眠状态 PM2 ,在 PM2 下睡眠定时器 SLEEP TIMER(ST)仍然可以正常工作,从0x000000 到0xffffff 反复计数,当ST计数超过写入ST[2 -0] 的0x000f00 时,系统由中断唤醒,小灯闪烁 5 次后进入 PM2 ,这样周而复始的唤醒工作然后睡眠。系统睡眠的时间为8 分32 秒,这已经是最长睡眠时间。


    ST2 (睡眠定时器2)
    7:0 ST2[7:0]  睡眠定时器计数/ 比较值[23 -16]位。读出为ST计数值,写入为比较值。
    读寄存器应先读ST0 ,写寄存器就后写ST0 。
     
    ST1 (睡眠定时器1)
    7:0 ST1[7:0]  0X00  R/W  睡眠定时器计数/ 比较值[15-8] 位。读出为 ST计
    数值,写入为比较值。读寄存器应先读ST0 ,写 寄存器就后写ST0 。
     
    ST0 (睡眠定时器0)
    7:0 ST0[7:0]  0X00  R/W  睡眠定时器计数/ 比较值[7 -0] 位。读出为ST 计
    数值,写入为比较值。读寄存器应先读ST0 ,写 寄存器就后写ST0 。
     
    实验相关函数
    写在程序中的子函数及功能列写如下:
     
    void Init_SLEEP_TIMER(void);
    函数原型:

     1 void Init_SLEEP_TIMER(void) 
     2 { 
     3     ST2 = 0X00; 
     4     ST1 = 0X0f; 
     5     ST0 = 0X00; 
     6  
     7   EA = 1;  // 开中断 
     8   STIE = 1; 
     9   STIF = 0; 
    10 } 


    函数功能:打开睡眠定时器SLEEP TIMER(ST)中断,设置ST 的中断发生时间为计数值达到0x000f00 时。
     
    void LedGlint(void); 
    函数原型:

    1 void LedGlint(void) 
    2 { 
    3   uchar jj=10; 
    4   while(jj--) 
    5   { 
    6     RLED = !RLED; 
    7     Delay(10000); 
    8   } 
    9 } 


    函数功能:让LED 闪烁5 次,无返回值。
     
    void ST_ISR(void) ;
    函数原型:

    1 __interrupt void ST_ISR(void) 
    2  { 
    3    STIF = 0; 
    4 } 


    函数功能:睡眠定时器中断服务程序,清中断标志,无其他操作。

    重要的宏定义 

     1 使模块上的可控制 
     2 #define LED_ENABLE(val)                 \ 
     3   do{                                   \ 
     4     if(val==1)                          \ 
     5       {                                 \ 
     6         P1SEL &= ~0X03;                 \ 
     7         P1DIR |= 0X03;                  \ 
     8         RLED = 1;                       \ 
     9         GLED = 1;                       \ 
    10        }                                \ 
    11       else                              \ 
    12       {                                 \ 
    13         P1DIR &= ~0X03;                 \ 
    14       }                                 \ 
    15     }while(0) 
    16  
    17 #define RLED P1_0 
    18 #define GLED P1_1 


     
    选择系统工作时钟源并关闭不用的时钟源 

     1 #define SET_MAIN_CLO CK_SOURCE(source) \ 
     2    do {                                   \ 
     3       if(source) {                            \ 
     4         CLKCON |= 0x40;  /*RC*/               \ 
     5         while(!(SLEEP&0X20));  /* 待稳*/       \ 
     6         SLEEP |= 0x04;         /* 关掉不用的*/ \ 
     7       }                                       \ 
     8       else {                                  \ 
     9         SLEEP &= ~0x04;  /*全开*/             \ 
    10         while(!(SLEEP&0X40));/* 待稳*/         \ 
    11         asm("NOP");                           \ 
    12         CLKCON &= ~0x47; /* 晶振*/             \ 
    13         SLEEP |= 0x04;   /* 关掉不用的*/       \ 
    14       }                                       \ 
    15    }while (0) 
    16  
    17 #define CRYSTAL 0 
    18 #define RC 1 


     
    选择系统低速时钟源

    1 #define SET_LOW_CLOCK(source)                                \ 
    2        do{                                                   \ 
    3             (source==RC)?(CLKCON |= 0X80):(CLKCON &= ~0X80); \ 
    4         }while(0) 
  • 相关阅读:
    netcore 报错 502 缺少运行时
    简单工厂模式
    net之-------状态模式
    pc端字体正常, 缩放浏览器正常,手机模式查看出问题
    我的后续情况
    [wip]Berty
    利用FileReader对象回显图片
    测试
    CMP云管平台竞标产品
    nacos spring cloud
  • 原文地址:https://www.cnblogs.com/zeedmood/p/2666945.html
Copyright © 2011-2022 走看看