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.

[参考译文] TMS320F28379D:在调试器暂停时启用 CAN 外设?

Guru**** 2540720 points
Other Parts Discussed in Thread: CODECOMPOSER

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1367482/tms320f28379d-enable-can-peripherals-while-debugger-is-paused

器件型号:TMS320F28379D
Thread 中讨论的其他器件:CODECOMPOSER

工具与软件:

是否有办法在调试会话暂停时启用 CAN 外设?

我将 通过 DSS 编写单元测试、我想让测试脚本暂停应用、写入 CAN msg、然后手动调用应用的 CAN RX 中断:

        # get the current location where DSSUtils paused (at end of initialization() called from stdby_Init())
        curLocation = self.__class__.dss_utils.debug_session.memory.readRegister("PC")
        
        # send a valid NOP cmd
        msgt = ntcanfd.CanMsgT()
        msgt.id11 = 0x018
        msgt.set_data8_len(8)
        msgt.set_data8_byte(0x11, 0x0, 0x0, 0x13, 0x88, 0xFF, 0xFF, 0x0)
                            
        # send CAN message in background
        result = self.can_net1.can_send(msgt)
        
        # invoke the CAN RX interrupt to make the application receive the CAN msg
        self.__class__.dss_utils.debug_session.memory.writeRegister("PC", CAN_rx_isr_start_address)
        bp = self.__class__.dss_utils.debug_session.breakpoint.add(CAN_rx_isr_end_address)
        self.__class__.dss_utils.debug_session.target.run()
        self.__class__.dss_utils.debug_session.breakpoint.remove(bp)
        
        # go back to the previous location (end of initialization())
        self.__class__.dss_utils.debug_session.memory.writeRegister("PC", curLocation)
        
        # continue to the end of stdby_Init
        bp = self.__class__.dss_utils.debug_session.breakpoint.add(stdby_Init_end_address)
        self.__class__.dss_utils.debug_session.target.run()
        self.__class__.dss_utils.debug_session.breakpoint.remove(bp)

然而、只要调试会话暂停、就不会传输 CAN 消息(我将使用外部工具 ESD 的 CANReal 监控所有 CAN 流量)。

如果不暂停应用程序、而是让它在后台运行(通过 debug_session.target.runAsynch ())、则 CAN 消息将成功传输。

谢谢你

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

    Diane、您好!

    我已经联系了这一领域的一位专家、进一步调查此问题。

    目前的想法是、我们怀疑问题是当目标停止时、外设不会进行时钟输入、因此传输将无法工作。 但我 希望在这方面获得更多的见解、以确认这一点。

    谢谢!

    Ricky

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

    Diane、您好!

    请尝试启用 此处所述的实时模式(AllowInterruptsWhenHalted): https://software-dl.ti.com/ccs/esd/documents/users_guide/sdto_dss_handbook.html?highlight=scripting#debugger-properties

    Oliver

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

    Oliver、

    这对我来说是无效的。

    启用实时模式后:

    self.debug_session.options.setBoolean("AllowInterruptsWhenHalted", True)

    如果我查看实际值、仍然为 False:

    我还尝试按照这里的说明操作: https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/663179/ccs-ccstudio-keystone-setting-allowinterruptswhenhalted-doesn-t-work-anymore-in-ccs-scripting-console?tisearch=e2e-sitesearch&keymatch=AllowInterruptsWhenHalted# 编辑 PropertiesDB.xml 文件、但这也不起作用。

    我在 DSS 跟踪中看到这一点:

    您还有其他建议吗?

    谢谢!

    Diane

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

    我引用了这篇文章: https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/691571/ccs-tms320f2812-debug-scripting-server-dss-interferes-with-program/2550200?tisearch=e2e-sitesearch&keymatch=AllowInterruptsWhenHalted#2550200 、该文章指示我在设置"AllowInterruptsWhenHalted"之前清除 ST1 DBGM 位。  这将正确设置 AllowInterruptsWhenHalted、但仍不发送 CAN 消息:

            self.debug_session.memory.loadProgram(self.get_out_filename())
            
            cur_ST1_value = self.debug_session.memory.readRegister("ST1")
            cur_ST1_value &= ~0b0000000000000010  # clear the DBGM bit
            self.debug_session.memory.writeRegister("ST1", cur_ST1_value)
    
            # Enable real-time mode
            self.debug_session.options.setBoolean("AllowInterruptsWhenHalted", True)

    当我选中"AllowInterruptsWhenHalted"(通过 debug_session.options.getBoolean ("AllowInterruptsWhenHalted")时、我在 DSS 跟踪中看到该消息:

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

    Diane、

    您是否有更多有关如何 实现 self.can_net1.can_send(msgt 的信息? 由于它不是 DSS 的一部分、因此我们了解它实际上所做的工作可能会很有用。

    谢谢!

    Ricky

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

    Ricky、

    can_send () msg 是由第三方库实现的( ESD 的 python/swig 实现的 CAN )。  我已经附加了此 python 实现、但我不确定它会有多少帮助、因为这是一个 swig 实现、所以您无法看到底层 C 类。  (我必须将文件重命名为以".txt"结束才能使上传生效):

    e2e.ti.com/.../ntcanfd.py.txt

    请注意、如果我尝试使用不同的机制(例如:ESD 的 CANReal 应用)生成 CAN 流量、则在调试会话暂停时不会发送 CAN 消息。

    我还尝试了将以下内容添加到我的 C 应用程序的初始化代码中、但它没有帮助:

        // Configure the CAN interrupts as real-time so that they'll continue to fire when the debugger is paused
        SetDBGIER(0x0100);

    为了通过删除 DSS 尝试简化方案、我尝试了在"实时模式"下运行 CodeComposer 调试器:

    我收到此错误:

    当我选择"rude Retry"时、调试会话开始。  我可以在调试器运行时发送 CAN 流量、但当我暂停调试器时、无法显示任何 CAN 消息。

    谢谢!

    Diane

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

    Diana

    感谢您提供更多信息。 我们将进行审查、如果我们发现其他问题和其他建议供您尝试、我们会告知您。

    此致、

    Ricky

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

    Ricky、

    只是检查、还有其他建议吗?

    谢谢!

    Diane

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

    Diane、您好!

    很抱歉耽误你的时间。 我们仍在调查。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    注意、如果我尝试使用不同机制(例如:ESD 的 CANreal 应用程序)生成 CAN 流量、则在调试会话暂停时不会传输 CAN 消息。

    请注意、要在 CPU 暂停时为中断提供服务、需要做的工作更多、而不仅仅是启用实时模式。  

    请访问: https://software-dl.ti.com/ccs/esd/training/modules/realtime_debug/sdoapps_mod_f28x_ccsv6_real-time-debug.pptx

    另请观看此视频: https://www.ti.com/video/3869986306001

    谢谢

    Ki

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

    Ki:

    我提到了 PowerPoint 和视频、但我仍在 努力工作。

    暂时不想使用 DSS、我可以在 CCS 调试器暂停时让 CPU timer0中断触发。  但是、我仍然无法触发 CAN 中断。

    我在初始化代码中添加了:

        // Configure the CAN and CPUtimer0 interrupts as real-time so that they'll continue to fire when the debugger is paused
        SetDBGIER(INTERRUPT_CPU_INT9 | INTERRUPT_CPU_INT1);

    对于 CPU timer0、我添加了以下内容、但无法找到 CAN 仿真模式的类似设置:

        // set CPU timer 0 so that it continues to run when the debugger is paused
        CPUTimer_setEmulationMode(CPUTIMER0_BASE, CPUTIMER_EMULATIONMODE_RUNFREE);

    然后、我启动正常的调试会话、并在结束初始化代码后暂停。  然后、我选择"Enable Silicon Real-time mode"按钮。

    然后、在我的观察列表/表达式中、我启用了"Continuous Refresh"、我可以看到一个 CPU timer0正在更新的计数器:

    但是、当我生成 CAN 流量(通过第三方 ESD Canreal 工具)时、该消息不会消失。

    如果我继续调试器、那么我可以发送 CAN 流量并触发 CAN ISR:

    是否可以有仿真模式设置?  我看到 EPWM、DMA、CMPSS、uPP 的设置是类似的。

    谢谢!

    Diane

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

    这看起来是针对中断的基本实时支持有效、但是我不能解释为什么 CAN 专用中断不起作用。

    我会提请器件专家注意该主题、以便进一步调查。

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

     Diane、您好!

    DCAN 模块不支持仿真模式。