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.

[参考译文] CC2640:在使用 I2C 和 UART 时最大程度地减小睡眠电流

Guru**** 1860360 points
Other Parts Discussed in Thread: CC2640, CC2640R2F, CC2650, BLE-STACK, SYSBIOS
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1109571/cc2640-minimizing-sleep-current-when-using-i2c-and-uart

器件型号:CC2640
Thread 中讨论的其他部件:CC2650BLE-STACKSYSBIOS

多年来、我一直在我们的产品中使用 CC2640F128、  并且能够实现低于30微安的休眠电流。

最近、我 使用基于 ProjectZero 的代码成功地向 CC2640F128添加了 I2C 和 UART 接口。

但是、我无法再实现低于30微安的睡眠电流。  我的睡眠电流现在为几毫安、这是不可接受的。

在尝试进入睡眠模式之前、如果句柄不为 NULL、我会调用 UART_CLOSE (uartHandle)和 I2C_CLOSE (I2Chandle)。

调用这两个函数后、我是否需要进一步"关闭"或"更改4个 UART 和 I2C 引脚的状态"?

如果是、我该怎么做?

否则、我看不到我的代码中其他哪些应影响睡眠电流的更改、还有其他任何关于其他查看位置的建议吗?

谢谢、

戴尔

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

    您好 Dale、

    您是否在初始化引脚后但在打开通信外设之前监控过电流消耗?   µA GPIO 作为输入上拉引脚将消耗数百 μ A 的电流、如 数据表中所示。  是否确定设备仍处于睡眠状态、而不是处于空闲或活动模式?  您可以尝试 设置 UART 或 I2C 来确定一个器件对功耗的贡献是否大于另一个器件。

    此致、
    Ryan

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

    您好、Ryan、

    我将在适当的时候调查您的所有建议。

    但首先,我的四个 UART 和 I2C 数据引脚具有2.2k 的外部上拉电阻,这使得它们在唤醒时消耗的功率比内部上拉电阻要高得多(我们在唤醒时插入交流电))  我刚才假设 UART_CLOSE ()和 I2C_CLOSE ()数据引脚会自动保持高阻抗状态。  如果它们没有处于高阻抗状态、如何在   调用 UART_CLOSE ()和 I2C_CLOSE ()后将其更改为高阻抗状态?

    我已经尝试将数据引脚设置为与 LED 驱动引脚在低于30 UA 睡眠电流期间保持相同的状态、如下所示:

    PIN_Config redPinTable[] = {
        Board_REDPIN | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
        PIN_TERMINATE
    };

    但是、我知道如何做到这 一点的唯一方法是为  所有4个引脚定义 PIN_Handle、PIN_STATE 和 PIN_Config 表、这些引脚 占用96字节的 SRAM、这也会超出 SRAM 限制、因此我无法测试我的理论。

    是否有办法在 UART_CLOSE ()和 I2C_CLOSE ()之后更改不 使用 SRAM 的4个数据引脚的状态?

    谢谢、

    戴尔

    编辑:此外、在哪里可以找到有关可用 PIN_Config 表选项及其含义的说明?  (如  PIN_GPIO_OUTP_EN、PIN_GPIO_LOW、PIN_PushPull、PIN_DRVSTR_MAX 等)

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

    是否可以将所有引脚组合成一个表/手柄、或者仅配置 几个必要的引脚以用于测试?  这应该是可行的、因为您将所有这些都配置为相同的方向、而不是使用回调、因为在通信外设关闭时、回调是临时使用的。  引脚定义在 source/ti/drivers/PIN.h 文件内确定。

    此致、
    Ryan

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

    您好、Ryan、

    根据你的建议,我已经下了几个兔子洞,但我仍然有点困惑。

    我使用的是10欧姆电流感应电阻器、读数为十进制的 mV、这为我提供了10 UA 电流分辨率的功耗  2640.

    您建议我确定 2640是处于空闲模式还是处于活动模式、因此不会真正进入睡眠模式、但我该怎么做 

    更多信息:

    在睡眠期间、我保持 RTC 计时器运行、并有一个输入引脚(IOID_14上的 BOARD_WAKEBTN)驱动中断、以便可以通过向该引脚施加电压来唤醒。

    当我实现低于30ua 的睡眠电流时、我可以通过对 IOID_14施加小于2V 的电压来唤醒2640。  现在、由于 UART 或 I2C 未连接任何外部器件(并且所有上拉电阻均已移除)、当我认为它应该处于睡眠状态时、仍有大约1mA 的睡眠电流、唤醒引脚上的电流需要大于3V (而不是<2V)才能再次变为活动状态。

    我有一个名为 BoardGpioInitTable 的完整引脚配置表、它被调用为 PIN_init (BoardGpioInitTable)的参数、该参数在 main.c 开头、在 BIOS_start()调用之前调用。

    我在该 BoardGpioInitTable 中尝试了许多方法 来高效处理用于 UART 和 I2C 的外部上拉电流。

    由于知道这个初始 PIN_init()调用应该决定了在调用 I2C_close()和 UART_close()之后 UART 和 I2C 引脚的状态,我仍然没有提出一个良好的引脚配置来将 上拉电流降低至可接受的水平, 如果我想要低于30ua 的睡眠电流,也许我必须在睡眠期间将这些引脚打开

    为了让我确信、我的问题不仅仅在于上拉电流、我移除了连接到 UART 或 I2C 引脚的所有器件、并移除了我的所有数据线路上拉电阻、但在我认为应该如上所述睡眠时、仍然会达到大约1mA 的电流。

    我还在上述默认引脚配置表中将 UART 和 I2C 引脚配置设置为输出引脚、正如我在多年的低于30ua 睡眠配置期间定义的其他引脚一样。

    以下是该引脚配置表:

    const PIN_Config BoardGpioInitTable[] = {  //for explanation of parameters see PIN.h file in drivers
       //these defines are from HaloLoggerV1a.h
       //    #define Board_TPIN                  IOID_0
       //    #define Board_RHPIN                 IOID_1
       //    #define Board_V33PIN                IOID_2
    
      //    #define Board_I2C0_SCL0             IOID_3
      //    #define Board_I2C0_SDA0             IOID_4
    
       //    #define Board_UART_TX               IOID_5
       //    #define Board_UART_RX               IOID_13
    
      //    #define Board_SPI_FLASH_CS          IOID_7
      //    #define Board_SPI0_MISO             IOID_8
      //    #define Board_SPI0_MOSI             IOID_9
      //    #define Board_SPI0_CLK              IOID_10
    
       //    #define Board_REDPIN                IOID_11
       //    #define Board_GLED                  IOID_12
       //    #define Board_WAKEBTN               IOID_14
    
        Board_TPIN   | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,      // initially off
        Board_RHPIN   | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,      // initially off
        Board_V33PIN   | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,      // initially off
    
        Board_I2C0_SCL0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
        Board_I2C0_SDA0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
        Board_UART_RX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
        Board_UART_RX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
    
        Board_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,  /* External flash chip select    */
        Board_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master out - slave in */
        Board_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master in - slave out */
        Board_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN,                                             /* SPI clock */
    
        Board_REDPIN   | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,      // initially off
        Board_GLED   | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,         /* LED initially off             */
        Board_WAKEBTN   | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,            /* Button is active low          */
                                                       //Board_WAKEBTN gets further mapped to Board_HasVoltsOnWakeInput in board.h....
        PIN_TERMINATE
    };

    我是否错过了调查您的任何其他建议和/或您是否有其他想法?

    谢谢、

    戴尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="294404" URL"~"支持/无线连接/bluetooth-group/f/bluetooth-forum/110971/cc2640-mreiminating-currence-when 使用时使用 i2c-and-UART/4115850#4115850"]您建议我确定 2640是否处于闲置或处于活动模式,但实际上不是如何进入休眠模式[引用/引用]

    这可以通过 IDE 调试器来实现、方法是暂停 MCU 状态以确定代码是否正在运行、或者使用 ROV 进行评估。

    还有一些问题尚未得到解决:

    1. 您是否在初始化引脚后、但在打开/使用通信外设之前监控过电流消耗? 还是在初始化 UART/I2C 但尚未打开或使用它们之后尝试测量电流?
    2. 您是否仅启用 UART 或 I2C 来确定一个特定的通信外设是否直接导致了该问题?
    3. 使用的是 BLE-STACK-2的哪个版本、您是否会考虑升级到最新版本(如果尚未更新)以确定这是否可以解决问题?

    此致、
    Ryan

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

    您好、Ryan、

    我刚刚有时间继续我的低于30瓦的睡眠电流追求。

    我没有意识到 IDE 调试器能够在睡眠状态期间运行。  在 IDE 调试睡眠状态下、由于睡眠期间仍在使用 JTAG 调试引脚、我预计我的10欧姆电流感应电阻器上的电压会上升。 实际上、当我尝试在 调试会话期间进入睡眠状态(关闭我使用的所有引脚、关闭所有周期时钟、终止 BLE 连接并停止 BLE 广播)时、当我认为我们应该睡眠时、电流从1.17ma 上升到3.44ma。

    我能够在这个3.44ma 状态期间暂停和恢复代码、但是代码只在这里显示的汇编代码处暂停/中断 (我可以用 F5键单步执行)

    此外、在该图中、我们可以看到 ROV 报告 IdleTask 正在运行、这是否意味着处理器没有真正处于睡眠状态?

    现在、我将开始尝试回答您上一个帖子中的问题1-3。

    谢谢、

    戴尔

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

    感谢您提供 ROV 报告、此时我相信您已确认空闲任务正在运行、而不是进入待机状态。  这很可能是由于在 UART_OPEN 中设置但在 UART_CLOSE 期间未释放的功耗相关性限制(对于 I2C 也是如此)。  您可以将 UART/I2C TI 驱动程序文件直接添加到项目中以进一步调试其行为、并查看 Power TI 驱动程序以有效地返回到待机状态。

    此致、
    Ryan

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

    我将把 UART 和 I2C 驱动程序文件作为本地副本复制到我的工作区中,并尝试弄清楚在使用 UART_CLOSE ()和 I2C_CLOSE ()后如何释放这些引脚。

    但是,为什么 UART 和 I2C 引脚不会像 它们本来应该的那样恢复到 BoardGpioInitTable 的状态,即使  UART_CLOCSE ()和 I2C_CLOSE ()没有在 它们找到它们时留下它们的 IO 引脚,或者它们只是不关闭它们

    此外、我"不熟悉"、找不到  您建议使用的"功率 TI 驱动器"、以便能够了解如何在 UART 和 I2C 关闭后进行清理。     在哪里可以找到"Power TI Driver"、因为我的弱 Google 尝试失败了?

    谢谢、

    戴尔

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

    如果您通读 了 BLE 软件开发人员指南的第6节 、则会显示在何处查找和整合 TI 驱动程序、例如 C:\ti_tirtos_cc13xx_cc26xx_2_21_01_08\products\tidrivers_cc13xx_cc26xx_2_21_01_01\packages/ti\drivers。  您还可以在此处找到 Power TI 驱动程序、 该驱动程序将在电源管理用户指南中进一步讨论。  驱动器闭合时应取消引脚分配、在调试功能时也可以进一步探讨这一点。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~用户 ID ="114053" URL" URL ="支持/无线连接/蓝牙组/蓝牙/f/蓝 牙论坛/110971/cc2640-当使用 i147-and-UART/41172c#4117147"]
    • 您是否在初始化引脚后、但在打开/使用通信外设之前监控过电流消耗? 还是在初始化 UART/I2C 但尚未打开或使用它们之后尝试测量电流?
    • 您是否仅启用 UART 或 I2C 来确定一个特定的通信外设是否直接导致了该问题?
    • 使用的是 BLE-STACK-2的哪个版本、您是否会考虑升级到最新版本(如果尚未更新)以确定这是否可以解决问题?
    [/报价]

    以上是您提供的报价、但报价框架中的数字1、2和3已被"项目符号"自动替换。  我必须将您的问题 称为第1项、第2项和第3项。

    关于:项目符号2

    在禁用 UART 之前,正如我将在下面描述的那样,我发现在 UART_CLOSE ()之前运行 UART_readCancel()和 UART_writeCancel()可能是明智的。  完成此操作后,休眠电流从1.17ma 变为1.11ma (我看到这是一些进展:)

    然后,我使用#ifdef USEUART ....隔离了引用 UART.h 函数的所有代码 #endif 语句。  然后、我在未定义 USEUART 的情况下遵守并运行当前代码、这有效地从代码中删除了 UART 的使用。  然后、当我预计 CC2640将处于睡眠状态时、电流现在为0.54ma、而不是1.11ma。

    这似乎表明、UART 和 I2C 驱动器可能对我的睡眠电流问题产生了同等的影响。

    关于:项目符号1

    要执行这些建议、我需要在调试会话期间中断代码。  

    我可以加载代码并启动调试会话的唯一方法是将外部电源连接到 PCB。  这可以是12V 直流壁式稳健型适配器、也可以是 5V 直流 USB 插头、这两种电源均可启动为 我的2节镍氢电池提供充电电压的稳压器、每个电源均可通过我的10欧姆电流感应电阻提供充电电流。  此外 、当施加任何外部电源时、分压电阻器网络会在 IOID_14唤醒引脚上提供大约2V 的电压、以便当我们通过 IOID_14上的中断从睡眠状态唤醒时、 我的所有引脚都会重新打开、CYCLE 开始广播、UART/I2C 线路打开。 当从 PCB 上移除外部电压时、我们会执行转至休眠功能。

    因此、当我单击我的断点来回答您在第1个项目符号中的问题时、 我还必须移除为 PCB 供电的外部电源、以便加载代码、从而使我的10欧姆电流感应电阻器上的电压对于您的问题具有任何意义 (另一方面、电流会因电池的充电状态(从几 mA 到50mA 或更高)而发生很大变化。

    如果您了解这种情况、那么这里是断点和10欧姆电阻器在中断期间的电压。

    对于初始化引脚后的电流消耗、我们  在 main.c 中有断点1 (在下面的第20行)、并在电阻器上具有0.0324v 或3.24ma (这是由于高度优化(4个完整程序)而允许的第一个断点(在下面的第6行之后)、 针对我的大型代码项目放宽了浮点值、针对速度与尺寸放宽了浮点值2):

    int main(){
      /* Register Application callback to trap asserts raised in the Stack */
    
      RegisterAssertCback(AssertHandler);
    
      PIN_init(BoardGpioInitTable); 
    
    #ifndef POWER_SAVING
      /* Set constraints for Standby, powerdown and idle mode */
      Power_setConstraint(PowerCC26XX_SB_DISALLOW);
      Power_setConstraint(PowerCC26XX_IDLE_PD_DISALLOW);
    #endif // POWER_SAVING
    
      SPI_init(); //dale
    
      /* Initialize ICall module */
      ICall_init();
    
      /* Start tasks of external images - Priority 5 */
      ICall_createRemoteTasks();
    
      /* Kick off profile - Priority 3 */
      GAPRole_createTask();
    
      ProjectZero_createTask();
    
      /* enable interrupts and start SYS/BIOS */
      BIOS_start();
    
      return 0;
    }

     对于初始化 UART/I2C 但尚未打开或使用它们之后的电流、我们 在 UARTcloseopen 函数()中有断点2 (位于第6行、位于井号中)、并在电阻器上具有0.0388v 或3.88ma。  注意:此时 I2C 也初始化(编辑:从此处删除了"不"并添加了"也")。

        #ifdef USEUART //20001-5
            void UARTcloseopen(void) //nex-1 //can not be called from the main loop! ! ! !
            {
              uartParams.readMode     = UART_MODE_CALLBACK; //nex-2
              uartParams.readCallback = uartRXcallback;     //nex-2
              uartParams.writeMode= UART_MODE_BLOCKING;
              uartParams.readEcho = UART_ECHO_OFF;
              uartParams.readDataMode = UART_DATA_BINARY;
              uartParams.writeDataMode = UART_DATA_BINARY;
              uartParams.baudRate = 19200; //38400; //p2f14-29 to 19200 fix comm issues TESTING THIS
              uartParams.dataLength = UART_LEN_8;
              uartParams.parityType = UART_PAR_NONE;
              uartParams.stopBits = UART_STOP_ONE;
              if (uartHandle != NULL)  {
                  UART_close(uartHandle);
              }
              uartHandle = UART_open(Board_UART0, &uartParams);
              if (uartHandle == NULL)
              {
                  //while(1); //ToDo get rid of this hang point - just took it out for now :)
              } else {
                  UART_read(uartHandle, &uartrxByte, 1); //testuart 1 byte //this read is necessary
                                                     //to turn Rx ON for continuous reads
              }
            }
        #endif

    我不知道在断点处了解这些电流如何帮助我们确定我的睡眠电流为何如此高。  您提出申请的理由是什么?

    关于:项目符号3

    我希望能够升级到最新的 BLE 版本,甚至可以迁移到具有更大内存的电路板上,以用于我的大型项目(我在.c 中有7000行以上的代码)。

    以下是我当前使用的存储器(如果我使用的 SRAM 超过95%、BLE 通信将变得不可靠):

    我花了数千小时对其进行编码、甚至支付了数千美元的顾问费、将代码迁移到最终失败的 CC2640R2F。

    在我看来、BLE 版本的升级可能是为我的睡眠电流问题制定解决方案的一个非常困难的尝试、除非您100%确信 BLE 版本是我问题的原因、否则最近出现了该问题。

    谢谢、

    戴尔

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

    项目符号1:我们尝试区分问题是 PIN 还是 UART/I2C TI 驱动程序、然后区分 导致问题的特定通信外设 API (即初始化、打开、关闭、取消等)。

    要点2:如果两者的贡献相等、则这意味着功率 TI 驱动器不会影响行为、因为它通常会产生"全"或"无"影响(即器件处于空闲状态或进入待机状态)。  取消和关闭通信外设后、您仍可以尝试重新初始化待机功率限制设置。

    要点3:我只知道更新的 SimpleLink 硬件和 TI 驱动程序可能会缓解这种行为、但无论如何、应该可以完全关闭 I2C/UART 模块并在之后进入待机状态。  在 I2C 和 UART 被取消和关闭后、尝试实现初始化期间使用的所有 power_saving 代码、因为这些设置可能由于 TI 驱动程序 API 而改变。

    此致、
    Ryan

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

    当我尝试添加您建议的代码时、我认为您应该添加、由于#ifndef 行、编译的代码不会更改:

    也许这是线索、但当我执行 CCS 全局"工作区搜索"以进行 power_saving (找到82个匹配项)时、 我感到困惑、因为我甚至在 app_ble_uartlog_pem3.cfg 中找到它、它位于非常旧的工作区结构中、而不是在当前的 Project Explorer 树中、但我使用 Windows 搜索在工作区中找到它

    您是否了解我不在这里的原因?

    谢谢、

    戴尔

    编辑: 接下来、我尝试将这些包括项添加到我的 HaloLogger.c 代码中、但6310至6314行仍然灰显:

    #include <ti/drivers/Power.h>
    #include <ti/drivers/power/PowerCC26XX.h>

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

    我本来希望您的项目中能够按照 BLE 软件开发人员指南的第3.7节启用 power_saving

    此致、
    Ryan

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

    我刚才选中了、是的、power_saving 已经并且一直作为预定义符号正确放置、但是 main.c 中的#ifndef 代码不会灰显。

    在我看来、在 main.c 代码中的#ifndef 位置、预定义符号 power_saving 尚未定义、这就是为什么#ifndef 代码未在那里灰显、然后在我之前关闭引脚的 HaloLogger.c 代码中该代码正确灰显的原因 尝试进入睡眠状态。  有可能吗?

    现在、电源管理 API 远远超出了我的知识库、我是否真的必须成为 API 方面的专家、以便在用于 UART 和 I2C 的 TI 通信驱动程序关闭后进行清理 、并再次具有低于30ua 的睡眠电流?

    谢谢、

    戴尔

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

    我 认为、预定义的设置不可能仅适用于项目的某些部分。  您 不必成为电源管理 API 专家即可解决此问题、但调试过程将会受益、因为调试过程可确保应用程序和 UART/I2C 驱动程序 正确释放所有限制和依赖项、并在关闭后注销任何通知。  请注意、当我查看 tirtos_cc13xx_cc26xx_2_21_01_08 TI 驱动程序资源时、情况似乎就是这样。

    此致、
    Ryan

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

    现在、我的睡眠电流小于10ua、我的修改代码也使用了 I2C 驱动器。

    当处理器处于活动状态时、我会闪烁一个 LED 指示灯、以指示是否处于活动状态。

    在睡眠期间、LED 停止闪烁。

    要从睡眠状态唤醒,则对 IOID_14应用>2V 的电压。

    我现在尝试将 UART 驱动程序添加到此代码中、并保持该休眠电流。

    此时、我没有将 UART Tx 和 Rx 引脚连接到外部世界。

    我只在 main.c 中添加了一行代码、这是 一个 UART_init ();如下所示:

    int main(){
      /* Register Application callback to trap asserts raised in the Stack */
    
      RegisterAssertCback(AssertHandler);
    
      PIN_init(BoardGpioInitTable);                                                     //ToDo likely put this back in but this is overridden in HaloLogger.c line 455+ ????????????
    
    #ifndef POWER_SAVING
      /* Set constraints for Standby, powerdown and idle mode */
      Power_setConstraint(PowerCC26XX_SB_DISALLOW);
      Power_setConstraint(PowerCC26XX_IDLE_PD_DISALLOW);
    #endif // POWER_SAVING
    
      UART_init(); //p2f16-test1
    
      SPI_init(); //dale
    
      /* Initialize ICall module */
      ICall_init();
    
      /* Start tasks of external images - Priority 5 */
      ICall_createRemoteTasks();
    
      /* Kick off profile - Priority 3 */
      GAPRole_createTask();
    
      ProjectZero_createTask();
    
      /* enable interrupts and start SYS/BIOS */
      BIOS_start();
    
      return 0;
    }

    我的 BoardGpioInitTable 为:

    const PIN_Config BoardGpioInitTable[] = {  //for explanation of parameters see PIN.h file in drivers
       //these defines are from HaloLoggerV1a.h
       //    #define Board_TPIN                  IOID_0
       //    #define Board_RHPIN                 IOID_1
       //    #define Board_V33PIN                IOID_2
    
      //    #define Board_I2C0_SCL0             IOID_3
      //    #define Board_I2C0_SDA0             IOID_4
    
       //    #define Board_UART_TX               IOID_5
       //    #define Board_UART_RX               IOID_13
    
      //    #define Board_SPI_FLASH_CS          IOID_7
      //    #define Board_SPI0_MISO             IOID_8
      //    #define Board_SPI0_MOSI             IOID_9
      //    #define Board_SPI0_CLK              IOID_10
    
       //    #define Board_REDPIN                IOID_11
       //    #define Board_GLED                  IOID_12
       //    #define Board_WAKEBTN               IOID_14
    
        Board_TPIN   | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,      // initially off
        Board_RHPIN   | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,      // initially off
        Board_V33PIN   | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_OPENDRAIN | PIN_PULLDOWN | PIN_DRVSTR_MAX,      // initially off
    
        Board_I2C0_SCL0  | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_OPENDRAIN | PIN_PULLDOWN | PIN_DRVSTR_MAX,
        Board_I2C0_SDA0  | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_OPENDRAIN | PIN_PULLDOWN | PIN_DRVSTR_MAX,
        Board_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN,                       /* UART RX via debugger back channel */ 
        Board_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL, /* UART TX via debugger back channel */ 
    
        Board_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,  /* External flash chip select    */
        Board_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master out - slave in */
        Board_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master in - slave out */
        Board_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN,                                             /* SPI clock */
    
        Board_REDPIN   | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,      // initially off
        Board_GLED   | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,         /* LED initially off             */
    
        Board_WAKEBTN   | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,            /* Button is active low          */
                                                       //Board_WAKEBTN gets further mapped to Board_HasVoltsOnWakeInput in board.h....
    
        PIN_TERMINATE
    };
    

     由于添加 这一行代码(UART_init();)而导致的行为变化 令人困惑:

    1. 将我的2节镍氢电池连接到7x7 CC2640F128 (约2.7V)
    2. 我在 IOID_14上放置>2V 的电压、以便在调试会话开始时 LED 将立即开始闪烁。
    3. 将 JTAG 10引脚带状电缆连接到 CC2650 LaunchPad 上的 XDS110
    4. 我通过 CC2650 LaunchPad 在 CC2640F128上启动调试会话、LED 闪烁、指示我的活动状态。
    5. 我停止调试会话。
    6. 我从 CC2650 LaunchPad 上拔下 JTAG 带状电缆。
    7. LED 仍然闪烁、来自2.7V 电池的电流为~3mA。
    8. 我删除了已应用到 IOID_14的>2V 电压。
    9. LED 停止闪烁(表示已要求睡眠)
    10. 电池的中间睡眠电流为1170ua (即使重复应用/移除唤醒电压仍会产生该中间1170ua 睡眠电流)
    11. 我从 CC2640上移除/重新应用电池电源 (未知为什么此步骤需要获得最终睡眠电流)。
    12. 从这里的 IN、无论我应用/移除电池的次数是多少次、或者大于2V 到 IOID_14、当需要睡眠时、最终睡眠电流都是680ua、并且 LED 会在需要睡眠时闪烁。  

    当我在没有 UART_INIT()线的情况下执行上述过程时,最终睡眠电流小于10ua

    在我看来、我需要  一个'un-initialize' UART 命令、我可以在调用 UART_init()后调用该命令、以便我能够保持<10ua 的睡眠电流。

    下面是 UART_init()驱动程序代码:

    void UART_init(void)
    {
        if (UART_count == -1) {
            /* Call each driver's init function */
            for (UART_count = 0; UART_config[UART_count].fxnTablePtr != NULL; UART_count++) {
                UART_config[UART_count].fxnTablePtr->initFxn((UART_Handle)&(UART_config[UART_count]));
            }
        }
    }

    在该函数中几乎看不到什么、因此我不知道如何"取消初始化" UART 驱动程序。

    我可以从这里转到哪里?

    谢谢、

    戴尔

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

    我仍然能够在收件箱中查看您的原始回复:)在测量之前或之后,BoardGpioInitTable 是否已修改?  目前我唯一的评论是 UART_init 从 UART 函数表映射到 UARTCC26XX_init、UARTCC26XX.c 文件对此进行了详细介绍。   

    void UARTCC26XX_init(UART_Handle handle)
    {
        UARTCC26XX_Object           *object;
    
        /* Get the pointer to the object */
        object = handle->object;
        object->opened = false;
    
        /* Init the power constraint flag. */
        uartRxPowerConstraint = false;
        uartTxPowerConstraint = false;
    }

    所有这些资源均位于中 products\tidrivers_cc13xx_cc26xx_*\packages/ti\drivers\(如果要将它们直接放入项目中进行步进调试)。  话虽如此、这些函数中没有任何内容意味 着您观察到的功耗增加。

    此致、
    Ryan

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

    像往常一样、当我发布一篇详细的文章、使我的旅程更加具体化时、我能够固定所有细节、最后用 另一个固定装置更深地向下钻一个孔。

    在我发布了这篇长文章之后、我只需要仔细检查所有内容、然后"注意"我开始修复这样一个事实、即我说 UART 引脚未连接到外部世界。  虽然这可能确实如此、但我在 UART Tx 上确实有一个外部上拉电阻器、该上拉电阻器与 我在两个 I2C 引脚上的上拉电阻器连接到同一个悬空点。  当我向 I2C 带状电缆启用2.7V REG710nA-2.7/250稳压器(向 I2C 器件发送2.7V 电源、向我的所有通信上拉电阻发送2.7V 电源)时、这个关头会施加2.7V 电压。  

    当 UART_init()运行时,UART Tx 线路开始通过我的 Tx 上拉电流与 I2C 上拉电阻相结合,然后通过我 在 BoardGpioInitTable 中给出的 I2C 线路的内部下拉电阻进行馈电。。。。  当我完全移除到达 I2C 上拉电阻器高/浮点端的 TX 上拉电阻器时、使用 UART_INIT()后的最终睡眠电流 会变为<10ua  

    我的问题是、在现实生活中、UART Tx 和 Rx 线路都将具有上拉电阻、因为我必须与5伏 UART 器件通信、并且我必须将2.8伏 nexion UART 线路"电平转换"为5V 线路、 如下所示:

    这些 R14上拉电阻会在睡眠期间交叉馈送到 I2C 引脚、并再次损坏我的睡眠电流  

    我不知道如何解决这个问题,但我正在努力解决这个问题。。 (我希望我现在可以把这篇长文章放回去;)

    戴尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~用户 id="114053" url="支持/无线连接/bluetooth-group/f/bluetooth-forum/110971/cc2640-mreimitating-currence-when 使用时睡眠- i2c-and-UART/4129364#4129364]\n 测量完成后,我仍能在收件箱中查看原始响应:)  [/报价]

    BoardGpioInitTable 对于所有测试都是相同的。

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

    感谢您的更新!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="114053" URL"~μ C/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-mreiminating-currence-when 使用时使用 i2c-and-UART/4129364#4129364"]话虽如此、这些函数中没有任何内容意味 着功耗的增加/引用]

    我仍然发现我的 UART Tx 上拉直到 UART_INIT()被放置在代码中之后才会泄漏。  这意味着 UART_INIT()确实会导致上拉泄漏,但在进入睡眠模式之前,我仍然可以“取消初始化”UART,以便我可以使用逻辑电平转换器上的上拉电阻, 以便可以与5V 电压进行通信 器件、我将启动...  

    戴尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="114053" URL"/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-miminimering-currence-when 使用时使用 iinit-and-UART/4129364#4129364"]目前唯一的注释是 UART_maps 至 UART26XX.UART26XX.UARTc 表中 UART26XX.c 函数的 UART26XX。  [/报价]

     UART_init 如何映射到 UARTCC26XX_init、因为 UART_init 具有 void 参数且 UARTCC26XX_init 需要 UART_Handle 参数?

    戴尔

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

    UARTCC26XX_fxnTable   旁边的函数表指针 UART_FxnTable 和 fxnTablePtr 。  这就是所有 UART 命令如何连接到特定的 UARTCC26XX TI 驱动程序。

    此致、
    Ryan

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

    我现在不能把我的大脑缠绕在这上面、但是如果 我按  如下方式编辑 UARTCC26XX_init、我可以通过上面所述的将外部上拉电阻连接到 Tx 并在代码中使用 UART_INIT ()获得<10ua 睡眠:

    void UARTCC26XX_init(UART_Handle handle)
    {
        UARTCC26XX_Object           *object;
    
        /* Get the pointer to the object */
        object = handle->object;
        object->opened = false;
    
        /* Init the power constraint flag. */
        uartRxPowerConstraint = true; //dale from false to true
        uartTxPowerConstraint = true; //dale from false to true
        
        //dale , since in our case we never have or expect UART communication 
        //       during sleep, then we do not need to need to leave the Tx and
        //       Rx lines open during sleep
    }

    现在,让我们看看在我添加打开 UART、在 UART 上进行通信然后关闭 UART 的代码之后,我们是否仍然得到<10ua...

    戴尔

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

    如此之近  

    我已将一个完整的 UART 会话从 UART_Init()隔离到 UART_Close(),并将其放置在函数"static void ProjectZero_taskFxn (UArg0、UArg1){"中的"Application main loop"前面。  除下面编译的代码外、没有其他 UART 代码。

    以下是该代码:

      //p2f16-test4 start
      UART_init();
      UART_Params_init(&uartParams);
      uartParams.readMode     = UART_MODE_CALLBACK;
      uartParams.readCallback = uartRXcallback;
      uartParams.writeMode= UART_MODE_BLOCKING;
      uartParams.readEcho = UART_ECHO_OFF;
      uartParams.readDataMode = UART_DATA_BINARY;
      uartParams.writeDataMode = UART_DATA_BINARY;
      uartParams.baudRate = 19200;
      uartParams.dataLength = UART_LEN_8;
      uartParams.parityType = UART_PAR_NONE;
      uartParams.stopBits = UART_STOP_ONE;
    
      uartHandle = UART_open(Board_UART0, &uartParams);
    
      if (uartHandle == NULL)
      {
          while(1);
      }
    
      UART_read(uartHandle, &uartrxByte, 1); //byte, this read is necessary
                                             //to turn Rx ON for continuous reads
      char Numbercmd[32] = {0,};
      strcat(Numbercmd,(char *)"pg0.ec=99999\xFF\xFF\xFF");
    //  int32_t writeback = UART_write(uartHandle, Numbercmd, strlen(Numbercmd));
    //  if (writeback != strlen(Numbercmd)){
    //      while(1);
    //  }
    
      if (uartHandle != NULL)  {
          UART_readCancel(uartHandle);
          UART_writeCancel(uartHandle);
          UART_close(uartHandle);
      }
      //p2f16-test4 end
    
      // Application main loop
      for (;;)  {

    编辑、这里是我的回调代码:

            static void uartRXcallback(UART_Handle handle, void *buf, size_t count) { //nex-2
              UART_read(uartHandle, &uartrxByte, 1); //testuart 1 byte //this read is necessary
                                                 //to turn Rx ON for continuous reads
    
              // Store the event.
              events |= UART_DATA_RCVD_EVT;
              //Wake task
              Semaphore_post(sem);
            }

    当运行上述代码(只有 UART_READ 就位)时、最终睡眠电流达到<10ua、到目前为止还不错...

    但是、当我对在上述代码中执行 UART_WRITE 的4条线进行解算时、最终睡眠电流为0.93ma  

    有什么想法、原因是我在"void UARTCC26XX_init (UART_Handle handle)"中仍将功率限制设置为"true"?

    根据上述文章、编辑上述内容当然是在 Tx 上安装上拉电阻器、有关  在"void UARTCC26XX_init (UART_Handle handle)"中将功率限制设置为"true"的内容

    谢谢、

    戴尔

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

    您好 Dale、

     请在写入后立即尝试使用 UART_writeCancel (由于使用了 UART_Blocking_mode、因此应完成该操作)、因为此函数将禁用 TX 并允许待机。  还要确保未进入 while (1)循环、这会导致器件保持活动模式。

    此致、
    Ryan

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

    我的 while (1)语句未被输入、我知道这一点是因为当进入主循环时、我的 LED 在该 UART 测试代码之后开始闪烁。  由于我的程序优化级别较高、我无法在 while (1)行中放置断点。  编辑 我知道、如果我在启动调试会话后暂停执行、 代码会在 while (1)语句处中断、但 使用我的闪烁 LED 方法知道代码执行已通过 while (1)的、这并不意味着我必须记住暂停执行、只需查看是否输入了 while (1)。

    根据您的建议、我在写入后立即放入"UART_writeCancel (UART_writeCancel)"、最终睡眠电流仍然为0.93ma。

    此处是我添加了 UART_writeCance 的位置、我不确定为什么移动 UART_writeCancel 与我的代码将 UART_writeCancel 放置在 UART_Close 之前的位置有什么不同。

      //p2f16-test4 start
      UART_init();
      UART_Params_init(&uartParams);
      uartParams.readMode     = UART_MODE_CALLBACK;
      uartParams.readCallback = uartRXcallback;
      uartParams.writeMode= UART_MODE_BLOCKING;
      uartParams.readEcho = UART_ECHO_OFF;
      uartParams.readDataMode = UART_DATA_BINARY;
      uartParams.writeDataMode = UART_DATA_BINARY;
      uartParams.baudRate = 19200;
      uartParams.dataLength = UART_LEN_8;
      uartParams.parityType = UART_PAR_NONE;
      uartParams.stopBits = UART_STOP_ONE;
    
      uartHandle = UART_open(Board_UART0, &uartParams);
    
      if (uartHandle == NULL)
      {
          while(1);
      }
    
      UART_read(uartHandle, &uartrxByte, 1); //byte, this read is necessary
                                             //to turn Rx ON for continuous reads
      char Numbercmd[32] = {0,};
      strcat(Numbercmd,(char *)"pg0.ec=99999\xFF\xFF\xFF");
      int32_t writeback = UART_write(uartHandle, Numbercmd, strlen(Numbercmd));
      UART_writeCancel(uartHandle);
      if (writeback != strlen(Numbercmd)){
          while(1);
      }
    
      if (uartHandle != NULL)  {
          UART_readCancel(uartHandle);
          UART_writeCancel(uartHandle);
          UART_close(uartHandle);
      }
      //p2f16-test4 end

    [引用 userid="114053" URL"~/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-最小化睡眠电流-使用时使用 i2c-and-UART/4133245#4133245"]、因为此函数将禁用 TX 并允许待机

    请记住  、根据上述文章、我的外部上拉电阻现在已重新安装在 Tx 上、有关  在"void UARTCC26XX_init (UART_Handle handle)"中将功率限制设置为"true"的内容

    谢谢、

    戴尔

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

    我很抱歉 Dale、因为我没有密切注意您现有的 UART_writeCancel/Close 的条件。  正确的做法是、附加的 UART_writeCancel 不应更改重要事项。  如果移除外部引脚连接(作为测试)、睡眠电流状态是否会改善?  我认为您无需更改  UARTCC26XX_init 中的 UART[Rx/Tx]PowerConstraint 、因为它们在 UART TI 驱动程序运行期间由 threadSafeStdbyDis [Set/Release]进行修改。

    此致、
    Ryan

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

    如果我移除  了 Tx 上的外部上拉 电阻并对 执行 UART_WRITE 的4条线路进行解调、则最终睡眠电流仍为0.93ma。

    这很令人困惑、UART_WRITE 命令似乎在 UART_INIT 之后重新配置 TX 引脚、以便不再达到<10ua 睡眠...

    根据我之前的帖子、只有代码中的 UART_init 和我的 TX 上拉电阻器才能实现<10ua 睡眠的唯一方法是 在   UARTCC26XX_init 中将 UART[Rx/Tx] PowerConstraints 设置为"true"  

    谢谢、

    戴尔

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

    由于我的 UART Tx 被定义为 IOID_5、并且 IOID_5 也被连接到10导体 JTAG 调试带状电缆的引脚4、 固件中仍有一些调试固件可运行、即使在移除 JTAG 带状电缆的情况下也会影响 IOID_5的状态?

    如果是这样、是否有办法编译固件而不使用该段代码来查看是否是由什么导致的?

    谢谢、

    戴尔

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

    您能否进一步调试 UARTCC26XX.c 以确保   UARTCC26XX_WRITE 或  UARTCC26XX_writeCancel 期间调用 threadSafeStdbyDisRelease (&uartTxPowerConstraint)?  这是允许再次进入待机模式所必需的、我不确定是否已完成。  可能值得添加到 UARTCC26XX_writeCancel 中没有要写入的内容且 TX FIFO 为空的情况、或添加到 UARTCC26XX_close 中。  您还可以测试回调模式以确定其性能是否更好。

        /* Return if there is nothing to write and TX FIFO is empty. */
        if ((!object->writeSize) && (!UARTBusy(hwAttrs->baseAddr))) {
            threadSafeStdbyDisRelease(&uartTxPowerConstraint); //ADDED
            Hwi_restore(key);
            return;
        }

    您使用的是哪种器件封装?  这可能适用于 RHB、但不适用于 RGZ 或 RSM。  您可以确保从 CCS 中的目标配置(CCXML)文件中选择2引脚 JTAG。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="114053" URL"/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-最小化睡眠电流-使用时使用 i2c-and-UART/4135086#4135086"]您正在使用哪种器件封装?  这可能适用于 RHB、但不适用于 RGZ 或 RSM。  您可以确保从 CCS 中的目标配置(CCXML)文件中选择2引脚 JTAG。

    我的 cc2640f128位于经 FCC 认证的子板上、该子板焊接到我的 PCB 上。

    cc2640f128位于子板上的屏蔽层下、但我知道它是7x7配置。

    以下是我的调试目标信息:

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

    7x7为 RHB、目标配置设置为2引脚、因此不应存在任何内部 JTAG 干扰。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="114053" URL"~/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-meze-mising-currenty-using i2c-and-UART/4135086#4135086"]\n 您能否在 UCC26XX.c   期间进一步调试 UART26XX.c (以确保在 UART26xx 或 UART26xx 过程中调用 UARTIDENDPRIMEART26xx?    [/报价]

    在 UARTCC26XX_writeCancel 中调用了 threadSafeStdbyDisRelease。

    [引用 userid="114053" URL"~/support/wireless-connectivity/bluetooth-group/f/bluetooth-forume/110971/cc2640-mimerating-currence-when 使用时睡眠电流- i2c-and-UART/4135086#4135086"]在 UARTCC26XX_exclose 为空或未写入 UART26XX_exempty 或未写入 UART26XX_exempty 的情况下、可能需要添加引号、但 UARTCC26XX_writeFIFO]

    我已将修改后 的 UARTCC26XX.c 与您的"添加"行连接、但我们仍然具有.93ma 待机。

    e2e.ti.com/.../UARTCC26XX.zip

    [引用 userid="114053" URL"~/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-mallowing-currence-when 使用时使用 i2c-and-UART/4135086#4135086"]您还可以测试回调模式以确定其性能是否更好。

    我不确定如何快速完成、我将尝试找出它...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="114053" url="~/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-mimerating-currence-when 使用时使用的 UART[Safinit-and-UART/4133394#4133394"]由于  UARTx/UARTx]  驱动程序在 UARTx[CC26XX/UARTx]运行过程中已被修改、因此我认为您不需要修改 UARTx[THREADY.init/UARTx]。

    在进一步研究 UART 驱动程序后、我决定提出一个不 会改变  UARTCC26XX_init 中 UART[Rx/Tx]PowerConstraint 的解决方案、因此我将其设置回"false"并继续运行。

    然后,出于某种未知原因,如果 UART_READ()不在代码中,但 UART_WRITE()可能在代码中,我只能实现<10ua 睡眠。

    我放弃了尝试、试图弄清楚该开关是如何发生的。

    不过、在一个问题上、我曾考虑过、由于我们在告知功率限制应在我的 UART_Close 之后允许待机状态时遇到了困难、也许我不应让功率限制设置为在 UART_Close 之后阻止待机状态开始。

    那么...在 UARTCC26XX_Read()和 UARTCC26XX_write()(在 UARTCC26XX.c 中)中、I REMMED 均为以下行:

        /* Set constraint for sleep to guarantee transaction */
    //    threadSafeStdbyDisSet(&uartRxPowerConstraint);   //dale try remmed out - WOW it worked!! <10ua final sleep

    神圣的“你知道什么”,它的作用!!!!

    我现在已经在我的代码中将我之前编写的所有 UART 代码"有效并运行"、我可以获得<10ua 的最终睡眠(待机)电流

    现在、这似乎是我的主题问题的最终解决方案、但在此过程中还发现了其他问题。

    我现在将把这一问题标记为已解决,但也许值得将这一议题留待一段时间,因为我对这一解决办法还不是完全满意。

    如果有人需要担心在进入待机状态时切断 UART 传输/接收、应该有更好的通用方式来打开/关闭此功能、但幸运的是、我不在乎这一点。  

    我希望这一解决方案将继续 实现我所需要的目标。。

    感谢 Ryan 的所有帮助、

    戴尔

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

    嗯,有些东西太好了,不能真正的:(

    我现在通过在 UART Tx 和 Rx 上使用我的2.8V 至5V 电平转换器与实际外部器件之间发送和接收 UART 数据来测试此解决方案。

    遗憾的是、当 RX 引脚上有有效数据时、UART 读取不再被触发并发送到我的 uartRX回 调函数。

    为了使代码再次运行、我只需在 UARTCC26XX_READ()和 UARTCC26XX_WRITE ()(在 UARTCC26XX.c 中)中使用以下行:

    /* Set constraint for sleep to guarantee transaction */
    threadSafeStdbyDisSet(&uartRxPowerConstraint); //dale has to be IN to trigger UART reads

    但是,当我这样做时,我再也不能获得低于10 us 的最后睡眠。

    如果名为'ontCall'的全局变量为 true,我正在考虑将这两行放在不调用 threadSafeStdbyDisSet()的'if'语句中。

    然后、当我关闭引脚并设置为进入睡眠模式时、我设置 dontCall = 1、然后进行写入和读取操作、以便我可以获得<10ua 的最终睡眠电流。

    当然、一旦我从睡眠中唤醒、我就必须将 dontCall 设置回0。

    这是一种油腻的杂乱、您能想到另一种方法来实现它吗?

    谢谢、
    戴尔

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

    感谢您的更新。  这是一个相当复杂的解决方案、但目前我没有任何建议。  如果它能解决问题、我建议您继续使用它。

    此致、
    Ryan

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

    在我提出了一个复杂的解决方案以及许多其他想法之后,我仍然没有一个有效的解决方案。

    但是、我确实对 UART 驱动程序文件和  CC26xx 的 TI-RTOS 电源管理器有了更多的了解。

    最终似乎只有我使用回调模式进行的持续 UART_REREADING 才会导致该问题。

    尽管在 UART_close()之前调用 UART_readCancel(),但功率限制从未处于低于10ua 的最终睡眠状态。

    因此,我后退并开始使用完全库存的 UART 驱动程序文件(uart.h、uart.c、 UARTCC26XX.h 和 UARTCC26XX.c), 然后在 UARTCC26XX_close()函数的末尾添加了这一行代码(在 UARTCC26XX.c 文件中 ):

    threadSafeStdbyDisRelease(&uartRxPowerConstraint);

    这就是它。。。。

    我现在使用 UART Tx 和 Rx 上的2.8V 至5V 电平转换器与实际外部器件之间发送和接收 UART 数据、并且我仍然可以获得<10ua 的最终睡眠电流

    该解决方案最糟糕的部分是,如果 Power_setConstraint()和 Power_releaseConstraint()的匹配对以某种方式退出同步,现在 sorta 对我来说是有意义的...

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

    故事还在继续…

    当我从<10ua 的"标准/睡眠"状态中唤醒时、我的 AON_RTC.sec 寄存器已重置为0、所有 RAM 变量都已重新初始化值、就像我们从"hard reboot"状态开始、main.c 例程再次开始。

    我通过向引脚 IOID_14施加电压来唤醒、该引脚具有可再次打开引脚以及 I2C 和 UART 以及 BLE 广播的中断代码。

    在此睡眠状态期间,我可以单步执行调试会话,并看到  AON_RTC.sec 寄存器正在正确递增(在“寄存器”选项卡中),  并且我的 RAM 变量值 良好(如“表达式”选项卡中所示)。  因此、当我唤醒并重新初始化 RAM 变量值时、AON_RTC.sec 寄存器必须以某种方式复位。

    向 IOID_14施加电压后、我无法继续调试会话、因为调试会话崩溃并出现错误:

    "JTAG 通信错误:(错误-1170 @ 0x0)无法访问 DAP"

    有什么想法要看下一页吗?

    谢谢、

    戴尔

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

    如何初始化/配置 IOID_14引脚?   您的描述与进入和退出关断模式(例如 AON 域和 RAM 被复位、JTAG 断开)。  您能否在不使用调试器的情况下确定器件是否在 main 重新启动?

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="114053" URL"~/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-miminessing-currence-why-using-i2c-and-UART/4148415#4148415"]您能否确定您的器件是否在 main 重新启动而不使用调试器[引用/引用]

    我在 main.c 中放入代码、每次运行 main.c 代码时、闪烁一个黄色 LED 2秒钟。  由于黄色 LED 闪烁、我可以说是的、每次我在没有运行调试会话的情况下向 IOID_14重新施加高电压时、main.c 代码都会运行。  

    [~ userid="114053" URL"/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-mreimizing-currence-when 使用时使用 i2c-and-UART/4148415#4148415"]如何初始化/配置 IOID_14引脚?[/引用]

    我 从在 ProjectZero 中放弃按钮按压操作的现有代码开始、然后对其进行了轻微修改。

    我使用如下所示的引脚表定义功能并设置引脚参数:

        static void user_enqueueRawAppMsg(app_msg_types_t appMsgType, uint8_t *pData, uint16_t len );
        static void buttonCallbackFxn(PIN_Handle handle, PIN_Id pinId);
        static void buttonDebounceSwiFxn(UArg buttonId);
        static void user_handleButtonPress(button_state_t *pState);
        
        PIN_Config buttonPinTable[] = {
            Board_HasVoltsOnWakeInput | PIN_INPUT_EN  | PIN_IRQ_POSEDGE,                                                              // Board_WAKEBTN   | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,
            PIN_TERMINATE
        };

    然后 在 ProjectZero_init()中执行以下操作:  

      // Setup callback for button pin
      if (PIN_registerIntCb(buttonPinHandle, &buttonCallbackFxn) != 0) {
        Log_error0("Error registering button callback function");
        Task_exit();
      }
    
      // Create the debounce clock objects for Button
      Clock_Params clockParams;
      Clock_Params_init(&clockParams);
    
      clockParams.arg = Board_HasVoltsOnWakeInput;
      Clock_construct(&buttonWakeDebounceClock, buttonDebounceSwiFxn,
                      1000 * (1000/Clock_tickPeriod),
                      &clockParams); //~1 second total debounce

    以下是功能代码:

    static void user_enqueueRawAppMsg(app_msg_types_t appMsgType, uint8_t *pData,
                                      uint16_t len)
    {
      // Allocate memory for the message.
      app_msg_t *pMsg = ICall_malloc( sizeof(app_msg_t) + len );
    
      if (pMsg != NULL)
      {
        pMsg->type = appMsgType;
    
        // Copy data into message
        memcpy(pMsg->pdu, pData, len);
    
        // Enqueue the message using pointer to queue node element.
        Queue_enqueue(hApplicationMsgQ, &pMsg->_elem);
        // Let application know there's a message.
        Semaphore_post(sem);
      }
    }

    static void buttonCallbackFxn(PIN_Handle handle, PIN_Id pinId)
    {
      PIN_setConfig(handle, PIN_BM_IRQ, pinId | PIN_IRQ_DIS);
      // Start debounce timer
      switch (pinId)
      {
        case Board_HasVoltsOnWakeInput:
          Clock_start(Clock_handle(&buttonWakeDebounceClock));
          break;
      }
    }

    static void buttonDebounceSwiFxn(UArg buttonId)
    {
      // Used to send message to app
      button_state_t buttonMsg = { .pinId = buttonId };
      uint8_t        sendMsg   = FALSE;
    
      // Get current value of the button pin after the clock timeout
      uint8_t buttonPinVal = PIN_getInputValue(buttonId);
    
      // Set interrupt direction to opposite of debounced state
      if (buttonPinVal)
      {
        // Enable negative edge interrupts to wait for removal of volts 
        PIN_setConfig(buttonPinHandle, PIN_BM_IRQ, buttonId | PIN_IRQ_NEGEDGE);
      }
      else
      {
        // Enable positive edge interrupts to wait for an apply volts 
        PIN_setConfig(buttonPinHandle, PIN_BM_IRQ, buttonId | PIN_IRQ_POSEDGE);
      }
    
      switch(buttonId)
      {
        case Board_HasVoltsOnWakeInput:
          if (buttonPinVal && buttonWAKEstate)
          {
            // we DO have volts
            buttonMsg.state = buttonWAKEstate = 1;
            sendMsg = TRUE;
          }
          else if (!buttonPinVal && !buttonWAKEstate)
          {
            // we DON'T have volts
            buttonMsg.state = buttonWAKEstate = 0;
            sendMsg = TRUE;
          }
          break;
      }
    
      if (sendMsg == TRUE)
      {
        user_enqueueRawAppMsg(APP_MSG_BUTTON_DEBOUNCED,
                          (uint8_t *)&buttonMsg, sizeof(buttonMsg));
      }
    }

    static void user_handleButtonPress(button_state_t *pState)
    {
      switch (pState->pinId)
      {
        case Board_HasVoltsOnWakeInput:
            checkwakebutton(); //this is where we get woken up from sleep with an interrupt!!!!
            break;
      }
    }

    所有这些似乎都协同工作、直到某个时间点、因为我现在已经设置了断点并单步执行了在我向 IOID_14施加电压后运行的代码。

     buttonDebounceSwifxn()会被触发,sendMSG 会被设置为 true, USER_enqueueRawAppMsg (app_MSG_button_debounced,
    (uint8_t *)&buttonMsg、sizeof (buttonMsg))在 buttonDebounceSwifxn ()结束时运行。  此时代码仍在运行并可以暂停,但  USER_enqueueRawAppMsg()函数中的断点永远不会被触发 ,因此最终 USER_handleButtonPress()永远不会被调用,这正是我在放置中断后真正唤醒事物的例程的位置。

    我不确定在中断并单步执行上述方法等代码时为什么不再断开 JTAG 连接。

    这是否为您提供了有关正在发生的情况的任何线索?

    谢谢、

    戴尔

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

    您的代码正在根据黄色 LED 指示灯进行复位、这可能来自硬件(例如  IOID_14与电源或复位引脚之间短路)或软件(例如断言)、但很难告知可用信息。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="114053" URL"/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-mreiminating-currence-when 使用时使用 i2c-and-UART/4149182#4149182"]您的代码正在根据黄色 LED 指示器进行重置,这可能来自硬件 和 IOID/14引脚之间的短时间[或短引号]。

    我可以分享原理图中显示 IOID_14连接和复位引脚连接的部分:

    复位引脚只会进入 JTAG 接头、我从不在代码中控制该引脚。

    IOID_14获取从5V USB 连接器或12v 插头上的分压器唤醒的电压。

    我想这会排除硬件复位、不是吗?

    [~ userid="114053" url="/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-最小化睡眠电流-使用时使用 i2c-and-UART/4149182#4149182"]或软件(例如断言)

    我从不在代码中将复位引脚置为有效、是否有其他断言会在软件中导致此情况?

    谢谢、

    戴尔

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

    IOID_14的输入电压电平是多少?  高于 VDD 的电压可能会导致内部硬件故障和器件损坏。  看门狗触发器、TI-RTOS/HWI 故障 或射频堆栈问题都可能导致断言。  您可以查看代码中的主断言处理程序以确定固件如何处理断言。

    此致、
    Ryan

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

    根据数据表、引脚上的最大电压为4.1V。  在5V IN 时、分压器提供的电压约为3.7V、而在12V IN 时、分压器提供的电压约为2.8V。

    抱歉,我猜错了一个说法;)

    我发现在我的 cc2640.cfg 中我有 BIOS.sertsEnabled = false;

    在 main.c 中、我尚未编辑 AssertHandler 函数:

    void AssertHandler(uint8 assertCause, uint8 assertSubcause)
    {
      // Open the display if the app has not already done so
      if ( !dispHandle )
      {
        dispHandle = Display_open(Display_Type_LCD, NULL);
      }
    
      Display_print0(dispHandle, 0, 0, ">>>STACK ASSERT");
    
      // check the assert cause
      switch (assertCause)
      {
        case HAL_ASSERT_CAUSE_OUT_OF_MEMORY:
          Display_print0(dispHandle, 0, 0, "***ERROR***");
          Display_print0(dispHandle, 2, 0, ">> OUT OF MEMORY!");
          break;
    
        case HAL_ASSERT_CAUSE_INTERNAL_ERROR:
          // check the subcause
          if (assertSubcause == HAL_ASSERT_SUBCAUSE_FW_INERNAL_ERROR)
          {
            Display_print0(dispHandle, 0, 0, "***ERROR***");
            Display_print0(dispHandle, 2, 0, ">> INTERNAL FW ERROR!");
          }
          else
          {
            Display_print0(dispHandle, 0, 0, "***ERROR***");
            Display_print0(dispHandle, 2, 0, ">> INTERNAL ERROR!");
          }
          break;
    
        case HAL_ASSERT_CAUSE_ICALL_ABORT:
          Display_print0(dispHandle, 0, 0, "***ERROR***");
          Display_print0(dispHandle, 2, 0, ">> ICALL ABORT!");
          HAL_ASSERT_SPINLOCK;
          break;
    
        default:
          Display_print0(dispHandle, 0, 0, "***ERROR***");
          Display_print0(dispHandle, 2, 0, ">> DEFAULT SPINLOCK!");
          HAL_ASSERT_SPINLOCK;
      }
    
      return;
    }

    如果我在该 AssertHandler()函数的第一行上放置一个断点,则在中应用12v (或 IOID_14上的2.8V)后,在我断开 JTAG 连接之前,它不会被触发。

    这是否证实断言不会导致问题?

    谢谢、

    戴尔

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

    3.7V 仍可能比 VDD 高0.3V、这对于器件而言不是建议的操作。  AssertHandler 操作看起来是 HAL_ASSERT_SPINLOCK (即永远循环)、而不是启动软复位。

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [~ userid="114053" url="/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-最小化睡眠电流-使用时使用 i2c-and-UART/4150172#4150172]3.7V 仍可能比 VDD 高0.3V、这不是器件建议的操作电压/报价单[。]

    正如我说过的、我仅使用12v 分压器进行测试、该分压器在 IOID_14上提供2.8V 电压。  我计划更改用于 USB 唤醒的分压器、以获得大约3V 的电压、这在将来应该很好。  顺便说一下、我从未遇到过通过将3.7V 放在 IOID_14上的分压器通过 USB 唤醒此板的先前版本的问题。

    [引用 userid="114053" url="~/support/wireless-connectivity/bluetooth-group/f/bluetooth-forume/110971/cc2640-metting-sleeping-currence-why-using-i2c-and-UART/4150172#4150172"] AssertHandler 操作似乎是 HAL_SPINLOCK[、而不是永久启动软循环](即、而是启动软循环)。

    但是,如果从不触发 AssertHandler 第一行上的断点(“if (!dispHandle”),如何才能达到 HAL_ASSERT_SPINLOCK? (由于高度优化、我只能在第一行上放置一个断点)。

    谢谢、

    戴尔

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

    对 IOID_14施加2.8V 电压 后、我现在能够更进一步地跟踪代码执行情况、从下图中可以看出 IdleTask 栈出错、导致代码停止执行。

    迄今为止、我从未见 过 IdleTask 堆栈峰值超过512个堆栈中的240个。

    我的代码已稳定运行了很多个月、这种从<10ua 睡眠状态唤醒的现象似乎会导致堆栈错误。

    这能让我们更进一步吗?

    编辑:为了达到这一步、我还不能包含唤醒后重新打开 UART 的代码。

    谢谢、

    戴尔

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

    有一 个 BLE-Stack 调试指南 、其中讨论了堆栈溢出的一些原因、尽管通常不是空闲任务堆栈所能预料到的。  这是否在没有对 TI 驱动程序或 BLE-Stack 源代码进行任何更改的情况下发生?

    如果您遇到与基于 UART/I2C 睡眠电流的原始 POST 无关的其他问题、则最好启动新线程。   

    此致、
    Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="114053" url="~/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-miminessing-currence-when 使用 时使用 i2c-and-UART/4150671#4150671"]有一个 BLE-Stack 调试指南讨论了堆栈溢出的一些原因,尽管通常不是空闲任务堆栈溢出。]

    我在该文档中找不到有关调试 IdleTask 栈问题的信息。 通常、针对堆栈大小错误给出的解决方案只是为了增加大小。

    此堆栈的大小由 一个名为 Program.stack 的变量在我的 cc2640.cfg 中设置(因此我将其称为 Program.stack)。  

    我尝试从512改为768、但我的程序不能放入内存中。 我已经在最高级别进行编译、这对我来说很有用、即"整个程序和大小与速度2 "。

    我尝试了640、但它使用的 SRAM 编译比512多128个字节、但 ROV 仍然显示为512。

    因此、我看不到它在更大的 Program.stack 大小下是如何工作的  

    编辑:到目前为止、我无法找到如何在 IdleTask 堆栈中更改大小。

    此外、如果是堆栈大小问题、为什么它仅在从该睡眠状态唤醒时出现?

    [引用 userid="114053" URL"~μ C/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-miminating-currence-why-use-i2c-and-UART/4150671#4150671"]在不更改 TI 驱动程序或 BLE-Stack 源代码的情况下是否会发生此情况?[引用/引号]

    其中唯一的变化是在  UARTCC26XX_CLOSE (文件 UARTCC26XX.c 中)函数末尾添加了行 threadSafeStdbyDisRelease (&uartRxPowerConstraint)。 在这一行中、我会因 IdleTask 堆栈错误从<10ua 的最终睡眠电流中唤醒。

    但是、即使没有对 TI 驱动程序或 BLE-Stack 源代码进行任何更改、唤醒行为也是相同的 IdleTask 堆栈错误、但 我从900ua 最终睡眠电流中唤醒。

    [~ userid="114053" URL"/support/wireless-connectivity/bluetooth-group/f/bluetooth-forum/110971/cc2640-miminessing-currence-when 使用时使用 i2c-and-UART/4150671#4150671"]如果您遇到与基于 UART/I2C 的原始帖子无关的其他问题、则可以最好是新线程启动。   [/报价]

    此时,我仍然相信,这一唤醒问题在某种程度上与最终达到低睡眠电流有关(考虑到我以2-3000ua 睡眠电流开始这一主题,即使是900ua 也会很低;)。

    如果您认为我应该开始一个有关从睡眠问题中唤醒的新主题、那么我将会这样做。

    谢谢、

    戴尔

    编辑:我在唤醒后尝试不开始 BLE 广播、但相同的 IdleTask 堆栈错误与以前完全相同。