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.

cc1310如何退出待机模式问题

Other Parts Discussed in Thread: CC1310

您好,我使用Task_sleep(5000000 / Clock_tickPeriod);让系统进入待机模式,待机时间为5秒,并使能一个引脚中断,用于唤醒cc1310。但实测中,在待机模式时,我通过按一个按键触发中断,的确能唤醒cc1310,但唤醒后代码执行中断函数后退出似乎又进入待机模式,除非5秒过后才退出。

所以请问怎么才能唤醒cc1310并且再唤醒后执行Task_sleep的下一句代码?

  • LaoSheng Lin,

    你是在task的执行函数里面调用Task_sleep()的吗?

    把你代码贴上来看看呗。

  • 您好,我是在task中调用Task_sleep的。

    在task中首先我注册按键下降沿中断

    const PIN_Config keyPinTable[] = {
    KEY | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_NEGEDGE,
    PIN_TERMINATE
    };

    keyPinHandle = PIN_open(&keyPinState, keyPinTable);

    if (keyPinHandle != 0)
    {
    PIN_registerIntCb(keyPinHandle, &keyCallbackFxn);
    }

    然后再一个大循环中每睡眠5秒后进行一次RF发送

    while(1)

    {

    RF_TxPacket txPacket = {0};
    /* Create packet with incrementing sequence number and random payload */
    txPacket.payload[0] = (uint8_t)(seqNumber >> 8);
    txPacket.payload[1] = (uint8_t)(seqNumber++);
    txPacket.payload[2] = battMeasure();
    uint8_t i;
    for (i = 3; i < PAYLOAD_LENGTH; i++)
    {
    txPacket.payload[i] = i;//rand();
    }
    txPacket.len = PAYLOAD_LENGTH;
    txPacket.dstAddr[0] = 0xaa;
    txPacket.dstAddr[1] = 0x55;

    txPacket.absTime = 0;/*RF_getCurrentTime() + RF_ms_To_RadioTime(1000);*/

    LED_Set(Led_Red,1);   //红灯亮
    RF_transmit(rfHandle, &txPacket);
    LED_Set(Led_Red,0);  //红灯灭

    Task_sleep(5000000 / Clock_tickPeriod);
    }

    在按键中断函数中让蓝灯反转

    void keyCallbackFxn(PIN_Handle handle, PIN_Id pinId)
    {
    LED_Set(Led_Blue, !PIN_getOutputValue(LED_BLUE));
    }

    结果的现象是:我在进入待机时,按下按键,蓝色灯反转,说明进入中断,但红色灯不会亮即不发送RF,需等待机5秒后才发送RF

  • LaoSheng Lin,

    你这样按键也不会唤醒task呀,你按键中断跟这个task没任何关系,中断归中断,task还在5秒中睡着呢,所以肯定是每隔5秒醒来一次调用RF_transmit(),所以就是你看到的现象。

    正确的做法你应该用semaphore,while(1) 之后等待semaphore, 这个时候这个task就是在sleep的, 然后按键中断的处理函数发送semaphore去唤醒task,不要用sleep函数。

    如果你同时想要每隔5秒RF_transmit一下,那么你就要结合timer来做,用的也不是sleep。在上面我说的方法的基础上,设置个timer,每隔5秒用semaphore唤醒task,给task一个event, 在这个event中重新设置timer。如果收到按键中断, 也给个event给task,task在这个event下面停止timer,然后重启5秒的timer。

  • 谢谢Y的指点,我明白了,也就是说TI-RTOS自动会进入待机模式的吧,难怪我以前测试待机电流时,使用Task_Sleep和不使用时的功耗都差不多,都小于1uA

  • LaoSheng Lin ,

    是的.

    只要没有关闭standby模式,TI-RTOS会自动进入standby模式。

  • 您好!我用例程pinStandby测试电流,发现跟手册描述相差很大,进入Task_sleep之后,电流在770uA左右,硬件和软件都检查了,没发现问题在哪里。

    请问,我应该从哪些方面入手检查这个问题呢?谢谢!

  • 我发现问题了,是我的32.768KHz晶体没有起振,导致休眠电流变大,现在已经解决了。进入Task_sleep之后电流只有0.3uA左右。

  • 是否能提供例程参考参考!因为对TI的库函数还是不太熟悉!

  • 0.3uA左右的电流,最大会不会超过资料上说的0.7uA?

  • standby模式下,电流会超过资料上说的0.7uA吗?

  • 请问你是如何设置在standby模式下 电流消耗只有0.3uA呢?我测试总是在几个uA降不下去,能指导下吗?

  • hi, 

    您好,你的standby模式下的例程是否可以给我参考一下,谢谢你啦!


    best regards ,

    fenglin

  • SDK里的empty和pinStandby都可以作为standby模式的例程。