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.

[参考译文] CC2530:5秒后、电路板胜出#39;t 进入 PM2

Guru**** 2536430 points
Other Parts Discussed in Thread: CC2530, CC2531EMK, CC2531

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/567150/cc2530-after-5-seconds-board-won-t-enter-pm2

器件型号:CC2530
主题中讨论的其他器件: CC2531EMKCC2531

您好!

我一直面临这个问题、在从 -DREJOIN_SCAN=5000扫描集线器5秒钟后、器件不会进入 PM2。 当电路板进入 PM2时、应消耗1.2微安的电流、而是消耗8mA 的电流。 下面的代码显示 CC2530确保在它进入 PM2之前一切准备就绪、但是一个任务、或者任务、却阻止了电路板这么做。 这是什么任务、为什么要打开它? 为什么5秒后 CC2530不会进入 PM2?

next = osal_next 超时();

OSAL_SET_CPU_TO_SLEEP (下一个);

e2e.ti.com/.../4061.code.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还尝试对事件循环内的所有内容进行注释、并且功耗仍保持在8mA。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您在 zclSampleLight_Init 中注释掉以下代码会怎样

    ZDUApp_ChangeState (DEV_NWK_DISC);
    //重新启动扫描以重新加入
    ZDUApp_StartJoiningCycle ();
    OSAL_STOP_timerEx (ZDAppTaskID、ZDO_REACK_BACKOFF);
    OSAL_START_timerEx (ZDAppTaskID、ZDO_INLOAD_BACKOFF、zgDefaultRedjoinScan);

    /*P0SEL &=~BV (3);
    P0DIR |= BV (3);
    引脚= 1;*/

    P0DIR |= 0x20;
    //P1DIR |= 0x3f;
    P0SEL &=~BV (7);
    P0DIR |= BV (7);
    P0SEL &=~BV (6);
    P0DIR |= BV (6);

    DATA_PIN = 0;
    正向= 0;
    向后= 1;

    for (int i=i;<time; i++){ 0
    ONBOARD_WAIT (10000);


    正向= 0;
    向后= 0;
    DATA_PIN = 1;

    否= 1;
    zclSampleLight_OnOff = Light_on;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它也无法解决问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否定义 power_saving?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您暂停 IAR 中的应用、您会看到什么 DevState?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    退避状态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您在计划每5秒唤醒一次的定期事件中调用 osal_pwrmgr_powersavee、您是否会看到功耗下降?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因此、我通过将以下代码添加到事件循环中来降低功耗。 尽管 CC2530大部分时间都在 PM2中、但它似乎一直在唤醒。 我如何使它每1秒而不是每100毫秒唤醒一次?

    if (ZDO_REACK_BACKOFF){
    pwrmgr_attribute.pwrmgr_device = PWRMGR_battery;
    OSAL_pwrmgr_powersave();

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

    这是代码。

    e2e.ti.com/.../1184.code.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为什么您有两个 osal_start_timerEx 来启动 KEYHOLD_EVT? 无论如何、将100更改为1000以查看间隔是否更改为1000ms。

    OSAL_START_timerEx (zclSampleLight_TaskID、KEYHOLD_EVT、100);
    RET=osal_start_timerEx (zclSampleLight_TaskID、KEYHOLD_EVT、100);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这无法解决问题。 我不相信 CC2530会因为 SW6而不断唤醒。 你还建议什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有一个事件每100ms 唤醒一次 CC2530、因此我建议您删除所有可能的内容。 其中一个是 KEYHOLD_EVT、那么您是否将100更改为1000以查看结果是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我尝试过、但它没有解决问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您是否意味着您仍然在示波器上看到100ms 脉冲?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的。 那么、解决此问题的另一种可能方法是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否在"if (ZDO_REACK_退避)"行设置断点并检查事件值是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    下面是我为事件获取的值、按相应的顺序。 断点仅命中5次、不会再次命中。

    init 的事件值:
    49153.
    49160
    32776
    8.
    32768


    按钮按压的事件值:
    32768
    38656
    37632
    37376
    4608
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否可以附加 zcl_samplelight.h?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么、在 INIT 或按钮被按下后、断点是否仅达到5次?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    初始化后、断点命中5次。 按下按钮后、断点达到5次。 这是代码。

    e2e.ti.com/.../5123.code.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 ZDApp_EVENT_LOOP 的"if ( EVENTS_SYS_EVENT_MSG )"上设置断点,并查看它是否持续触发。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它仅在 devState 不在备份时出现。 一旦 devStates 处于备份状态、断点停止命中。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是不是指 DEV_NWK_退避 而不是备份? 尝试在 Hal_ProcessEvent 的"if ( EVENTS_EVENT_MSG )"上添加断点以查看其如何命中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我指的是 DEV_NWK_退避。 Hal_ProcessEvent 在哪里?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    HAL_ProcessEvent 位于 hal_drivers.c 中
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在 Hal_ProcessEvent 的"if (Events & SYS_EVENT_MSG)"内放置了一个断点、但该断点从未被命中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不是要将断点放置在 Hal_ProcessEvent 的"if ( EVENTS_SYS_EVENT_MSG )"内。 我的意思是在 Hal_ProcessEvent 的"if ( EVENTS_EVENT_MSG )"行上放置断点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在这种情况下、断点会持续触发、而不会停止。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否检查事件在持续发生时的值是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    事件的值始终为32。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试注释掉"if ( EVENTs & HAL_LED_BLINK )"中的"HalLedUpdate();",查看示波器上的100ms 脉冲是否停止。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我确实看到脉冲停止。 但是,与 SW6相关的所有内容都不再工作,例如 if (Events & KEYHOLD_EVT)和 if (Events & turnoff_motor_EVT)。 因此删除 HalLedUpdate()会导致 SW6问题。 如何停止脉冲、但仍保持 SW6相关功能正常工作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、HAL_LED_BLINK 事件会导致问题。 现在,您不必注释"if ( EVENTS_KEYHOLD_EVT )"和"if ( EVENTS_TURNOFF_MOTOR_EVT )"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已经取消注释与 SW6相关的代码,我说注释 HalLedUpdate()会导致 SW6出现问题。 为什么会这样呢?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我看不到注释掉 HalLedUpdate()导致问题的原因。 按下 SW6时 ISR 是否命中?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    可以、但"在5秒后关闭电机"和"按住按钮5秒并恢复出厂设置"代码不能如上一帖子中所述工作。 为什么会这样呢?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否随附最新代码?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是代码。

    e2e.ti.com/.../6253.code.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否按"如果(P2_0==1).." 在触发 SW6时出现在“if ( Events & KEYHOLD_EVT )”中?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有时、但并非始终如此。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果未命中断点、则应检查"osal_start_timerEx (zclSampleLight_TaskID、KEYHOLD_EVT、100);"的返回值、以查看未正确调度事件的原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有办法保持闪烁、但将闪烁的开启和关闭之间的时间延迟到1秒?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    那么、您是否解决了钥匙保持检查事件问题? 您能否立即向我展示如何使 LED 闪烁?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我无法使用 HalLedUpdate(),因为 SW6将不再工作,但我真正需要做的是使 LED 关闭时间更长。 是否有方法可以更改 LED 的关闭时间? 因此、基本上我希望 LED 关闭一秒钟、然后打开一个短脉冲。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以创建一个周期性事件、使 LED 每秒闪烁一次。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这不是我要尝试的。 因此我发现"STS->MODE |= HAL_LED_MODE_BLINK "是 HalLedBlink()中使 SW6混乱的代码。 我尝试过、但无法删除它、否则 SW6将无法正常工作。

    1) 1)那么我如何更改闪烁时间? 我是否可以更改某个值以使 LED 闪烁更少?
    2)或者、如果我将 SW6删除、该代码行为什么会使 SW6混乱?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否向我展示一下您如何在应用中使 LED 立即闪烁?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    让我再次解释一下。 所以我已经恢复了几个步骤并且没有删除 HalLedUpdate()。 示波器上仍然存在脉冲。 我知道脉冲来自 LED 闪烁。 LED 每250ms 闪烁一次。 如何使 LED 每隔1秒闪烁一次、而不是每250ms 闪烁一次? (这样、来自 LED 的脉冲就不会经常闪烁)