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.

[参考译文] TMS320F28375S:从自定义引导加载程序跳转到应用程序后、CAN 数据无法更新

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1468954/tms320f28375s-can-data-not-updating-after-jumping-from-custom-bootloader-to-application

器件型号:TMS320F28375S

工具与软件:

团队成员、您好!  

我在  论坛上发布了一个有关[link]的问题、并收到了回复、但该问题尚未解决。 在我的最后一个问题之后、我尚未收到对我的查询的任何进一步回复或更新。

我还启动了一个与该问题相关的新主题[链接]、但已经5天了、我仍然没有收到该主题的回复。 这只是针对(上述)特定问题、我的所有其他问题都已得到解答。

我不知道是否存在故障或其他情况、但我尚未收到回复、希望询问是否有任何更新、或者我是否需要其他信息来帮助解决此问题。 非常感谢您的帮助、如果您能提供任何指导或反馈、我将不胜感激。

有人可以帮助解决问题、或者就解决问题的后续步骤提供指导吗? 非常感谢您的帮助、因为这会影响我的项目。

感谢您对此事的关注!

此致、

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

    器件型号:TMS320F28375S

    工具与软件:

    团队成员、您好!

    我正在使用 TMS320F28375S 微控制器、并且开发了基于 CAN 的定制引导加载程序。 引导加载程序和应用程序都使用 FreeRTOS、从引导加载程序跳转到应用程序后 CAN 通信会出现问题。

    通过引导加载程序刷写应用程序之后、当我跳转到应用程序时、会在正确的时间收到 CAN 消息、这意味着消息按预期到达。 但是、这些消息中的数据出现卡滞或没有更新。 即使应用正在主动发送新数据、消息中的 CAN 数据也不会改变。 该问题一直存在、直到我对微控制器下电上电为止、之后 CAN 数据开始按预期更新、一切正常。

    我怀疑该问题可能与从引导加载程序转换到应用程序时 CAN 外设重新正确初始化有关。 具体来说、我担心在 CAN 缓冲区中可能会有挂起的旧数据、或者当将控制权交给应用程序时、消息对象或中断配置可能无法正确复位。

    以下是我用于从引导加载程序跳转到应用程序的代码:

    vTaskSuspendAll();
    
    DEVICE_DELAY_US(100);
    
    // 2. Reset timer and peripheral interrupts
    SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_CANA);
    CPUTimer_stopTimer(CPUTIMER2_BASE);
    CPUTimer_reloadTimerCounter(CPUTIMER2_BASE);
    CPUTimer_setEmulationMode(CPUTIMER2_BASE,
                              CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT);
    
    // Disable global interrupts
    DINT;
    IER = 0x0000;
    IFR = 0x0000;
    asm("    NOP"); 
    asm("    NOP");
    asm("    NOP");
    asm("    NOP");
    DEVICE_DELAY_US(5000);
    
    asm (" LB 0x088000");

    此外、由于我在引导加载程序和应用程序中都使用 FreeRTOS、FreeRTOS 任务管理或中断处理方式是否会干扰 CAN 通信设置? 如果能够深入了解 FreeRTOS 可能会对该行为产生的影响、以及是否需要采取其他步骤以确保在跳转后正确初始化 CAN 外设、我将不胜感激。

    您能否确认我正在使用的跳转流程是否正确、或者我是否应该进行任何修改? 非常感谢为解决这一问题提出任何建议或指导。

    谢谢!
    Muzammil Qureshi

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

    尊敬的 Muzammil:

    >即使应用程序正在主动发送新数据、消息中的 CAN 数据也不会改变。

    您是否能够使用 MCAN_ReadMessage 函数或它的一些变体? 此函数 等待从主机接收消息、然后在成功接收后读取该消息。 然后继续清除消息 RAM。  

    此外、当您跳转到该应用后、它是否通过执行任何操作再次打开 CAN 外设?

    谢谢。此致、

    Charles

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

    尊敬的 Charles:

    感谢您的建议。 我将在这里讨论应用程序发送的数据。

    您是否能够使用 MCAN_ReadMessage 函数或它的某种变体? 此函数 等待从主机接收消息、然后在成功接收后读取该消息。 然后继续清除消息 RAM。  [报价]

    我的应用正在使用该CAN_sendMessage函数通过 CAN 发送数据。 当我在 PCAN Explorer 上观察到 CAN 消息时、消息的时序看起来是正确的-消息是在预期时间到达的。 但是、消息的内容不会更新、即使应用程序正在主动发送新数据也是如此。 几乎像是在从引导加载程序跳转到应用程序后 CAN 消息数据"卡住"或没有更新一样。(为了读取数据、我使用 CAN_readMessage 函数。 我使用中断、并且每次我发送或接收消息时、我都清除之后的中断状态)

    一个有趣的现象是、在关闭微控制器电源、然后再次为其加电后、CAN 数据和消息运行良好、而数据内容也按预期更新。

    此外、跳转到应用程序后、该应用程序是否执行了任何操作来再次打开 CAN 外设?

    关于从引导加载程序跳转后 CAN 外设的初始化、我的应用程序有一个board_init函数(在 SYS/CFG 文件中定义)、该函数在每次应用程序启动时都会调用。 此函数初始化所有外设、包括 CAN 模块、因此我认为应该在应用启动期间正确地重新初始化 CAN 外设。 尽管如此、问题仍然存在、这使我认为跳转后可能需要解决其他一些配置或状态。

    再次感谢您的支持。

    此致、
    Muzammil Qureshi

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

    尊敬的 Muzammil:

    我们将 与 CAN 专家讨论此问题、期待 在未来几天给您回复。

    谢谢。此致、

    Charles

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

    尊敬的 Muzammil:

    您是否可以 在引导运行后尝试重新初始化 CAN?

    谢谢。此致、

    Charles

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

    您好、Charles、

    对不起,我不能完全理解你到底在想传达什么。 在我的应用中、有多条 CAN 传输消息、我不确定如果我不重新初始化该 CAN 将如何正确运行。 您能澄清一下您的建议吗?

    在相关的注意事项中、我找到了一个临时解决方案。 由于通过关闭控制器、然后重新打开控制器可以解决我的问题、因此我添加了使用"sysctl_resetDevice ();"指令进行器件复位、然后在固件刷写时跳转到应用。 虽然这种方法行之有效、但我仍然认为它不是一种理想或适当的解决方案。 您认为这种解决方案是可以接受的吗?

    期待您的指导。

    谢谢。此致、
    Muzammil

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

    您好、Charles、

    我不知道是否存在故障或其他情况、但我尚未收到回复、希望询问是否有任何更新、或者我是否需要其他信息来帮助解决此问题。 非常感谢您的帮助、如果您能提供任何指导或反馈、我将不胜感激。

    提前感谢您的时间和支持!

    此致

    Muzammil Qureshi

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

    您好!

    我不知道是否存在故障或其他情况、但我尚未收到回复、希望询问是否有任何更新、或者我是否需要其他信息来帮助解决此问题。 非常感谢您的帮助、如果您能提供任何指导或反馈、我将不胜感激。

    提前感谢您的时间和支持!

    此致

    Muzammil Qureshi

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

    您好!  

    线程自动分配错误、我已将其分配给相应的主题专家。

    对于给您带来的不便和延误、我们深表歉意

    此致、  

    Subham M

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

    您好!

    在相关说明中、我找到了一个临时解决方案。 由于通过关闭控制器、然后重新打开控制器可以解决我的问题、因此我添加了使用"sysctl_resetDevice ();"指令进行器件复位、然后在固件刷写时跳转到应用。 虽然这种方法行之有效、但我仍然认为它不是一种理想或适当的解决方案。 您认为此解决方案是可以接受的吗?

    这可能会暴露潜在问题。 是否要清除从引导加载程序跳转到应用程序之间的 Rx 消息缓冲区?

    此致!

    Matt

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

    Matt、您好!

    感谢您的答复。 我很欣赏这种反应,尽管它花了相当长的时间来回复。

    关于您的建议、我认为问题实际上可能出在从引导加载程序跳转到应用程序时未清除 Rx 消息缓冲区。 您能给我介绍一下清除缓冲区的最佳方法吗? 我是否应该使用特定的 driverlib API 函数或方法来确保在转换之前正确清除 Rx 消息缓冲器?

    我每次接收到消息时清除 CAN 中断和全局中断。

    下面是我如何从引导加载程序跳转到应用程序。

    static void JumpToApplication(void)
    {
        // 1. Stop the RTOS tick timer
        vTaskSuspendAll();
    
        DEVICE_DELAY_US(100);
    
        // 2. Reset timer and peripheral interrupts
        SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_CANA);
        CPUTimer_stopTimer(CPUTIMER2_BASE);
        CPUTimer_reloadTimerCounter(CPUTIMER2_BASE);
        CPUTimer_setEmulationMode(CPUTIMER2_BASE,
                                  CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT);
    
        // 1. Disable global interrupts
        DINT;
        IER = 0x0000;
        IFR = 0x0000;
    
        asm("    NOP");
        asm("    NOP");
        asm("    NOP");
        asm("    NOP");
        DEVICE_DELAY_US(5000);
    
        asm (" LB 0x088000");
    }

    这是正确的吗?我应该对其进行更改吗?

    感谢您的支持

    Muzammil Qureshi

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

    尊敬的 Muzammil:

    鉴于这是一个更特殊的问题、我不得不花时间与多位专家进行讨论:

    初始化 CAN 模块将触发消息 RAM 的初始化、从而有效地清除 CAN 缓冲器。 事实上、在 CAN 初始化例程期间会轮询消息 RAM 初始化位标志、以确保消息 RAM 已完成 CAN 初始化例程内的初始化序列。

    鉴于复位是使器件正常运行的唯一因素、必须在引导加载程序中配置设置、并且在分支后需要进行复位/重新配置。 在不深入研究代码的情况下、我建议您在复位前后比较 CAN 配置寄存器(在 CCS 中的"View">"Registers"中)的内容。 您还可以在器件接收帧时查看 CAN 寄存器、以了解正在发生什么情况。

    此致!

    Matt

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

    您好!

    因为我几周没有回来、所以我会假设此问题已解决、并关闭该主题。

    此致!

    Matt