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.

MSP430F149低功耗问题



430设置时钟为用XT2,在进入低功耗之前关闭XT2,退出低功耗后再打开XT2,但是最后打开XT2后的时间好像不对,要比进入低功耗之前要慢

  • 但是最后打开XT2后的时间好像不对,要比进入低功耗之前要慢是啥意思?

    一般开启晶振不建议用delay,用Clock_Init中的while,判断标志位,确保晶振打开了。

    而且要不要关低速晶振跟进入低功耗的时间有关,如果低功耗里的时间短,就不建议频繁开关晶振了,省不了多少,开关过程本身要delay,也耗费功耗的。

  • 如果我在退出低功耗之前再次初始化时钟的话,程序就乱掉了,比如说我按一个按键退出低功耗,在退出之前重新初始化时钟,退出低功耗在会后,就又重新开始了所有内容的初始化,也就是从关闭看门狗开始,重新运行了。不会向下运行

  • 比进入低功耗之前要慢也就是说,如果在while里边写上一个LED闪烁的程序,在不进入低功耗之前是1s闪烁一次,退出低功耗后闪烁频率明显减小

  • 比进入低功耗之前要慢也就是说,如果在while里边写上一个LED闪烁的程序,在不进入低功耗之前是1s闪烁一次,退出低功耗后闪烁频率明显减小,就好像是XT2没有打开

  • 你的程序是在XT2的时基上执行的么?你进低功耗用的什么时钟?退出低功耗调用的什么函数,那段程序怎么写的?

  • 是的,进低功耗的时候,关闭了XT2,退出低功耗时又打开了XT2,退出低功耗用__low_power_mode_off_on_exit();

    WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
    Clock_Init(); //时钟初始化
    Led_Init(); //LED初始化
    TimerA_Init(); //定时器初始化
    KeyInit(); //按键初始化
    UART_Init(); //串口初始化
    _EINT(); //使能中断
    A7_Init(10); //A7初始化 
    GPRS_Init();
    BCSCTL1|=XT2OFF; //关闭XT2
    delay_ms(1);
    __low_power_mode_3(); //进入低功耗

    这是初始化,初始化结束进入低功耗

    #pragma vector = PORT1_VECTOR
    __interrupt void P1_IRQ(void)
    {
    switch(P1IFG&0x0F)
    {
    case 0x02: 
    P1IFG=0x00;
    if((P1IN&BIT1)==0)

    BCSCTL1&=~XT2OFF; //开启XT2
    Start_Flag=1;
    Recall_NUM=0; //重拨次数清空
    KeyValue=2;
    __low_power_mode_off_on_exit(); //退出低功耗 
    }
    break;

    这是进入终端退出低功耗的程序

  • BCSCTL1&=~XT2OFF; //开启XT2

    只有这一句话可能XT2没有开启成功你就出了低功耗了。

    这个是XT2开启的标准流程。

    不过我们不建议在中断里面阻塞While

    可以置一个flag,再在主循环的while里面判断这个flag,再开启时钟。

  • 我尝试过用Clock_Init();代替BCSCTL1&=~XT2OFF;结果是程序复位了,重新初始化,不知道哪里问题

  • 有可能是晶振初始化失败。复位后自动启动内部1M DCO。这个时候时钟应该是变慢了

  • 那应该怎么做呢?退出低功耗重新初始化时钟的话,程序整体就复位了

  • 如果是因为晶振初始化失败造成复位,很大可能是负载电容不合适晶振没有正常启动

  • 好像是串口初始化的问题,我在重新初始化始终后,又重新初始化串口,这样就好了。但是原因我还是不太明白

    //串口初始化

    void UART_Init(void)
    {
    U0CTL|=SWRST + CHAR; //复位SWRST,8位数据模式
    U0TCTL|=SSEL1; //SMCLK为串口时钟
    U0BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
    U0BR0=baud_l; //N=UBR+(UxMCTL)/8
    U0MCTL=0x00; //微调寄存器为0,波特率9600bps
    ME1|=UTXE0; //UART0发送使能
    ME1|=URXE0; //UART0接收使能
    U0CTL&=~SWRST;
    IE1|=URXIE0; //接收中断使能位

    P3SEL|= BIT4 + BIT5; //设置IO口为第二功能模式,启用UART功能
    P3DIR|= BIT4; //设置TXD0口方向为输出
    Receive_pointer=0;
    }