mcusleepc.nc

来自「tinyos-2.0源代码!转载而已!要的尽管拿!」· NC 代码 · 共 126 行

NC
126
字号
/* * "Copyright (c) 2005 Stanford University. All rights reserved. * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose, without fee, and without written * agreement is hereby granted, provided that the above copyright * notice, the following two paragraphs and the author appear in all * copies of this software. *  * IN NO EVENT SHALL STANFORD UNIVERSITY BE LIABLE TO ANY PARTY FOR * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN * IF STANFORD UNIVERSITY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. *  * STANFORD UNIVERSITY SPECIFICALLY DISCLAIMS ANY WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE * PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND STANFORD UNIVERSITY * HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, * ENHANCEMENTS, OR MODIFICATIONS." * *//** * Implementation of TEP 112 (Microcontroller Power Management) for * the MSP430. Code for low power calculation copied from older * msp430hardware.h by Vlado Handziski, Joe Polastre, and Cory Sharp. * * * @author Philip Levis * @author Vlado Handziski * @author Joe Polastre * @author Cory Sharp * @date   October 26, 2005 * @see  Please refer to TEP 112 for more information about this component and its *          intended use. * */module McuSleepC {  provides {    interface McuSleep;    interface McuPowerState;  }  uses {    interface McuPowerOverride;  }}implementation {  bool dirty = TRUE;  mcu_power_t powerState = MSP430_POWER_ACTIVE;  /* Note that the power values are maintained in an order   * based on their active components, NOT on their values.   * Look at atm128hardware.h and page 42 of the ATmeg128   * manual (figure 17).*/  // NOTE: This table should be in progmem.  const uint16_t msp430PowerBits[MSP430_POWER_LPM4 + 1] = {    0,                                       // ACTIVE    SR_CPUOFF,                               // LPM0    SR_SCG0+SR_CPUOFF,                       // LPM1    SR_SCG1+SR_CPUOFF,                       // LPM2    SR_SCG1+SR_SCG0+SR_CPUOFF,               // LPM3    SR_SCG1+SR_SCG0+SR_OSCOFF+SR_CPUOFF,     // LPM4  };      mcu_power_t getPowerState() {    mcu_power_t pState = MSP430_POWER_LPM3;    // TimerA, USART0, USART1 check    if ((((TACCTL0 & CCIE) ||	  (TACCTL1 & CCIE) ||	  (TACCTL2 & CCIE)) &&	 ((TACTL & TASSEL_3) == TASSEL_2)) ||	((ME1 & (UTXE0 | URXE0)) && (U0TCTL & SSEL1)) ||	((ME2 & (UTXE1 | URXE1)) && (U1TCTL & SSEL1))#ifdef __msp430_have_usart0_with_i2c	 // registers end in "nr" to prevent nesC race condition detection	 || ((U0CTLnr & I2CEN) && (I2CTCTLnr & SSEL1) &&	     (I2CDCTLnr & I2CBUSY) && (U0CTLnr & SYNC) && (U0CTLnr & I2C))#endif	)      pState = MSP430_POWER_LPM1;    // ADC12 check    if (ADC12CTL1 & ADC12BUSY){      if (!(ADC12CTL0 & MSC) && ((TACTL & TASSEL_3) == TASSEL_2))	pState = MSP430_POWER_LPM1;      else        switch (ADC12CTL1 & ADC12SSEL_3) {	case ADC12SSEL_2:	  pState = MSP430_POWER_ACTIVE;	  break;	case ADC12SSEL_3:	  pState = MSP430_POWER_LPM1;	  break;        }    }    return pState;  }    void computePowerState() {    powerState = mcombine(getPowerState(),			  call McuPowerOverride.lowestState());  }    async command void McuSleep.sleep() {    uint16_t temp;    if (dirty) {      computePowerState();      //dirty = 0;    }    temp = msp430PowerBits[powerState] | SR_GIE;    __asm__ __volatile__( "bis  %0, r2" : : "m" (temp) );    __nesc_disable_interrupt();  }  async command void McuPowerState.update() {    atomic dirty = 1;  } default async command mcu_power_t McuPowerOverride.lowestState() {   return MSP430_POWER_LPM4; }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?