//————-TIMERA0 初始化———————
void TIMERA0_Inint(void)
{
CCTL0=CCIE; //CCR0中断允许
CCR0=10000-1;
//TACTL=TASSEL_2+MC_1; //选SMCLK,连续计数模式 1M
TACTL = TASSEL_1 + TAIE + MC_1; //选ACLK,增计数模式 无法进入??
_BIS_SR(GIE); //定时器TIMERA0_interrupt }
int main(void)
{
uchar key1;
Clock_Init();
UART_Init();
P6_Init();
P2_Init();
Key_Scan();
TIMERA0_Inint();
//WDTCTL = WDT_MDLY_32; //1MHz, WDT 32mS interval timer
WDTCTL =WDT_ADLY_250; //32768, delay250mS IE1 |= WDTIE; // Enable WDT interrupt
// WDTCTL = WDTPW + WDTHOLD; // Stop WDT
_EINT(); //开中断
while(1)
{
key1 = Key_Scan();
if(key1 != 0xff)
{
SendData(0xff);
SendData(key1/10%10 + '0');
SendData(key1%10 + '0');
SendData('\r');
key1 = 0xff;
}
else
_BIS_SR(LPM3_bits + GIE); //进入IPM低功耗
}
}
Lina Lian:
xianglie song,
我看你的TImer时钟源选择是SMCLK, 在LPM2 or 3低功耗mode下,SMCLK是不可用的。故LPM2, LPM3下Timer没法工作起来,肯定进不去中断,唤醒CPU的。你一定要进LPM2, 3,把时钟源换成ACLK。
一定要用SMCLK,只能设置为LPM0.
xianglie song:
回复 Lina Lian:
// TACTL=TASSEL_2+MC_1; //选SMCLK,连续计数模式 计数到CCR0值中断。 1M TACTL = TASSEL_1+ MC_1; //选ACLK,增计数模式 无法进入??
程序已经屏蔽了SMCLK,选择的是ACLK,现在整个程序都是由ACLK做为时钟,XT2是关闭的。串口使用ACLK收发都正常。
//**************MSP430串口初始化***************************void UART_Init(){ U0CTL|=SWRST; //复位SWRST U0CTL|=CHAR; //8位数据模式 //U0TCTL|=SSEL1; //SMCLK为串口时钟,最大115200 U0TCTL|=SSEL0; //ACLK为串口时钟,最大9600 U0BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N U0BR0=baud_l; //N=UBR+(UxMCTL)/8 U0MCTL=0x4a; //微调寄存器为,波特率bps ME1|=UTXE0; //UART0发送使能,允许发送 ME1|=URXE0; //UART0接收使能,允许接收 U0CTL&=~SWRST; IE1|=URXIE0; //接收中断使能位 P3SEL|= BIT4; //设置IO口为普通I/O模式 P3DIR|= BIT4; //设置IO口方向为输出 P3SEL|= BIT5; //P3SEL=0x30;}
就是计数中断在LPM2/3无法工作。
Lina Lian:
回复 xianglie song:
xianglie song ,
如果Timer 选用ACLK,应该是可以进入LPM2/3的, 你先试试下面这段程序。是TI的例程,就是timer 从LPM3进行唤醒并闪灯的。
你的程序里,你先把看门狗关了试试看,防止WDT 不喂狗,引起复位;
其次,你的LPM3进入是在else 里,你检查下你的逻辑吧,看起来只有 if(key1 != 0xff) 大部分情况。
总之,Timer 用时钟源 ACLK = 32768Hz LFXT1, 是可以从LPM3唤醒CPU的。
//******************************************************************************// MSP-FET430P140 Demo – Timer_A, Toggle P1.0, CCR0 Up Mode ISR, 32kHz ACLK//// Description: Toggle P1.0 using software and the TA_0 ISR. Timer_A is// configured for up mode, thus the timer overflows when TAR counts// to CCR0. In this example, CCR0 is loaded with 1000-1.// Toggle rate = 32768/(2*1000) = 16.384// ACLK = TACLK = 32768Hz, MCLK = SMCLK = default DCO ~800kHz// //* An external watch crystal on XIN XOUT is required for ACLK *// //// MSP430F149// —————// /|\| XIN|-// | | | 32kHz// –|RST XOUT|-// | |// | P1.0|–>LED//// M. Buccini// Texas Instruments Inc.// Feb 2005// Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.21A//******************************************************************************
#include <msp430.h>
int main(void){ WDTCTL = WDTPW + WDTHOLD; // Stop WDT P1DIR |= 0x01; // P1.0 output CCTL0 = CCIE; // CCR0 interrupt enabled CCR0 = 1000-1; TACTL = TASSEL_1 + MC_1; // ACLK, upmode
__bis_SR_register(LPM3_bits + GIE); // Enter LPM3 w/ interrupt}
// Timer A0 interrupt service routine#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)#pragma vector=TIMERA0_VECTOR__interrupt void Timer_A (void)#elif defined(__GNUC__)void __attribute__ ((interrupt(TIMERA0_VECTOR))) Timer_A (void)#else#error Compiler not supported!#endif{ P1OUT ^= 0x01; // Toggle P1.0}
TI中文支持网




