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.

[参考译文] CCS/TMS320F2.8035万:用于从CAN将应用程序编程到闪存的选项

Guru**** 2578945 points
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/643206/ccs-tms320f28035-options-to-program-application-to-flash-from-can

部件号:TMS320F2.8035万
主题中讨论的其他部件:controlSUITEC2000WARE

工具/软件:Code Composer Studio

我对所有这些都没有什么经验,所以请记住这一点。  我主要是一名应用工程师,我通过F2.8035万的Simulink自动编码完成所有工作。  我通常在较高的级别工作,而不考虑芯片级别。

我有一位客户希望能够通过CAN对其应用程序进行编程。  我设法了解了如何引导到CAN引导加载程序并以这种方式写入内存,但这存在两个问题。

1) CAN引导加载程序仅支持100 kbps。  我们的总线为250 kbps或500 kbps。

2)我需要应用程序默认运行,但仅在请求时输入"程序通过CAN "状态。  我不知道怎么做。

我没有什么特别的问题,除了:什么是最简单的方法来完成我要做的事情?

我在controlSUITE中找到了2803x_boot_rom项目,理想情况下,我只需根据需要对其进行修改,然后写入微控制器上的Boom ROM空间,但我相信该空间是只读的。  我曾考虑修改引导ROM项目并让它与我的应用程序共享闪存空间,但我不知道如何操作,如果可能的话,甚至是建议,我也不相信您可以从运行闪存的应用程序写入闪存。  我还了解了如何使用Flash API,并在controlSUITE中找到了示例代码,但我对它的了解和理解更少。  我还尝试从应用程序跳转到引导加载程序,但似乎无法使其正常工作(如果可能)。  即使我可以使其正常工作,我仍然会遇到100 kbps波特率不适用于应用程序的问题。

总之,我不确定做我需要做的事情的最佳方式是什么。  网上有这么多的示例和建议,但这些示例和建议都很难理解如何实施。

编辑:我找到了此文档,但它已有10年历史,因此我不知道它的准确性或它引用的源代码。  不仅如此,当我尝试构建它引用的项目时,我得到一个错误,它“不能打开源文件“DSP280x_Device.h”,即使它列在我的“包含”搜索路径中。  我真正需要的是最新的F2.8035万 OTP eCAN bootloader示例更新。

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

    最简单的方法是在闪存中设置自定义引导加载程序。 将设备设置为引导至闪存,在闪存中运行您的应用程序。 然后,当它收到命令时,它可以跳转到您的自定义引导加载程序并从那里进行处理。

    查看闪存内核示例。 它使用SCI,但您可以将概念调整为CAN。 您可以从引导ROM项目使用和修改CAN_Boot. c。
    ~\controlSUITE\DEVICE_SUPPORT\F2803x\V130\DSP2803x_Examples_ccsv5\F2803x_flash_kernel</s>2803 2803

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

    因此,应用程序和自定义引导加载程序都将位于闪存空间(而不是OTP)中?  我认为您不能从闪存中运行的应用程序写入闪存,对吗?

    此外,自定义引导加载程序和应用程序是否是不同的项目?  如果是,如何跳转到自定义引导加载程序?  然后,如何跳回应用程序?

    我看一下F2803x_flash_kernel示例,它看起来设置为RAM不足,而不是像您建议的那样闪存。  如何更改项目(.cmd,.asm等)以使其从闪存运行,我是否能够在闪存中加载它和应用程序,并从该闪存中的引导加载程序下载新的应用程序到闪存?

    我知道此应用程序是否在RAM中运行,我可以写入闪存。  但如果它在闪存中运行,我可以将应用程序写入闪存吗?

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

    1)那么应用程序和自定义引导加载程序都将位于闪存空间(而不是OTP)中?

    TRUE,应用程序和自定义引导加载程序代码都可以在闪存中编程。 通常,为自定义bootloader保留1个闪存扇区,为应用程序代码保留其他扇区

    2)我认为您不能从闪存中运行的应用程序写入闪存,对吗?

    是的,您不能从Flash运行Flash API算法。 您必须从RAM (或) BootROM运行这些算法。 请查看以下示例,了解如何执行此操作。

    C2000Ware_1_00_02_00\libraries\flash_API\F2803x</s>2803
    C2000Ware_1_00_02_00\libraries\flash_api\F2803x\docs</s>2803


    3)我看一下F2803x_flash_kernel示例,它看起来设置为RAM不足,而不是像您建议的那样快闪。

    是的,此示例项目的RAM不足,而不是闪存,您必须将此项目转换为从闪存运行。

    4)如何更改项目(.cmd,.asm等)以使其从闪存运行,我是否能够在闪存中加载它和应用程序,并从闪存中的此引导加载程序下载新应用程序到闪存?

    从闪存运行应用程序:-
    processors.wiki.ti.com/.../FAQs

    您应该能够使用自定义引导加载程序(在Flash中可用)来确定是否需要更新应用程序代码(在其他Flash扇区中可用)。

    如果不需要更新-跳转至应用程序代码并开始执行

    如果需要更新-解锁设备,擦除其他闪存扇区中可用的应用程序代码,通过自定义引导加载程序接收新的应用程序代码并对新的应用程序代码进行编程。

    此致,
    Manoj
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此,即使客户引导加载程序位于不同的闪存扇区中,我也无法将应用程序从闪存中的客户引导加载程序写入闪存? 我必须先将自定义引导加载程序传输到RAM?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    亚当

    正确,您必须将代码复制到RAM并从RAM执行。 无法在从闪存运行时对闪存进行编程。
    请参阅C2000Ware中的~\DEVICE_support\F2803x\examples\c28\FLASH_F28035示2.8035万示例。 这将演示如何使用memcpy将代码移动到RAM。

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

    但是如果我从我的闪存应用程序调用闪存API函数,这些函数不是从片上ROM运行吗?  这些功能不能从ROM写入闪存吗?  我很抱歉没有理解所有这些,我仍在学习。

    澄清我的问题。  我已经修改了F2803x_flash_kernel示例,以便通过CAN工作。  它目前设置为RAM不足,但我计划将其更改为从闪存中的扇区A运行。  该示例不使用API库(Flash2803x_API_V100.lib),而是使用闪存1.00 启动ROM符号库(2803x_FlashAPI_BootROMSymbols_v.lib)。  这难道不意味着它只能调用ROM API函数而不能先将它们复制到RAM吗?  使用符号库给他们打电话意味着他们的ROM已不可用。对吗?  我相信,如果我理解正确,Flash2803x_API_Quickstart.pdf文档说,如果我在应用程序中嵌入API代码,我只需要复制到RAM,我认为内核示例没有这样做。

    我正在参考此文档:

    C:\ti\c2000Ware_1_00_02_00\libraries\flash_api\F2803x\docs\Flash2803x_API_Quickstart.pdf</s>2803 2803

    第13页。  我相信,一旦我得到了闪存的flash_kernel示例,我就会使用方法A...我想。  如果闪存内核没有闪存扇区A,我可以这样做。 我只需要使用 2803x_FlashAPI_BootROMSymbols库,从扇区A的内核写入扇区B,C等。

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

    很抱歉,我觉得我不是很清楚。 正确,如果在ROM中使用闪存API,则不必复制它。 执行使用闪存API的应用程序的应用程序代码应复制到RAM。 您不能对任何应用程序闪存扇区(A-H)进行编程,也不能从应用程序闪存运行代码。 因此,您将应用程序代码从应用程序闪存复制到RAM,然后使用ROM API对应用程序闪存扇区进行编程。 编程后,您可以返回应用程序闪存并开始执行新编程的代码。

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

    好的,我计划让我的客户应用程序通过A在G区运行,我的自定义闪存内核位于H区。这些扇区从H (最低地址)开始,向上到A (最高地址),正确吗?

    因此,正确的步骤是当客户应用程序正在运行并且我想刷新一个新的客户应用程序时,我必须首先将整个闪存内核从扇区A复制到RAM,然后跳到RAM中的闪存内核入口点。 这些都是对的吗?

    1)如何将整个应用程序(我的闪存内核)复制到RAM?

    2)我认为我的客户应用程序必须复制,对吗?

    3)如何退出客户应用程序并开始在RAM中运行闪存内核?

    4)如果我要通过客户应用程序中的函数指针或类似的操作从闪存中的客户应用程序跳到RAM中的内核,我的客户应用程序在技术上是否仍在运行?  我是否需要以某种方式终止我的客户应用程序,以便将其闪存空间写入其中?

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

    [报价用户="Adam Truelove"]

    好的,我计划让我的客户应用程序通过A在G区运行,我的自定义闪存内核位于H区。这些扇区从H (最低地址)开始,向上到A (最高地址),正确吗?

    [/引述]

    是的。 您可以在数据表中查看详细信息。

    www.ti.com/.../tms320f2.8035万

    [报价用户="Adam Truelove"]

    因此,正确的步骤是当客户应用程序正在运行并且我想刷新一个新的客户应用程序时,我必须首先将整个闪存内核从扇区A复制到RAM,然后跳到RAM中的闪存内核入口点。 这些都是对的吗?

    [/引述]

    正确。 编程过程中涉及的任何代码。

    [报价用户="Adam Truelove"]

    1)如何将整个应用程序(我的闪存内核)复制到RAM?

    [/引述]

    请参见此示例

    ~\DEVICE_support\F2803x\examples\c28\flash_programming

    [报价用户="Adam Truelove"]

    2)我认为我的客户应用程序必须复制,对吗?

    [/引述]

    是的,他们将输入代码进行复制。

    [报价用户="Adam Truelove"]

    3)如何退出客户应用程序并开始在RAM中运行闪存内核?

    [/引述]

    请参阅我引用的示例。  

    [报价用户="Adam Truelove"]

    4)如果我要通过客户应用程序中的函数指针或类似的操作从闪存中的客户应用程序跳到RAM中的内核,我的客户应用程序在技术上是否仍在运行?  我是否需要以某种方式终止我的客户应用程序,以便将其闪存空间写入其中?

    [/引述]

    否,您唯一关心的是它在哪里执行指令。 在RAM中分支到代码并开始执行指令后,您将不再使用闪存空间。 只需确保闪存中没有任何功能或正在使用的任何内容。  

    此致

    Chris

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

    好的,我现在在失落。

    我的应用程序在闪存扇区B到H中运行,我的自定义CAN闪存内核在闪存扇区A中运行。 我可以跳到闪存内核中,没有任何问题。  闪存内核运行正常,直到它尝试擦除闪存(Shared_Boot.c中的135行)。   调用Flash_Erase功能时,设备重置并在看门狗控制寄存器设置为0x00C0时恢复联机,这表示重置是由看门狗引起的,考虑到内核禁用看门狗,这毫无意义。  我很确定我正在将内核和Copy_Data函数正确地复制到RAM中,但我不确定。  我以C2000Ware中的FLASH_PROGRAMMING项目为例。

    我不知道为什么调用Flash_Erase函数会导致重置。  我有一个示例,RAM不足,这是正常的,它可以正常工作。  可能是链接程序命令文件不正确。

    我根本不知道从哪里开始,因为我的项目没有任何问题。

    我已附加我的项目。  请您仔细查看一下,看看我做了什么错。  谢谢!

    e2e.ti.com/.../0333.f2803x_5F00_flash_5F00_kernel.zip</s>2803

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

    亚当

    是否正在擦除扇区A (自定义引导加载程序代码)? 如果是这样,它很可能会采用非法指令陷阱,从而重新启用WD。

    此外,不能从闪存执行Flash_Erase功能。 此函数需要从RAM调用。

    此致,
    Manoj

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

    我不是在擦除扇区A

    但是,我不确定我是否正在执行RAM,我认为我是。

    您或TI的其他人能否查看我的代码,看看它是否正确,以及我是否在执行前正确地将函数移至RAM。

    我不是从我的应用程序中将内核移动到RAM中。  我有一个memcpy函数在内核中运行来进行复制。  我认为我做的一切都是正确的,因为我正在使用闪存编程器示例作为参考。

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

    我简要地浏览了您的代码。 您似乎正在尝试运行BootROM提供的Flash API函数。 如果您解锁设备,则完全可以。 但是,调用Flash API函数的函数调用需要从RAM完成。 到目前为止,您正在从Flash调用此函数。 这是不允许的。 因此,创建一个新函数并将该函数分配给ramfuncs。 此新功能应包括第130行至245行的代码段。

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

    但我确信我正在RAM中运行CopyData函数。

    请参阅 第85行中main.c中的Memcopy函数和第83行中Shared_Boot.c中的code_section指令。

    Example_Memcopy (&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);

    #pragma code_section (CopyData,"ramfuncs");

    这是否不便于从RAM中复制和运行CopyData功能?  如果我在CopyData中设置了断点,它将在RAM内存空间中停止,因此我认为我做得不错。

    此外,我很确定我正在共享引导c.的第123行解锁设备

    如果这不是复制该函数并将其从RAM中运行的正确方法,正确的方法是什么?  我已经超过了我的代码一整天,找不到任何问题,但Erase_Flash正在导致重置。  我是否错过了一个步骤?  我做的完全错了吗?  如何"创建新函数并将该函数分配给ramfuncs"?

    编辑:另一个线索。  如果我除了构建闪存内核以使设备直接引导到它(而不是从我的应用程序分支)之外没有做任何其他事情,一切都正常。  我怀疑应用程序正在配置某种东西,导致擦除闪存API功能无法正常工作。

    EDIT2:我现在可以从应用程序跳到我的闪存内核。  闪存擦除工作正常,但无法对闪存进行编程。  我不知道为什么。

    EDIT3:没关系,我认为它现在可以工作了!

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

    亚当

    您是否知道Flash_Erase操作不起作用的原因?

    Manoj

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不完全确定。 我的应用程序正在使用一些中断,所以我在跳到我的闪存内核之前禁用了这些中断? 这是否是导致问题的原因?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    代码中的某种内容是使C28x接收非法指令,从而在启用WD的情况下触发非法ISR。 这是WD重置的原因。

    禁用所有中断源并检查Flash_Erase操作是否成功。 如果它工作正常,则说明您的中断源之一明显导致了此问题,而不是Flash_Erase操作。


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

    我不知道您是否看到过我之前的帖子,但现在一切都正常。 我可以从我的应用程序跳到基于CAN的内核,将新的应用程序写入闪存,然后跳回我的应用程序。

    现在它可以正常工作了,我有一个问题要问您。  如果这样做更有意义,我可以发布新的帖子。

    现在我通过以下代码行跳转到我的内核:

    void (* foo)(void)= 0x003f6365;
    foo();

    其中 0x003f6365是 闪存内核的.map文件中的入口点符号。

    但是,如果我修改闪存内核,此位置会发生变化,这意味着我必须更新我的应用程序以指向另一个位置,我不想这样做。  有什么方法可以将该入口点存储在一个固定位置吗?

    我想我只能使用 BEGINFLAASH内存范围名称,所以我把它分配给我的闪存空间的最后2个字节,我把它放在了内核的位置。  但是,这些位置的值是0x007F和0x61E8,这绝对不是我的入口点地址。

    所以我不知道如何跳到内核入口点而不将它硬编码到我的应用程序中,我不想这样做。

    编辑:没关系,如果我跳到BEGINFLASH位置,它运行内核。  我本可以宣誓,但以前不起作用。  它似乎现在已经开始工作了。

    EDIT2:嗯,我现在有一个不同的问题。  如果我跳到闪存内核入口点,它会在将应用程序写入闪存后立即返回到应用程序。  但是,如果我跳到BEGINFLAASH位置,它不会在写入后跳到应用程序。

    EDIT3:没关系,我明白了。  我跳到了错误的位置。