The MSP430 offers various types of timers & clocks that can be configured to function without CPU intervention. When a delay is required, one of the timer peripherals can be leveraged to generate such delay without the CPU staying active. This method significantly reduces the power consumption of the device. These timers can enable the MSP430 microcontroller to stay in a Low Power Mode until the timer wakes up the CPU.
In a microcontroller, the CPU is the largest contributor to the overall power consumption. When an application executes a delay, if the CPU stays in active mode, a significant amount of power and energy is wasted.
This remark is issued when a delay is found in any code file in
the project.
Check your code for a loop that only contains either of the lines
below, without any other code:
__no_operation(); _NOP();
Any empty loops. For example:
volatile int i = MAX_VALUE; while (i-- > 0);
Any occurrences of this:
__delay_cycles(NUMBER_OF_CYCLES);
//****************************************************************************** // MSP430G2xx3 Demo - Timer_A, Toggle P1.0, CCR0 Cont. Mode ISR, DCO SMCLK // // Description: Toggle P1.0 using software and TA_0 ISR. Toggles every // 50000 SMCLK cycles. SMCLK provides clock source for TACLK. // During the TA_0 ISR, P1.0 is toggled and 50000 clock cycles are added to // CCR0. TA_0 ISR is triggered every 50000 cycles. CPU is normally off and // used only during TA_ISR. // ACLK = n/a, MCLK = SMCLK = TACLK = default DCO // // MSP430G2xx3 // --------------- // /|\| XIN|- // | | | // --|RST XOUT|- // | | // | P1.0|-->LED // // D. Dang // Texas Instruments Inc. // December 2010 // Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10 //****************************************************************************** #include <msp430g2553.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1DIR |= 0x01; // P1.0 output CCTL0 = CCIE; // CCR0 interrupt enabled CCR0 = 50000; TACTL = TASSEL_2 + MC_2; // SMCLK, contmode _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt } // Timer A0 interrupt service routine #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A (void) { P1OUT ^= 0x01; // Toggle P1.0 CCR0 += 50000; // Add Offset to CCR0 }
See the rest of the code examples for all MSP430 devices here!
Want to squeeze a few more nanoAmps out of your application? Leverage the e2e (Engineer-to-Engineer) online community to get all of your ULP questions answered! Or, if you are an Ultra-Low Power pro, give back to the community with your expertise.
Go to MSP430's e2e online forum!
If you are posting on the forums in relation to this rule, try using the tag "ULP_2.1"
For technical support please post your questions at http://e2e.ti.com. Please post only comments about the article Compiler/diagnostic messages/MSP430/1527 here. |