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.

[参考译文] TMS320F28377D:从 RAM 运行库函数

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/988292/tms320f28377d-running-library-functions-from-ram

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

您好!

我正在尝试使用闪存 API 通过 CAN 对闪存进行编程。 我可以达到它开始擦除闪存、然后擦除它需要的一些代码的程度。 我怀疑这是库中的一些函数调用。 这是一个来自存储器映射的剪辑。

模块总结

      模块                              代码   初始化数据  未初始化数据
      ----                                 ----   --------   ----------

   C:/ti/C2000Ware_3_04_00_00_Software/libraries/flash_api/f2837xd/lib/F021_API_F2837xD_FPU32.lib
      FlashStateMachine.obj           727    0                 0                 
      program.obj                         413    0                 0                 
      utilities.obj                              114    0                 0                 
      init.obj                                52     0                 12.                
      ASYNC.obj                             32     0                 0                 
   +-++---------------- +--- --------------- --------------- +
      总计:                          1338   0                 12   

尽管我似乎无法找到这些函数的名称。 不过、链接器显然认为需要它们。

我已经尝试了几种不同的方法来将这些加载到 RAM 中、但没有成功。 我已经了解过 spra958l、spraau8a 和 spru513v、不确定我是否找到了将这些函数放入 RAM 的方法(我可能缺少一些东西)

那么、我基本上有2个问题。 首先、您认为这些库函数应该位于 RAM 中吗? 第二、如果是、我们如何做到这一点?

           谢谢

                   Dave

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

    Dave、

    在这个器件上、闪存 API 函数应该只从 RAM 中执行。

    如果要在应用中嵌入闪存 API、则需要将其映射到闪存以进行加载、并将其映射到 RAM 以供执行(在链接器 cmd 文件中)。  然后在应用程序中调用 memcpy()以将闪存 API 复制到 RAM -在调用任何闪存 API 函数之前应调用 memcpy()。  

    请注意以下几点:

    1) 1)确保不擦除闪存中的闪存 API。

    2) 2)请搜索"当闪存 API 无法擦除或编程时、我们可以考虑哪些常见调试提示?"  闪存 API 使用 Wiki (https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/951668)中提供。

    3)如闪存 API 指南(https://www.ti.com/lit/ug/spnu629a/spnu629a.pdf)中所述、闪存 API 执行是可中断的;但是、当一个擦除或程序操作正在进行时、不应该有任何来自闪存组/OTP 的读取或提取访问。 因此、闪存 API 函数、调用闪存 API 函数的用户应用程序函数以及任何 ISR (中断服务例程)都必须从 RAM 中执行。 例如、下面显示的整个代码片段应该从 RAM 执行、而不仅仅是闪存 API 函数。 原因是 Fapi_issueODE19 CommandWithAddress()函数向 FSM 发出擦除命令,但不会等到擦除操作结束。 只要 FSM 忙于当前操作、就不应进行闪存访问。

    4) 4)请看 C2000Ware 中的闪存 API 使用示例(C2000Ware_3_04_00_00\device_support\f2837xd\examples\dual\flash_programming)。

    查看 用于此示例的链接器 cmd 文件(C2000Ware_3_04_00_00\device_support\f2837xd\examples\dual\flash_programming\cpu01\flash_programming_cpu1_flash.cmd)。  这显示了闪存 API 到闪存以进行加载和 RAM 以进行执行的映射。

    以下常见问题解答可帮助您:

    1.有关 C2000器件闪存 API 用法的[常见问题解答]常见问题解答:  

         https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/951668 

    2.针对 C2000器件中闪存 ECC 用法的[常见问题解答]常见问题解答-包括 ECC 测试模式、链接器 ECC 选项:  

         https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/951658 

    3. [常见问题解答]闪存-如何将应用程序从 RAM 配置修改为闪存配置?:  

         https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/878674 

    谢谢、此致、
    Vamsi

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

    感谢 Vamsi 的快速回复、我将会查看这一问题、希望解决方案就在这里。

             Dave

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

    David、

    当然、我会将此主题暂停、直到您返回更新。

    谢谢、此致、

    Vamsi

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

    Vamsi、

    这里有很多、这很复杂。 让我们从一个简单的东西开始。

    当我尝试将其中一个闪存 API 函数放入 TI.ramfunc 时、编译器不喜欢它。 我不确定正确的变量是什么。 根据我的理解,将函数放在 TI.ramfunc 中会在引导期间将代码传输到 RAM,然后修改入口代码点,因此主代码中不需要 memcopy()?

    例如

    // 从 RAM 运行
    #pragma SET_CODE_SECTION (".TI.ramfunc")

       uint32 fapi_initializeAPI (uint32、uint32);

    #pragma SET_CODE_SECTION ()

    获取此错误

    "..\PCKA\138_098_DEF-VAR.h"、第93行:错误#148:声明与"Fapi_StatusType Fapi_initiataleAPI (Fapi_FmcRegisterType *、UINT32)"不兼容(声明在"C:\ti\C2000Ware_3_04_00_00_flash_libraries\f28021"的第66行)

    这是正确的方向吗?如果是,我将如何找出如何在 TI.ramfunc 中正确放置函数调用?

           再次感谢您的观看、

                    Dave

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

    Vamsi、

    我不确定另一个问题的答案。 我一直在将 TI.ramfunc 声明放入*。h 文件中。 这似乎可以正常工作、但我看到其他代码将其放入*。c 文件中。 是否存在可能导致某些问题的差异?

              谢谢

                      Dave

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

    Dave、

    关于您提到的错误: 我认为它不抱怨使用.TI.ramfunc。  也就是说,用于  Fapi_initiatizeAPI()的参数的返回类型和变量类型 不正确。  查看用于此函数的变量类型。

    让我们从简单的步骤开始: 您是否能够从 C2000Ware (C2000Ware_3_04_00_00\device_support\f2837xd\examples\dual\flash_programming)成功执行闪存编程示例?  如果是、您是否浏览了整个示例和关联的链接器命令文件?

    谢谢、此致、
    Vamsi

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

    David、

    关于*。h 与*。c 文件: 应该可以。  只要您在必要时定义了 extern、并且没有针对函数获取编译器错误/警告、就可以了。   

    谢谢、此致、
    Vamsi

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

    David、  

    您对此有任何更新吗?  我是否可以将其视为已关闭?

    如果您需要进一步的帮助、请告诉我。

    谢谢、此致、
    Vamsi

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

    谢谢 Vamsi、

    我开始了另一个项目、但你给了我很多好的信息。 我们可以将此视为结束、如果我有进一步的问题、我可以打开另一个。

              此致

                     Dave

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

    Dave、

    感谢您的备注。  我现在将关闭它。

    此致、
    Vamsi