项目因为是电池供电,所以不可避免的要用到低功耗功能,选用的芯片是MSP430G2433。先声明一下,出于产品空间限制的原因,没有用到外接晶振。
因为要求定时检测电池电量,所以选用LPM3模式,这样就只有ACLK可以作为定时器的时钟源,而我用的ACLK时钟源来自VLO(貌似只有VLO可选)。
写了点简单的代码测试一下:
#include<msp430g2433.h>
#define LED_B BIT6 //BLUE LED (P2.6)
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P2SEL &= ~BIT6; //引脚复用
P2DIR |= LED_B;
P2OUT &= ~LED_B;
BCSCTL3 |= LFXT1S_2; //设置LFXT1Sx为10,VLO(12KHz)
TACTL |= TASSEL_1 + MC_1 + ID_3; //ACLK,UP Mode,1/8 devider(1500Hz)
TA0CCTL0 |= CCIE;
TA0CCR0 =1500/4;
__bis_SR_register(LPM3_bits + GIE);
while(1);
}
static unsigned int Timer0_A0_Counter =0;
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A0()
{
LPM3_EXIT;
Timer0_A0_Counter ++;
if(Timer0_A0_Counter ==2)
{
Timer0_A0_Counter =0;
P2OUT ^=LED_B;
}
__bis_SR_register(LPM3_bits + GIE);
}
以上代码正常工作现象为:LED灯1S的周期闪烁。
可奇怪的是,闪大约32次后(不变的32次,如果改为4秒的周期,又变成闪16次复位),MCU就自动复位了。
然而如果我把代码改为不进入低功耗模式,就不会有这个问题。