MSP430 G2553 低功耗模式LPMx


MSP430除了正常運行時的active模式外,還支持五種低功耗模式(Low-power mode),分別為LPM0、LPM1、LPM2、LPM3、LPM4,由狀態寄存器中的CPUOFF、OSCOFF、SCG0、SCG1比特位設置。

六種模式對應的時鍾狀態為:

其中,LPM3、LPM4比較常用,對低功耗的貢獻也最大。LPM3模式關閉了DCO、CPU,從而MCLK、SMCLK無法工作,ACLK(來源為LFXT1或VLO)可以正常工作並用於系統的定時喚醒。LPM4模式下所有內部時鍾信號都關閉,系統只能由外部中斷喚醒。幾種模式的功耗情況大致如下圖所示:

io430g2553.h頭文件中已經宏定義好了幾種模式的實現語句:

#define LPM0      __bis_SR_register(LPM0_bits)     /* Enter Low Power Mode 0 */
#define LPM0_EXIT __bic_SR_register_on_exit(LPM0_bits) /* Exit Low Power Mode 0 */
#define LPM1      __bis_SR_register(LPM1_bits)     /* Enter Low Power Mode 1 */
#define LPM1_EXIT __bic_SR_register_on_exit(LPM1_bits) /* Exit Low Power Mode 1 */
#define LPM2      __bis_SR_register(LPM2_bits)     /* Enter Low Power Mode 2 */
#define LPM2_EXIT __bic_SR_register_on_exit(LPM2_bits) /* Exit Low Power Mode 2 */
#define LPM3      __bis_SR_register(LPM3_bits)     /* Enter Low Power Mode 3 */
#define LPM3_EXIT __bic_SR_register_on_exit(LPM3_bits) /* Exit Low Power Mode 3 */
#define LPM4      __bis_SR_register(LPM4_bits)     /* Enter Low Power Mode 4 */
#define LPM4_EXIT __bic_SR_register_on_exit(LPM4_bits) /* Exit Low Power Mode 4 */

示例

利用MSP430G2553 Timer0_A,產生頻率為1Hz的方波,驅動LED進行顯示。系統除了中斷處理外,其余時間都處於LPM3模式。LPM3下時鍾源只能使用ACLK,而ACLK的來源為LFXT1或VLO。G2 Launchpad隨板提供了一個32.768k的晶體,若使用LFXT1,則需要將該晶體焊接到板子上。此例子中VLO作為ACLK的時鍾源。

VLO的主要問題是不夠精准。從MSP430G2553手冊可以看出,VLO頻率范圍為4kHz~20kHz,且受溫度、供電電壓影響較大。

雖然手冊給出的VLO典型值為12kHz,以下程序實測方波頻率為約0.84~0.85kHz,即實際VLO的頻率為約10kHz

 1 #include "io430.h"
 2 
 3 #define LED1 BIT0 //red
 4 #define LED2 BIT6 //green
 5 
 6 void main(void)
 7 {
 8   // Stop watchdog timer to prevent time out reset
 9   WDTCTL = WDTPW + WDTHOLD;
10   
11   P1OUT = LED1;
12   P1DIR |= LED1+LED2;
13   
14   BCSCTL1 = CALBC1_1MHZ; //Running at 1MHz
15   DCOCTL = CALDCO_1MHZ;
16   
17   BCSCTL3 |= LFXT1S_2; //ACLK source: VLO; VLO typical freq = 12kHz
18   BCSCTL1 |= DIVA_2; //ACLK = VLO divided by 4: typical 3kHz
19   
20   TA0CCR0 = 1500 - 1;//overflow freq = 3000/(TACCR0+1) = 2Hz (500ms) 
21   TA0CCTL0 = CCIE; //enable interrupt
22   TA0CTL = TASSEL_1 + MC_1 +TACLR; //ACLK, no divide, up mode ,clear timer
23   //the actual overflow period measured: 585~595ms -> VLO freq is ~10k
24   //so the VLO is not very accurate.
25   
26   __enable_interrupt();
27   LPM3; //enter the low-power mode 3
28   
29 }
30 
31 //ISR
32 #pragma vector = TIMER0_A0_VECTOR
33 __interrupt void CCR0_ISR(void)
34 {
35     //TA0CCR0 flag clearing is automatic
36     P1OUT ^= LED1 + LED2;
37 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM