请选择 进入手机版 | 继续访问电脑版
查看: 6263|回复: 7

CC2430DB的电源管理 2

[复制链接]
F117C 发表于 2011-1-18 09:08:53 | 显示全部楼层 |阅读模式
7. 内存考虑
深度睡眠模式(PM2和PM3),在CC2430DB不保留以下实体数据存储器内容地点:
0xE000 – 0xEFFF (4096 bytes)
0xFD56 – 0xFEFF (426 bytes)
连接器配置文件,f8w2430.xcl,必须与深睡眠设备f8w2430pm.xcl取代。

//---f8w2430.xcl
//    IXDATA
//
// These settings are used for devices that don't use PM2/PM3
-D_IXDATA_START=E000           // The internal IXDATA block is 8K,
-D_IXDATA_END=FEFF             // End of IXDATA if PM2/PM3 are not used
//
// These settings must be used for devices that use PM2/PM3.
// Note that the IXDATA_START allows the XSTACK to grow down into the non-persistent RAM, but
// checks in HAL Sleep insure that the stack is back into persistent RAM before entering PM2/PM3.
//-D_IXDATA_START=EE00         // The internal IXDATA block is 4K+,
//-D_IXDATA_END=FD55           // FD56-FEFF is used for saving the CC2430 registers before sleep.
//
// FF00-FFFF is mapped to IDATA.

//--f8w2430pm.xcl

//    IXDATA
//
// These settings are used for devices that don't use PM2/PM3
//-D_IXDATA_START=E000         // The internal IXDATA block is 8K,
//-D_IXDATA_END=FEFF           // End of IXDATA if PM2/PM3 are not used
//
// These settings must be used for devices that use PM2/PM3.
// Note that the IXDATA_START allows the XSTACK to grow down into the non-persistent RAM, but
// checks in HAL Sleep insure that the stack is back into persistent RAM before entering PM2/PM3.
-D_IXDATA_START=EE00           // The internal IXDATA block is 4K+,
-D_IXDATA_END=FD55             // FD56-FEFF is used for saving the CC2430 registers before sleep.
//
// FF00-FFFF is mapped to IDATA.

连接器配置文件,f8w2430.xcl,必须与深睡眠设备f8w2430pm.xcl取代。



      请注意,某些应用程序内存要求可能很大对于深度睡眠的设备而言。 INT_HEAP_LEN可能需要对这些应用减少。另请注意,当设备一旦进入深睡眠,JTAG调试器停止工作。请参考以下内存映射为更多有关细节深度睡眠记忆与CC2430的数据保留:






8.CC2430 Rev D Workarounds
有两种独立的问题联系到CC2430 Rev D供电模式:

       当进入功率模式1,2或3,有一个时间间隔在PCON.IDLE已经被设置后,其中中断(引脚中断或睡眠定时器中断)可能导致系统故障。

        当从功率模式2或功率模式3唤醒时,电压调节器打开了。但是,内部芯片的状态可能会损坏,如果芯片被唤醒电压在DCOUPL引脚 之间的某些门槛区间。

      请参阅应用笔记AN044CC2430版本D,功率问题的声明,软件解决办法的建议模式,以及其局限性。几个宏和定义都实施了_hal_sleep.c如软件的解决方法。该软件解决方法可以根据不同的应用。

HAL_SLEEP_DEBUG_LED
AN044 - 结合功率模式。这是默认关闭。当打开时,LED1被打开当进入PM1模式,LED1被关闭当进入PM2/PM3模式时。这有助于调试PM1-PM2排序算法。
#ifdef HAL_SLEEP_DEBUG_LED
        if (halPwrMgtMode == CC2430_PM1)
        {
          HAL_TURN_ON_LED1();
        }
        else
        {
          HAL_TURN_OFF_LED1();
        }
#endif


PM_MIN_SLEEP_TIME
AN044 - AN044 – MINIMUM SLEEP PERIODS WITH PULL-DOWN RESISTOR最低睡眠期间的下拉电阻。这是默认为14毫秒,对于CC2430的Rev B,设备将不会进入任何睡眠状态,除非被请求睡眠睡眠时间大于PM_MIN_SLEEP_TIME。这个宏是:
  避免在颠簸和淘汰系统短睡眠计时器(?2毫秒)
定义不同的cc2430最小安全睡眠时间

#if !defined (PM_MIN_SLEEP_TIME)
#define PM_MIN_SLEEP_TIME                14                 /* default to minimum safe sleep time for CC2430 Rev B */
#endif

        /* if the remaining time is less than the PM_MIN_SLEEP_TIME
         * burn the remaining time in a delay loop
         * AN044 - MINIMUM SLEEP PERIODS WITH PULL-DOWN RESISTOR
         */
        if ( osal_timeout < PM_MIN_SLEEP_TIME )
        {
          halSleepWait(osal_timeout*1000);
          halAccumulatedSleepTime += osal_timeout;
          osal_timeout = halAccumulatedSleepTime;
        }


PM2_HOLDOFF_TIME
AN044 - 结合功率模式。这个值默认为0。当设备被按键中断唤醒时,它应留在PM1为了PM2_HOLDOFF_TIME,除非更多的按键按下,
当计时器过期,该设备允许返回到PM2睡觉模式。

#if !defined (PM2_HOLDOFF_TIME)
#define PM2_HOLDOFF_TIME                 0
#endif

EXTERNAL_INTERRUPT_DELAY
AN044 - DELAYING EXTERNAL INTERRUPTS延缓外部中断。添加代码以设置的外部中断线路输出,驱动线活跃的水平,为180us延迟(30us if P1.0或P1.1),并设置尽可能接近的PCON.IDLE = 1行输入。这个宏使用按键S1为例。用户应根据不同的中断此行的宏(拧)。在CC2430EB或CC2430DB板上,S1映射到P0.1口。因此,用于180us延误。
#define EXTERNAL_INTERRUPT_DELAY()          st(P0DIR |= BV(1);    /* set P0.1 output */            \
                                               P0_1 = 1;          /* drive P0.1 inactive (high) */ \
                                               halSleepWait(180); /* delay 180us */                \
                                               P0DIR &= ~BV(1);   /* set P0.1 input */             \
                                               P0INP |= BV(1);)   /* set P0.1 tri-state */


PM1_ONLY
AN044 - RESTRICT USE TO PM1 ONLY限制仅使用PM1模式。禁止PM2/PM3只使用PM1模式。这是默认为FALSE。

#if !defined (PM1_ONLY)
#define PM1_ONLY                         FALSE              /* default to no AN044 - RESTRICT USE TO PM1 ONLY */
#endif

9.  CC2430 Rev D to Rev E Migration(2430版本D到版本E的转移)
CC2430 Rev E 改变了中断模式的设计将影响电源管理和中断清除。请确保您使用的软件版本1.4.1或以上。三个主要组成部分及其相关模块必须移植到你的代码库,以支持 CC2430 版本 E的电源管理:
HAL Key
HAL Sleep
OSAL
Z - Stack软件1.4.1或更高版本包含所有必要CC2430版本D到版本E的位置迁移。以下各节突出重点项目。

9.1 PxIFG清除
当清除PxIFG,写一个零到相应的位。读/修改/写可能导致问题。外围可以更新SFR在读写之间。因此,此更新可能是不完整的,如果读/修改/写使用了。例如:
   P1IFG &= 0x08; // Clear P1_3 interrupt flag 0000 1000
应该被改为
  P1IFG = ~0x08;  // Clear P1_3 interrupt flag

9.2  输入功率模式
下面的电源模式的宏必须与CC2430版本E:

#define HAL_SLEEP_SET_POWER_MODE_REV_E(mode) st( SLEEP &= ~0x03;  /* clear mode bits */               \
                                                 SLEEP |= mode;   /* set mode bits   */               \
                                                 asm("NOP");                                          \
                                                 asm("NOP");                                          \
                                                 asm("NOP");                                          \
                                                 if( SLEEP & 0x03 )                                   \
                                                 {                                                    \
                                                   PCON |= 0x01;  /* enable mode */                   \
                                                   asm("NOP");    /* first instruction after sleep*/  \
                                                 }; )

9.3 功率唤醒模式
对于任何正在使用的中断,从睡眠中唤醒,下面的宏,必须在版本E使用:
CLEAR_SLEEP_MODE();
其中CLEAR_SLEEP_MODE()被定义为 SLEEP&=?0x03;

#ifdef POWER_SAVING
#define CLEAR_SLEEP_MODE() st(SLEEP &= ~0x03;)
#else
#define CLEAR_SLEEP_MODE()
#endif

9.4端口1和端口2中断
一系类的清除外部中断必须被改成2430版本E

HAL_ISR_FUNCTION( halKeyPort1Isr, P1INT_VECTOR )
{
  if( CHVER <= REV_D )
  {
    P1IF = 0;
  }

  halProcessKeyInterrupt();

  if( CHVER >= REV_E )
  {
    P1IF = 0;
    CLEAR_SLEEP_MODE();
  }
}

9.5 端口0中断
       如果端口0中断被使用,需要更多的变化因为版本E
HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )
{
  /* P0IF is cleared by HW for CHVER < REV_E */

  halProcessKeyInterrupt();

  if( CHVER >= REV_E )
  {
    /* Make sure that we clear all enabled, but unused P0IFG bits.
     * For P0 we can only enable or disable high or low nibble, not bit by
     * bit. For P1 and P2 enabling of single bits are possible, therefore
     * will not any unused pins generate interrupts on P1 or P2.
     * We could have checked for low and high nibble in P0, but this
     * isn't necessary as long as we only clear unused pin interrupts.
     */
    P0IFG = (HAL_KEY_P0INT_LOW_USED | HAL_KEY_POINT_HIGH_USED);
    P0IF = 0;
    CLEAR_SLEEP_MODE();
  }
}

凡HAL_KEY_P0INT_LOW_USED和HAL_KEY_POINT_HIGH_USED必须正确定义从睡眠中唤醒的管脚。

9.6 在“OSAL_PwrMgr.c”文件的关键区域
“osal_next_timeout()”在“OSAL_PwrMgr.c”必须得到保护在关键部分:
    // Are all tasks in agreement to conserve --所有的任务同意被保护
    if ( pwrmgr_attribute.pwrmgr_task_state == 0 )
    {
      // Hold off interrupts.--暂不中断
      HAL_ENTER_CRITICAL_SECTION( intState );

      // Get next time-out
      next = osal_next_timeout();

      // Re-enable interrupts.
      HAL_EXIT_CRITICAL_SECTION( intState );

      // Put the processor into sleep mode--放入处理器睡眠模式
      OSAL_SET_CPU_INTO_SLEEP( next );
    }

9.7 未使用的I / O引脚
       未使用的I / O引脚应该被定义一个电平,不能悬空。一个办法是留下这个引脚不连接,并配置为通用I/ O口输入与上拉电阻。另外该引脚可作为配置的通用I / O输出。在这两个引脚不应该直接连接到VDD或GND,以避免过高的能耗情况。如果未使用的I / O引脚在悬空的位置在版本E中,中断标志位不能用软件清除和中断常量从不使用的引脚发生。

10 硬件注意事项
CC2430DB是专为低功率运行设计,由电池操作。只有CC2430是在这种模式下供电,USB微控制器不供电。
outman 发表于 2011-1-24 10:09:48 | 显示全部楼层
顶起,楼主辛苦了
沧浪之水 发表于 2011-4-20 10:24:35 | 显示全部楼层
严重支持楼主!!!
沧浪之水 发表于 2011-4-20 15:21:07 | 显示全部楼层
f8w2430.xcl,必须与深睡眠设备f8w2430pm.xcl取代
2530咋整呢???
songsongpi 发表于 2012-3-15 15:28:46 | 显示全部楼层
f8w2430.xcl,必须与深睡眠设备f8w2430pm.xcl取代
2530咋整呢???
songsongpi 发表于 2012-3-16 17:08:45 | 显示全部楼层
f8w2430.xcl,必须与深睡眠设备f8w2430pm.xcl取代
2530咋整呢???
songsongpi 发表于 2012-3-16 17:09:12 | 显示全部楼层
f8w2430.xcl,必须与深睡眠设备f8w2430pm.xcl取代
2530咋整呢???
lizheng86312 发表于 2012-8-29 13:20:46 | 显示全部楼层
学到东西了。顶。。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表