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.

[参考译文] CC1312R:振荡器稳定时间

Guru**** 2460850 points
Other Parts Discussed in Thread: LAUNCHXL-CC1312R1

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1541074/cc1312r-oscillator-stabilization-time

器件型号:CC1312R
主题中讨论的其他器件: SYSBIOS

工具/软件:

从待机模式返回后、RF、TIMER、UART 等会进行初始化并发送数据包。 初始化后、大约需要 30ms 计时器中断发生。 这是由振荡器稳定时间造成的吗? 还有、是否有方法可以缩短这一时间? 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shingo:

    您在消息中讨论的是什么计时器中断?

    此致、

    Arthur

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    振荡器/XTAL 启动应在器件启动时处理、根据我观察到的情况、所需的时间可以忽略不计(可能小于 30ms)。

    您的问题是在设备已启动且过了一段时间后发生的吗? 例如

    1. 上电
    2. 通过时间> 30 毫秒
    3. 计时器中断观察

    您能否提供更多信息、以便我们更好地支持您:

    1. 提供
    2. 您的工程所基于的 SDK 示例
    3. 观察此行为的一系列步骤(理想情况下在 TI 硬件(例如 Launchpad) )上)

    谢谢、
    Toby

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是回调。 具体实现如下: 

    void timerCallback((Timer_Handle myHandle、int_fast16_t 状态)

    TP2_HI;
      tick_1msec_counter++;
    TP2_LO;
       
    }

    void timer_Initialize( void )

    /*
    *将计时器设置为连续回调模式,调用回调
    *每 1,000,000 微秒或 1 秒运行一次。
    */
    Timer_Params_(&timerParams);
    timerParams.period = 1000;
    timerParams.periodUnits = Timer_PERIOD_US;
    timerParams.timerMode = Timer_CONTINUAL_CALLBACK;
    timerParams.timerCallback = timerCallback;

    timer0 = Timer_OPEN (CONFIG_TIMER_0、&timerParams);

    if (timer0 == NULL)

    /*无法初始化计时器*/
    while (1){}
    }

    IF (Timer_START (timer0)= Timer_STATUS_ERROR)

    /*无法启动计时器*/
    while (1){}
    }

    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SDK simplelink_cc13xx_cc26xx_sdk_8_30_01_01

    2. base simplelink_cc13xx_cc26xx_sdk_8_30_01_01\examples\nortos\CC1312R1_LAUNCHXL\prop_rfPacketRx

    虽然这是定制板、但射频部分与 LAUNCHXL-CC1312R1 相同。

    CCS 版本:10.4.0.00006  

    最初的 30 毫秒是一个错误;时间被认为是振荡稳定时间是 340ms。 
    我将在示波器上发送实际代码和状态图像。 


     

    {μ s 
    //待机进入

      G_eventFlag = 0;
      G_aonRtcEventFlag = 0;
      while (g_eventFlag == 0 && g_aonRtcEventFlag == 0){
        power_idleFunc ();
      }
    //退出
    TP1_HI;
      G_eventFlag = 0;
      G_aonRtcEventFlag = 0;


      UART1_Initialize ( BPS115200, STOP_1bit, PARITY_EVEN , DATA_8bit );
      Timer_Initialize();
      pwm_Initialize();
      SPI1_init ();
    TP1_LO;

    ・μ s
    ・μ s
    }μ s
    void timerCallback((Timer_Handle myHandle、int_fast16_t 状态)

    TP2_HI;
      tick_1msec_counter++;
    TP2_LO;
       
    }

    void timer_Initialize( void )

      /*
       *将计时器设置为连续回调模式,调用回调
       *每 1,000,000 微秒或 1 秒运行一次。
       */
      Timer_Params_(&timerParams);
      timerParams.period     = 1000;
      timerParams.periodUnits  = Timer_PERIOD_US;
      timerParams.timerMode   = Timer_CONTINUAL_CALLBACK;
      timerParams.timerCallback = timerCallback;

      timer0 = Timer_OPEN (CONFIG_TIMER_0、&timerParams);

      if (timer0 == NULL)
      {
        /*无法初始化计时器*/
        while (1){}
      }

      IF (Timer_START (timer0)= Timer_STATUS_ERROR)
      {
        /*无法启动计时器*/
        while (1){}
      }
       
    }



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shingo:

    查看您的代码我注意到您主动调用电源空闲函数。  

    while (g_eventFlag == 0 && g_aonRtcEventFlag == 0){
        power_idleFunc ();
      }

    相反、您应该让电源驱动器通过挂起信标或让 MCU 以不同的方式处于空闲状态来将器件转换为睡眠状态。

    此致、
    Theo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否提供此答案的确切代码? 

    相反、您应该让电源驱动器通过挂起信标或让 MCU 以不同的方式处于空闲状态来将器件转换为睡眠状态。

    这是作为一个降低待机模式下电流消耗的过程来实现的。 输入信号中断和 aonRTC 中断用于从待机模式返回。 问题是、当计时器在返回时初始化时、为什么计时器回调的计时会延迟? 是否有人知道这是否是由于 XOSC 稳定等待时间所致? 
    
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shingo:

    您可以只在空 while 循环上挂起、电源驱动程序应该检测到 MCU 处于空闲状态并转换到睡眠状态。

    请说明您所说的延迟。 在共享示波器图中、我看到 TP1 的两个切换、第二个切换后、我看到 TP2 上的活动。

    此致、
    Theo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    示波器波形是在退出待机模式后获取的。 

    第一个 TP1 是代码中的以下部分。 
     
    TP1_HI; 
      G_eventFlag = 0;
      G_aonRtcEventFlag = 0;


      UART1_Initialize ( BPS115200, STOP_1bit, PARITY_EVEN , DATA_8bit );
      Timer_Initialize();
      pwm_Initialize();
      SPI1_init ();
    TP1_LO;
     
    在它里面,我们执行
    timer_Initialize();
    并在那里注册计时器回调。 
    TP2 在回调中输出。 
    void timerCallback((Timer_Handle myHandle、int_fast16_t 状态) 

    TP2_HI;
      tick_1msec_counter++;
    TP2_LO;
       
    }
    我不明白为什么从 timer_Initialize () 到 TP2 出现需要 340ms。 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shingo:

    您捕获的第二个 TP1 脉冲是多少(在 TP2 活动之前的那个脉冲)?

    为了更好地了解将要执行的操作、您可以连接 TI Logger 并启用功耗驱动程序调试声明。  

    这将有助于我们了解转换是否按预期触发。

    https://dev.ti.com/tirex/explore/node?node=A__AUtBCHw9KYI99xItuPjn4w__com.ti.SIMPLELINK_ACADEMY_CC13XX_CC26XX_SDK__AfkT0vQ__LATEST 

    您是否尝试用空的 while 循环来运行它、而不是调用  Power_idleFunc();? 器件是否由电源驱动器设置为睡眠?


    此致、
    Theo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    第二个 TP1 是数据包实际通过射频传输的时序。 

    在传输函数中使用了 RF_runCmd、并且已确认发送数据包。 

    我确定了电源驱动器已将器件设置为待机模式、方法是在电源线中插入电流表并测量下降到 8μA 的电流、因此我得出结论认为器件处于待机模式。 
    为了到达这一点、我使用了 Power_getDependencyCount 来找出哪些模块阻止了待机。 

    实际上、在停止和关闭每个模块后、我会循环 Power_idleFunc();。
    
    使用 Power_idleFunc ();转换到待机模式有什么问题吗? 

    实际实现功能 
     ↓μ s 
    Void SleepSystem(){ 

      SPI1_CLOSE ();
      timer_close();
      pwm_close();
      LED_ALL_OFF;
      UART1_CLOSE ();
    //待机进入 
      G_eventFlag = 0; 
      G_aonRtcEventFlag = 0;
      while (g_eventFlag == 0 && g_aonRtcEventFlag == 0){
        power_idleFunc ();
    
    
      } 
    //退出 
    TP1_HI; 
      G_eventFlag = 0;
      G_aonRtcEventFlag = 0;


      UART1_Initialize ( BPS115200, STOP_1bit, PARITY_EVEN , DATA_8bit );
      Timer_Initialize();
      pwm_Initialize();
      SPI1_init ();
    TP1_LO;
     } 
     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shingo:

    问题在于电源驱动器应自动处理运行和待机之间的转换。

    为此、您只需确保没有外设阻止器件转换到待机模式、并确保 MCU 处于空闲状态。 然后、电源驱动程序将根据待机策略将设备转换为待机、而无需调用 Power_idleFunc()。

    接下来、在空的 while 循环上尝试挂起。  

    请告诉我结果。 我目前怀疑您的电源驱动程序处于错误状态、因此我建议使用 TI Logger 查看电源驱动程序的调试声明。

    此致、
    Theo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我用如下所示的空循环尝试了它、但电流消耗是 6.3mA、它似乎没有进入待机模式。 

    while (g_eventFlag == 0 && g_aonRtcEventFlag == 0){

    // Power_idleFunc ();


    }

    此程序已根据
    simplelink_cc13xx_cc26xx_sdk_8_30_01_01\examples\nortos\CC1312R1_LAUNCHXL\prop_rfPacketRx 进行了修改。 

    电源驱动器何时工作? 
     
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shingo:

    我怀疑程序是空闲的、这还不够清楚。

    请在信标上添加待处理状态、如下所示:

    #include
    #include

    //主循环信标
    Semaphore_Struct semMainLoop;
    Semaphore_Handle hSemMainLoop;

    Void YourWakeupCallbakc(空)

    信标_POST (hSemMainLoop);
    }

    void *mainThread (void *arg0)

    //信标初始化
    Semaphore_Params semParams;
    Semaphore_Params_初始化 (&semParams);
    信标构造 (&semMainLoop、0、&semParams);
    hSemMainLoop =信标_handle (&semMainLoop);

    while (1)

    信标_pend (hSemMainLoop、BIOS_WAIT_FOREVER);
    }
    }

    此致、
    Theo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您提供示例代码。

    然而、正如我上次提到的、该工程是 noRTOS、因此实施信标不是毫无意义的吗? 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shingo:

    抱歉、我假设您正在使用 RTOS、

    在这种情况下调用  Power_idleFunc();确实是正确的解。

    我正在调查其他什么因素可能导致延迟。

    此致、
    Theo

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我很高兴我们有同样的理解。 如果你能提出一个解决方案会很好、但如果你绝对需要等待 XOSC 稳定、我想这是不可避免的。 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Shingo:

    是的、如果您想使用外部晶体、则需要先等待它稳定下来。  

    但是、当器件唤醒时、它使用 RC 振荡器。 默认情况下、仅当您使用需要极高精度的外设(最著名的无线电)时、它才会切换到外部晶体。

    谢谢、

    Marie HH.