TI中文支持网
TI专业的中文技术问题搜集分享网站

关于低功耗,ACLK

大家好,

刚开始学MSP430F5528, 想看看低功耗如何工作,于是想:

1). 定时器的时钟选择ACLK

2). 设置定时器中断,同时关掉 ACLKREQEN 等。

3).  进入低功耗模式,比如 LPM4, 按定义ACLK是关的。这样的话定时器应该不工作。

但现在是定时器还是工作。虽然__bis_SR_register()之后的代码没有执行(说明CPU被停止了)。

请问下,这种能关掉定时器的时钟么? 附上代码。

//******************************************************************************
// MSP430F552x Demo – Timer0_A5, Toggle P1.0, CCR0 Up Mode ISR, DCO SMCLK
//
// Description: Toggle P1.0 using software and TA_1 ISR. Timer1_A is
// configured for up mode, thus the timer overflows when TAR counts
// to CCR0. In this example, CCR0 is loaded with 50000.
// ACLK = n/a, MCLK = SMCLK = TACLK = default DCO ~1.045MHz
//
// MSP430F552x
// —————
// /|\| |
// | | |
// –|RST |
// | |
// | P1.0|–>LED
//
// Bhargavi Nisarga
// Texas Instruments Inc.
// April 2009
// Built with CCSv4 and IAR Embedded Workbench Version: 4.21
//******************************************************************************
#include <msp430f5529.h>

typedef volatile unsigned int  u16;

u16 tt,tt0,tt1;

void main(void)
{
tt0=0;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= 0x01; // P1.0 output

UCSCTL4 = SELA_4;
//UCSCTL8 = ACLKREQEN+MCLKREQEN+SMCLKREQEN;
UCSCTL8 = 0; // no ACLKREQEN+MCLKREQEN+SMCLKREQEN request enabled.

TA0CCTL0 = CCIE; // CCR0 interrupt enabled
TA0CCR0 = 50000;
TA0CTL = TASSEL_1 + MC_1 + TACLR; // SMLCK, upmode, clear TAR, ACLK
RTCCTL01=RTCBCD+RTCMODE; // rtca calendar, bcd.
RTCPS0CTL = RTCTEVIE;
RTCPS1CTL=RT1IP_6+RT1PSIE;

__bis_SR_register(LPM4_bits + GIE); // Enter LPM4, enable interrupts
__no_operation(); // For debugger

P1DIR |= 0x01; // below codes are used only to verify that the code is not executed.
TA0CCTL0 = CCIE; // CCR0 interrupt enabled
TA0CCR0 = 50000;
TA0CTL = TASSEL_1 + MC_1 + TACLR; // SMLCK, upmode, clear TAR, ACLK
RTCCTL01=RTCBCD+RTCMODE; // rtca calendar, bcd.
RTCPS0CTL = RTCTEVIE;
RTCPS1CTL=RT1IP_6+RT1PSIE;

}

// Timer0 A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
{
P1OUT ^= 0x01; // Toggle P1.0
}

// RTC0 interrupt service routine
#pragma vector=RTC_VECTOR
__interrupt void RTC0__ISR(void)
{
switch(__even_in_range(RTCIV,10))
{
case 0:break; //
case 6: //
while (!(RTCCTL0&RTCAIFG)); //
while (!(RTCCTL0&RTCRDYIFG)); //
tt = RTCHOUR; //
break;
case 4:break; // case 10: // while (!(RTCPS1CTL&RT1PSIFG)); // while (!(RTCCTL0&RTCRDYIFG)); // tt = RTCSEC; // tt1=tt-tt0;
tt0=tt;
break;
default: break;
} // Toggle P1.0
}

Hansen_fu:

回复 user1866843:

多谢!

赞(0)
未经允许不得转载:TI中文支持网 » 关于低功耗,ACLK
分享到: 更多 (0)