This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好,
刚开始学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
}
不是ACLK在LPM4就一定被关闭,LPM4语句其实是一系列寄存器的操作,许多针对时钟的寄存器关闭实际上是“在时钟没有被使用时”。如果当时ACLK在被使用过程中,比如当作定时器的时钟,或者是串口产生波特率的时钟时,在进入LPM4后,都不会被关闭。