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.

MSP430的LPM3模式

Other Parts Discussed in Thread: MSP430F2274, SIMPLICITI, CC2500

这段代码的意思是在单片机进入低功耗模式之前先延时1.5秒,然后进入低功耗3,定时0.228秒之后中断唤醒退出低功耗模式3,可是这个时钟对不上吧,SEL_1是辅助时钟,辅助时钟只能是VLO或者LTXF1CLK,没懂1.5秒对应计数2000,不知道我理解是否有错,帮忙看下,谢谢

/*--------------------------------------------------------
定时器A定时32s
--------------------------------------------------------*/

TACCTL0 = CCIE;// TACCR0 中断使能
TACCR0 = 2000;//定时时间为1.5s
TACTL = TASSEL_1 + MC_3+ID_3;//定时器时钟8分频,采用增减计数模式。
__bis_SR_register(LPM3_bits + GIE);//进入低功耗模式3.
TACCR0 = 1917;//定时时间为0.936s
TACTL = TASSEL_1 + MC_3+ID_3;//定时器时钟8分频,采用增减计数模式。

  • 请问这段代码使用的是哪款芯片?请给出您的完整时钟设置参数,现在使用的是频率多少的时钟

    另外网络上有一些讲解,您也可以看一下

    news.eeworld.com.cn/.../ic486011.html
  • 是MSP430F2274单片机 ,我想问定时器选择ACLK ,如果没有配置BCSCLK是不是就是默认配置1Mhz呢 我觉得这个时钟对不上

  • 在代码中

    #define TASSEL_1 (1*0x100u) /* Timer A clock source select: 1 - ACLK */

    在这里指的是ACLK.请问它的时钟源是什么?外接LTXF1CLK的话,就是32kHz
  • 定时器A软件里没定义 就写了SEL-1,定时器B选的32K,定时器A和定时器B分别配置不同的时钟源

  • 还是给下完整代码吧....
  • void main (void)
    {
    addr_t lAddr;
    WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
    P1DIR = 0xFF;
    P1OUT = 0x00;
    P2DIR = 0x22;
    P2OUT = 0x02;
    P3DIR = 0xC0;
    P3OUT = 0x00;
    P4DIR = 0xFF;
    P4OUT = 0x00;

    BCSCTL3 |= LFXT1S_0+ XCAP_1;//选择低频外部32.736k的外接晶振;
    BCSCTL3&=~LFXT1OF;//关闭外部晶振出错标
    PwmInit();
    TBCCR0 =40;
    TBCCR1 =2;
    TBCCR2 =20;
    TBCCTL2 = OUTMOD_3;
    TBCCTL1 = OUTMOD_7;
    TBCTL|=MC_1;//配置为增计算模式

    {
    // delay loop to ensure proper startup before SimpliciTI increases DCO
    // This is typically tailored to the power supply used, and in this case
    // is overkill for safety due to wide distribution.

    volatile int i;
    for(i = 0; i < 0xFFFF; i++){}
    }


    if( CALBC1_1MHZ == 0xFF ) // 检测时钟寄存器中的值是否正常
    {
    volatile int i;
    P1DIR |= 0x03;
    BSP_TURN_ON_LED1();
    BSP_TURN_OFF_LED2();
    while(1)
    {
    for(i = 0; i < 0x5FFF; i++){}
    BSP_TOGGLE_LED2();
    BSP_TOGGLE_LED1();
    }
    }

    /*---------------------------------------------------------
    SimpliciTI will change port pin settings as well
    ---------------------------------------------------------*/


    BSP_Init();//板级支持包初始化
    MRFI_Init();//CC2500硬件端口初试化和spi初始化
    SMPL_Ioctl( IOCTL_OBJ_RADIO, IOCTL_ACT_RADIO_SLEEP, "" );//配置CC2500进入休眠,降低功耗
    BCSCTL1 = CALBC1_8MHZ; // 配置内部主时钟为8mhz
    DCOCTL = CALDCO_8MHZ;//配置内部DCO频率为8mhz

    if( Flash_Addr[0] == 0xFF &&
    Flash_Addr[1] == 0xFF &&
    Flash_Addr[2] == 0xFF &&
    Flash_Addr[3] == 0xFF )
    {
    createRandomAddress(); // 启动初始设置地址
    }
    lAddr.addr[0]=Flash_Addr[0];
    lAddr.addr[1]=Flash_Addr[1];
    lAddr.addr[2]=Flash_Addr[2];
    lAddr.addr[3]=Flash_Addr[3];
    SMPL_Ioctl(IOCTL_OBJ_ADDR, IOCTL_ACT_SET, &lAddr);


    /*--------------------------------------------------------
    定时器A定时32s
    --------------------------------------------------------*/

    TACCTL0 = CCIE;// TACCR0 中断使能
    TACCR0 = 2000;//定时时间为1.5s
    TACTL = TASSEL_1 + MC_3+ID_3;//定时器时钟8分频,采用增减计数模式。
    __bis_SR_register(LPM3_bits + GIE);//进入低功耗模式3.
    TACCR0 = 1917;//定时时间为0.936s
    TACTL = TASSEL_1 + MC_3+ID_3;//定时器时钟8分频,采用增减计数模式。

    void PwmInit()
    {
    TBCTL = TBSSEL_1 + TBCLR;//配置TB寄存器,清除计数器;选择时钟源为子时钟32kHZ
    P4SEL|=BIT5;//配置输出口TB2为P4.5
    P4DIR|=BIT5;
    P4SEL|=BIT4;//配置输出口TB1为P4.4
    P4DIR|=BIT4;
    }
    代码在这了,同时我也想问下,进入LPM3模式之后,单片机应该停止运行,__bis_SR_register(LPM3_bits + GIE);//进入低功耗模式3.
    TACCR0 = 1917;//定时时间为0.936s
    TACTL = TASSEL_1 + MC_3+ID_3;//定时器时钟8分频,采用增减计数模式。怎么还能执行TACCRO=1917这条语句呢???
  • user6333565 说:
    TACTL = TASSEL_1 + MC_3+ID_3;//定时器时钟8分频,采用增减计数模式。

    这里是使用的32K的ACLK时钟,8分频,增减计数模式

    该模式下计数器先增计数到TACCR0,然后减计数到0,周期是TACCR0的2倍

    要定时t,32K的时钟,8分频,ACLK为32/8Khz,那么依据公式可以写 TACCR0=t/((1/32/8Khz))

    是的,他这个计算也是有问题的。代码看起来也有点乱

    user6333565 说:
    同时我也想问下,进入LPM3模式之后,单片机应该停止运行,__bis_SR_register(LPM3_bits + GIE);//进入低功耗模式3.

    该语句是进入LPM3并使能中断。可以使用对应的中断来唤醒CPU

    下面这个写法是有问题的,如您所说

    TACTL = TASSEL_1 + MC_3+ID_3;//定时器时钟8分频,采用增减计数模式。
    __bis_SR_register(LPM3_bits + GIE);//进入低功耗模式3.
    TACCR0 = 1917;//定时时间为0.936s
    TACTL = TASSEL_1 + MC_3+ID_3;//定时器时钟8分频,采用增减计数模式