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.
您好!
我正在尝试使用闪存 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