本帖最后由 qiushenghua 于 2014-8-12 11:57 编辑
1.好好看看我的例程,估计你没有使用430低功耗特性。
a.把20ms的任务放进main函数里,执行之前进入LPM0低功耗状态。b.定时器中断里只放计数模块和唤醒语句,最多再放几句赋值语句用于设置清除标志位。
c.1s到之后唤醒单片机,然后退出定时中断,于是单片机执行main里的20ms语句(语句开头对计数模块重新赋值)。
d.在这20ms语句执行期间,定时器继续工作,为下一个1s的定时作准备。
e.注意20ms语句执行期间可能会被定时器打断,时序性强的工作可以用定时器辅助完成。
2.Value Line就是MSP430G2xxx。
3.不能,从1看,你对1s定时的精度要求很高,看门狗的精度与之差不多,如果使用ACLK那误差更加是不可预测的,所以不推荐看门狗中断。CCS里有相关的例程,略微改动了一下给你参考:
- #include <msp430.h>
- unsigned int count;
- int main(void)
- {
- WDTCTL = WDT_MDLY_32; // Set Watchdog Timer interval to ~30ms
- IE1 |= WDTIE; // Enable WDT interrupt
- P1DIR |= 0x01; // Set P1.0 to output direction
- count=31;
- /*下面这段自己筛选有用的语句*/
- P1DIR=0xf7; //1111 0111
- P1OUT&=~0x40; //1011 1111
- P1OUT|=0x08; //0000 1000
- //上拉1.3,初始化时将1.0拉高
- P1REN|=0x08; //0000 1000
- //为1.3增加上拉电阻
- //不用的端口设置成输出并下拉到GND
- P2DIR=0xff;
- P3DIR=0xff;
- P2OUT&=~0xff; //0000 0000
- P3OUT&=~0xff; //0000 0000
- /*上面这段自己筛选有用的语句*/
- P1SEL|=0x04; //打开P1.2的PWM输出
- CCR0=33; //PWM周期20ms
- CCTL1 = OUTMOD_7;
- CCR1=16;
- TACTL=TASSEL_2+MC_1;
- TACCTL0 |=CCIE; //开启CCR0中断,中断周期20ms
- _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
- for(;;)
- {
- count=31;
- {/*20ms周期语句放在这里*/}
- LPM0;
- }
- }
- // Watchdog Timer interrupt service routine
- #pragma vector=WDT_VECTOR
- __interrupt void watchdog_timer(void)
- {
- if(count>0)count--;
- else LPM0_EXIT;
- }
复制代码
|