TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

该讨论已被锁定。
您不能再向该讨论中发布新回复。如果您有问题可以开始新讨论

[参考译文] TMS320F28069:TMS320F28069

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/652383/tms320f28069-tms320f28069

器件型号:TMS320F28069
主题中讨论的其他器件:C2000WARE

您好!

我们 要将器件置于低功耗关断模式、我们使用空闲模式和通过 CAN 消息唤醒。 此方案工作正常。

但是、我们需要进一步降低电流、因此需要将器件置于待机或 HALT 模式、但需要在 CAN 消息上唤醒。 如何执行此操作?

 是否有任何一个使用了 CAN 消息作为唤醒的待机或 HALT 模式?  

请提供建议。 我们需要尽快解决这个问题。

此致、

Pandurang Khutal

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

    只有在空闲模式下、才可以使用 CAN 或任何外设在 LPM 模式下唤醒器件。

    您可以通过几种方法进一步降低功耗。 您是否已禁用其他外设时钟? 此外、由于 CAN 以最高1MHz 的频率运行、因此您可以在进入空闲状态之前降低系统时钟。 一旦 CAN ISR 开始执行、您可以恢复全速操作。


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

      是的。 我禁用了其他外设的时钟、现在电流为@40mA。 系统使用电池运行、需要减小电流、以便延长电池寿命。 因此、我们需要使用待机或 HALT 模式。 我们是否可以通过任何方式唤醒控制器? 我知道 GPIOA 端口可以唤醒控制器、但我们需要使用 CAN 消息唤醒?

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

        我们已使用 GPIO30引脚将控制器从 HALT 模式中唤醒。 代码片段如下所示。 现在、在所有模式下都使用 CAN 消息来唤醒控制器。 我已从 PCAN 传输 CAN 消息以唤醒控制器。 但在 IDLE、STANDBY 和 HALT 模式中消耗的电流是相同的。 您能不能建议以下代码中有什么错误?

        我们还禁用了外设的时钟。 要求是进一步降低电流、从而尝试将器件置于待机或 HALT 模式。

        睡眠模式工作电流睡眠模式电流
        空闲130mA60mA
        待机130mA60mA
        停止130mA60mA


        //此函数根据任何将器件置于睡眠模式的请求被调用。 在这个功能之前、所有时钟被禁用
        void enter_lpm (void)

        Dint;

        EALLOW;
        当器件以跛形模式(PLLSTS[MCLKSTS]= 1)运行时、//不要进入 HALT 低功率模式。
        //仅在 PLL 不处于跛形模式时进入低功耗模式。
        if (SysCtrlRegs.PLLSTS.bit.MCLKSTS!= 1)

        //SysCtrlRegs.LPMCR0.bit.LPM = 0x0000;// LPM 模式=空闲
        // SysCtrlRegs.LPMCR0.bit.LPM = 0x0001;// LPM 模式=待机
        SysCtrlRegs.LPMCR0.bit.LPM = 0x2;// LPM 模式=停止


        //选择唤醒源
        GPIO_lpmSelect (hal.gpioHandle、GPIO_Number_30);
        EDIS;

        EnterIntoLMPModes();





        #pragma CODE_SECTION (EnterIntoLMPModes、"ramfuncs");
        void EnterIntoLMPModes (空)

        EALLOW;
        /*将闪存置于最低功耗*/
        FlashRegs.FPWR.bit.PWR = 0;
        /*禁用 XCLKOUT */
        SysCtrlRegs.XCLK.bit.XCLKOUTDIV = 3;
        EDIS;

        //强制流水线清空以确保写入
        //返回前发生最后配置的寄存器。

        _asm (" RPT #7 || NOP");

        /*执行 IDLE 命令以在 CAN 上唤醒*/
        //
        空闲;



        //this is in cmd file for loading ramfuncs
        ramfuncs :load = FLASHG// YJL 以适应引导加载程序
        运行= RAML1、// RAML0_L1以避免与 CAN 引导加载程序发生任何冲突
        load_start (_RamfuncsLoadStart)、
        load_end (_RamfuncsLoadEnd)、
        run_start (_RamfuncsRunStart)、
        load_size (_RamfuncsLoadSize)、
        PAGE = 0

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

          Pandurang、

                     查看您当前的数字,您似乎根本没有进入低功耗模式。

           

          一些与 LPM 相关的位/寄存器受 EALLOW 保护。 可以想象、EALLOW 在代码的其他位置被意外关闭。 在调试完成之前、请注释所有 EDIS 指令。

           

          连接调试器后、在执行 IDLE 指令之前、检查 LPMCR0寄存器是否写入了正确的值。 实际上、您应该在调试器已连接的情况下单步执行代码、以确保代码按应有的方式工作。 例如、它实际上是否跳转到 RAM 来执行闪存断电函数和 IDLE 指令?

           

          请"按原样"在 C2000ware 中运行 Example_2806xHaltWake 项目、并查看您获得的当前编号。 如果您使用该代码作为参考、您应该能够轻松找出代码的错误。 它还会告诉您在您自己的硬件上需要的数字。 此外、您的硬件是否能够测量仅流入您的 MCU 的电流? 换句话说、您测量的电流是否也会流向电路板上的其他一些元件?

           

          如果您使用串联电阻器进行电流测量(以利用欧姆定律)、请非常小心选择的值。 选择高阻值电阻器以获得可测量的压降很有吸引力(因为 HALT 模式电流在 uA 领域)。 但是、这样一个电阻器也会在加电期间使内核"电流"耗尽、并将器件置于一个未定义的状态。 考虑到所有3个 LPM 中的电流值相同、我怀疑这是发生的情况。 您的代码可能根本无法执行。 这就是我希望您在连接调试器的情况下单步执行代码的原因。

           

          无需通过代码禁用待机或 HALT 模式中的外设时钟。 在设计中自动完成的操作。

          • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
            请仔细阅读此帖子。 它提供了一些有用的信息和提示: e2e.ti.com/.../577005
            • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
              您好、Haresh、

              感谢您的更新。

              我们尚未使用电阻器来测量电流。 使用万用表/电源电流显示屏测量电流。

              我们已经对上述代码进行了调试、发现代码正在进入 RAM 区域并清除闪存功率位。 请参阅以下代码。 我们的观察结果是、在调试器弹出错误之前、它不会进入空闲线。 此错误未进入空闲睡眠模式。

              不能单步执行目标程序:
              (错误-1156 @ 0x8856)
              器件可能在低功耗模式下运行。 是否要使其退出此模式? 选择"是"以强制器件唤醒、然后重试此操作。 选择"否"以在不唤醒器件的情况下重试此操作。
              (仿真包7.0.48.0)

              因此、我们认为代码未执行 idel 模型命令、因此未进入 HALT 模式。 您能不能建议上面的代码有什么问题?

              #pragma CODE_SECTION (EnterIntoLMPModes、"ramfuncs");
              void EnterIntoLMPModes (空)

              EALLOW;
              /*将闪存置于最低功耗*/
              FlashRegs.FPWR.bit.PWR = 0;
              /*禁用 XCLKOUT */
              SysCtrlRegs.XCLK.bit.XCLKOUTDIV = 3;
              EDIS;
              //强制流水线清空以确保写入
              //返回前发生最后配置的寄存器。
              _asm (" RPT #7 || NOP");
              /*执行 IDLE 命令以在 CAN 上唤醒*/
              //
              空闲;


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

                只有在 IDLE 指令成功执行后、才会得到该错误。

                 

                您是否按照我的建议从 C2000ware 运行示例代码? 这一步非常重要。

                 

                当电流处于 uA 范围内时、依靠电源中的显示屏并不是一个好主意。 请使用在 uA 领域具有良好精度的台式计量器。

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

                  您好、Haresh、

                  根据您的建议、我使用了万用表、并在所有三种模式下测量了电流。 这些电流低于。

                  空闲睡眠模式电流40mA

                  待机睡眠模式电流29mA

                  停止睡眠模式电流26mA

                  通过从 RAM 运行 LMP 代码、我能够将器件置于 HALT 模式、但它不会在 CAN 消息上唤醒。 您能否使用上面的代码检查什么会导致问题的发生?

                  我在待机模式下检查了器件是否正确唤醒了 CAN 消息以及用于中止模式唤醒的相同逻辑、但器件未被唤醒。

                  谢谢、

                  Pandurang Khutal

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

                    Pandurang、

                     

                    26mA 的 HALT 模式电流看起来不正确。 器件未处于 HALT 模式或您的仪表读数不正确。 这是 C2000ware 的示例代码吗? 请确认。 如前所述、在 uA 领域测量电流非常棘手。 如果仪表没有足够的分辨率/精度,您可能会得到错误的读数。 请记住、您可以在尽可能低的范围内获得最佳精度。 当您启动代码时、您处于 MCU 的"运行"模式、其中100mA 范围是合适的、但在 HALT 模式中、10mA 范围是合适的。 同样、当您从 HALT 模式中唤醒时、您会回到运行模式。 您使用的仪表应具有出色的自动测距功能、能够无缝切换范围、而不会中断 MCU 的电源(或电流不足)。 我们在实验室中使用6 1/2位万用表。 您使用的万用表的品牌/型号是多少?

                     

                    如何确保仅测量流入 MCU 的电流? 我们讨论的是哪个电源轨(Vdd 或 Vddio)? 您是否使用片上 VREG?

                     

                    在不连接任何万用表的情况下执行"使用 CAN 的 HALT 模式唤醒"测试。 一旦您使该流量正常工作、请将万用表带入实验中。

                     

                    您是否已确保满足 HALT 模式唤醒信号的最小脉宽要求(如数据表中所示)? 您能否提供唤醒信号的示波器捕获?

                     

                    CAN 比特率是多少?

                     

                    您使用的是什么时钟源?

                     

                    您能否与我私下分享您电路板的原理图?

                     

                    总之、这是我希望您遵循的调试顺序:

                    1. 从 C2000ware 运行示例代码、无需使用万用表。 甚至无需唤醒器件。 目的是简单地确定器件是否进入 HALT 模式。 不要禁用 XCLKOUT 输出。 如果器件进入 HALT 模式、XCLKOUT 将自动消失。
                    2. 如果#1成功、请放入万用表、查看您看到的电流值是否与数据表中提到的值一致。
                    3. 如果#2成功、尝试从 CAN 总线唤醒。 请仔细阅读器件 TRM 的第1.4.3节、了解待机模式和停机模式之间的差异。

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

                      您好、Haresh、

                      我已经尝试 使用 C2000ware 的示例代码 、所消耗的电流为@26mA、是相同的。 为了测量电流、我们使用 Tenma 72-7720万用表。

                      我们尚未使用片上 VREG。 我们将测量电路板的总电流 、而不是 Vdd 和 Vddio。

                      为了实现唤醒、我们在没有将万用表与连接到电路板的电源串联的情况下尝试了、但控制器仍然无法唤醒。 CAN 比特率为250kbps。 我们使用外部 OSC 作为时钟源、PLL 使能、内核频率为90MHz。

                      根据数据表、XCLKOUT 输出在 HALT 模式中默认被禁用。 控制器已正确唤醒。

                      一个观察结果是、我们使用来自 TI-CAN1042HVDRQ1的 CAN 收发器、它将 STANDBY 引脚作为控制引脚。 控制器进入 HALT 模式后、引脚的状态是什么。 引脚状态将保持还是将变为三态?

                      我们现在没有用于  直接监控 Vdd 和 Vddio 线的板。 进入电路板的电源为12V、通过使用 LDO、我们生成了进入微控制器的3.3V 电压。 我们通过将万用表与12V 电源串联来测量电流。

                      问题是控制器未通过 CAN 消息在 HALT 模式中唤醒。 但使用相同的逻辑、控制器在待机模式下唤醒。 请建议。

                      谢谢、

                      Pandurang Khutal