F28004x
问:您能否用几个简单的步骤说明将应用程序从基于 RAM 的配置修改为基于闪存的配置所涉及的过程?
以下内容适用于 TMS320F2838x、TMS320F2837x、TMS320F2807x、TMS320F28004x。
所有 C2000Ware 示例项目都提供了 RAM 和闪存构建配置。要将构建配置从 RAM 更改为闪存,用户可以将项目导入 CCS,然后右键点击该项目并依次选择“Build Configurations”->“Set Active”->“Flash”。
通过选择此闪存配置,用户可以注意到:
1._FLASH 符号在“Project Build”设置下的“Predefined symbols”部分中定义。这用于定义和执行任何闪存构建特定代码。
2.为应用程序选择基于闪存的链接器命令文件,而不是基于 RAM 的链接器命令文件。C2000Ware 中提供了基于闪存的链接器命令文件供参考(例如:XXX_FLASH_lnk_cpu1.cmd at C2000Ware_x_xx_xx_xx\device_support\XXX\common\cmd)。基于闪存的链接器命令文件将具有映射到闪存入口点地址的 codestart。
3.所有初始化的段都映射到基于闪存的连接器命令文件中的闪存存储器。
4.需要从 RAM 执行的所有函数(用于初始化或 0 等待性能)都被分配到代码中的 .TI.ramfunc 部分。
例如:Flash_initModule() 被分配给 .TI.ramfunc 部分。此闪存初始化例程(配置闪存等待状态、预取/缓存模式、电源等)必须从 RAM 执行。
5.在基于闪存的连接器命令文件中,.TI.ramfunc 部分映射到用于“Load”的闪存地址和用于“RUN”的 RAM 地址。
6.映射到闪存的所有部分都在 128 位边界上使用基于闪存的连接器命令文件中的 ALIGN() 指令对齐。
7. 在应用程序中调用 memcpy() 函数,将 .TI.ramfunc 内容从闪存复制到 RAM。在执行分配给 .TI.ramfunc 部分的任何代码之前调用 memcpy()。
8.对于 EABI 类型可执行文件:所有映射到RAM的未初始化段都被定义为NOINIT段(使用“type=NOINIT”指令)。
其他相关调试提示:
1.此外,当在独立模式下不带调试器运行应用程序时,请确保为闪存引导配置引导模式引脚(有关详细信息,请参阅“TRM 的 BootROM”一章)。
2.请确保在应用程序中根据需要初始化所有变量。 使用未初始化的变量有时会导致使用垃圾值,从而导致应用程序的行为差异(以及基于 RAM 和闪存的项目之间的差异,具体取决于插入的垃圾值)。
3.如果您在独立模式下从闪存运行时仍遇到问题(如果在连接了调试器时运行正常):
(a) 请确保为闪存映像正确编程 ECC(确保 CCS 闪存插件 GUI 或 UniFlashGUI 中的 AutoEccGeneration 保持启用状态 - 这是默认选项)。
(b) 禁用 f28x_codestartbranch.asm 中的看门狗(WD_DISABLE .set 0;在此 asm 文件中应该替换为 WD_DISABLE .set 1)。 这有助于避免在到达 main() 之前进行看门狗复位。 如果应用程序中有很多全局变量,在到达 main 之前,cinit 例程可能需要更多时间来初始化所有全局变量。 在此期间,看门狗可能会过期,因此建议将其禁用。 您可以根据应用程序需要在 main() 中再次启用它。
(c) 请确保 f28x_codestartbranch.asm 文件包含在您的应用程序中,并且 codestart 被映射到链接器 cmd 文件中的闪存入口点位置(通常在 TI 提供的链接器 CMD 文件中定义为 BEGIN)。
(d) 请确保在项目的链接器选项中添加了 code_start (--entry_point=code_start) 作为入口点。
“Project Build”设置 -> Build -> C2000 Linker -> Advanced options -> Symbol Management -> --entry_point: code_start