项目因为是电池供电,所以不可避免的要用到低功耗功能,选用的芯片是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就自动复位了。
然而如果我把代码改为不进入低功耗模式,就不会有这个问题。
Ling Zhu2:
Frankie Yang
项目因为是电池供电,所以不可避免的要用到低功耗功能,选用的芯片是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就自动复位了。
然而如果我把代码改为不进入低功耗模式,就不会有这个问题。
Frankie Yang:
回复 Ling Zhu2:
这段代码可能表现的不明确,下面这段代码相对更好:
正常初始化时红灯会亮0.5S,之后关掉了,只剩蓝灯不停闪烁。
但是出现红灯又亮了,就说明MCU复位了,这样就没问题了吧?
其实我也不是想让它精确定时,我的本意是设置TA0CCR0=15000,让它10S中断一次,计数到4小时的时候就检测一次电池电量
#include<msp430g2433.h>#define LED_R BIT0 //RED LED(P2.0)#define LED_B BIT6 //BLUE LED (P2.6)void main(){ WDTCTL = WDTPW + WDTHOLD; P2SEL &= ~BIT6; //引脚复用 P2DIR |= (LED_R + LED_B); P2OUT |= (LED_R + LED_B); __delay_cycles(500000); P2OUT &= ~(LED_R + LED_B); BCSCTL3 |= LFXT1S_2; //设置LFXT1S为10,VLO TACTL |= TASSEL_1 + MC_1 + ID_3; //ACLK,UP Mode,1/8 devider(1500Hz) TA0CCTL0 |= CCIE; TA0CCR0 =1500; __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 ==32) { Timer0_A0_Counter =0; P2OUT ^=LED_B; } __bis_SR_register(LPM3_bits + GIE);}
Frankie Yang:
回复 Ling Zhu2:
现在做实验,供电用的JTAG仿真器。
中断里面部配置低功耗,原因是我怕它唤醒不稳定。之前做项目就有出现过,睡到LPM3或者LPM4的时候,唤醒要好几秒。但是在LPM2以上或者,在中断里配置低功耗就不会出问题。尴尬了宝宝
Frankie Yang:
回复 Ling Zhu2:
我现在又做了个实验,去掉中断里面的低功耗配置代码后,就正常了,再加回去又出问题。
Ling Zhu2:
回复 Frankie Yang:
Frankie Yang
我现在又做了个实验,去掉中断里面的低功耗配置代码后,就正常了,再加回去又出问题。