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.

[参考译文] LAUNCHXL-F28069M:将代码保存到非易失性存储器中

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1307430/launchxl-f28069m-saving-code-to-non-volatile-memory

器件型号:LAUNCHXL-F28069M

大家好、

我使用的是 LAUNCHXL-F28069M。 我开发了一个用于计算编码器参数的代码、如 RPM、使用 ECAP 进行方向计算、并将其显示在 OLED 显示屏(I2C 通信)上、该代码都很好、但我在加载非易失性存储器或闪存中遇到了难题。 我的电路板一旦我重置它或循环通电丢失代码、当然对于我的应用、我将需要它在每次我循环通电时重新启动。 我通过门户阅读并尝试了各种建议和答案、但我无法从闪存中加载或读取。

我尝试了以下答案:

-在 sysctrl 中添加_flash 或添加到预定义符号: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/539257/f28075-programming-and-running-from-flash

-添加非 RAM .cmd 文件,但不包括 RAM_lnk.cmd 文件: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1262270/tms320f28335-flash-run/4779984?tisearch=e2e-sitesearch&keymatch=RAM%20LNK#4779984

-切换 S1引导模式开关(尽管将开关3设置为0会断开我的板,因此我只能切换1和2)

-在调试配置中尝试不同的设置


编辑:   我已经意识到我通过检查闪存存储器成功地将我的程序保存到闪存中。

-已清除存储器                                      -编程存储器

     

(我已经验证 RAM_lnk.cmd 不会改变闪存存储器)

尽管我现在能够将代码保存在闪存中、 它仍然没有被执行 ,我需要对连接或代码进行任何修改吗?

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

    您好、Divyesh、

    您是否验证了链接器命令文件的.text 段中的代码使用的是闪存? 如果您想查看一个正在工作的示例、可以从 C2000Ware 中加载其中一个闪存示例以查看链接器命令文件(这是大部分工作都需要完成的地方)。 将程序加载到闪存并运行后、要在运行时修改闪存、您需要使用 RAM 中的闪存 API。

    有关还包括一些闪存 API 用法的闪存 C2000Ware 示例、请参阅 C2000Ware_5_01_00_00device_support\f2806x\examples\c28\flash_programming。 请注意、如果您计划从 RAM 运行代码但将其存储在闪存中、则只需要执行 memcpy、因此复位不会阻止程序随后运行。

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

    您好、Omer:

    感谢您的回答、我不知道您如何验证.cmd 文件中的.text、我的意思是.text 文件状态要分配第0页的"FlashA_B"中的程序、FLASHA_B 会 将存储器地址从0x3F0000存储到0x3F7F80 、我已验证这些存储器地址正在更新。

      

    我在 C2000Ware_5_01_00_00\device_support\f2806x\common\cmd 中找到了 F28069M.cmd 文件、我可以看到其中的存储器地址正在更新或清除(如之前的图片所示)。 因此、估计我能够更新闪存、我尝试调用 memcpy 函数(如下所述)、但遇到错误、如"链接期间遇到错误"或"未解析的符号仍存在"  

      

    我也尝试了更新闪存示例、但我在 cmd 文件的.ebss 上出现了错误"program won't fit to the memory"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定如何验证.cmd 文件中的.text,我的意思是.text 文件规定要在第0页的"FlashA_B"中分配程序,FLASHA_B 保存的内存地址 为0x3F0000至0x3F7F80, 我已经确认这是在更新的。[/引述]

    根据您的屏幕截图、您的程序应该已正确加载到闪存中。 如果您在启动器件时未在指定地址看到程序、敬请告知。

    为了估计我能够更新闪存,我尝试调用 memcpy 函数(如下所述),但我遇到了一些错误,如"链接过程中遇到的错误"或"未解析的符号仍然存在"

    请查看控制台输出、并确定未正确定义哪些符号。 您需要了解这些定义以及是否包含了正确的头文件、以便编译器可以找到变量/函数。

    我也尝试过更新闪存示例,但我在 cmd 文件的.ebss 上遇到错误"program won't fit into memory (程序无法放入内存)"

    由于您已经确定了哪个存储器段已满、因此可以向该段添加更多存储器单元(首选连续位置)。 为此、您可以将".ebss:> RAML2_3、page=1"替换为 ".ebss:>> RAML2_3 | RAMx、page=1"、其中 RAMx 是 PAGE 1中的另一个 RAM 单元(您需要在相同存储器类型的同一页中选择存储器)。

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

    感谢您的帮助回复、

    根据您的屏幕截图,您的程序应正确加载到 Flash。 如果您在设备启动时未在指定地址看到程序,请告诉我

    我可以在该地址看到代码已成功更新  

    由于您已经确定哪个内存部分已满,因此可以向该部分添加更多内存单元(首选连续位置)。 为此,您可以将".ebss :> RAML2_3, page=1"替换为 ".ebss :>> RAML2_3| RAMx, page=1",其中 RAMx 是第1页中的另一个 RAM 单元(您需要在同一内存类型的同一页中选择存储器)。

    我之前尝试过这么做、但遇到了相同的结果、我尝试添加".ebss:>M0SARAM | M1SARAM, page = 1"或将整个 M0SARAM 分配给.ebss 和 M1SARAM 给其他人。 没有人赞成。

    请查看控制台输出并查找未正确定义的符号。 您需要了解这些变量是什么以及是否包含了正确的头文件、以便编译器可以找到变量/函数。

    我可以找出未解析的符号:
    _RamfuncsLoadSize ./main.obj
    _RamfuncsLoadStart ./main.obj
    _RamfuncsRunStart ./main.obj  

    这些函数没有在代码中声明、因此我 在主代码中使用了 RamfuncsLoadSize、RamfuncsLoadStart 和 RamfuncsRunStart、我在 cmd 文件中也更新了它们、就像我尝试在主程序中同时使用_Ramsfuncs 同时保持 F28069M.cmd 不变"和"在 main 函数中使用 Ramfuncs、然后在.cmd 文件中更新它们"、但我会转到以下错误。

       

    我曾尝试添加:

    extern UINT16 RamfuncsLoadStart;
    extern UINT16 RamfuncsLoadEnd;
    外部 UINT16 RamfuncsRunStart;
    extern UINT16 RamfuncsLoadSize;

    将错误更改为警告"#169-D 类型为"Uint16"的参数与类型为"const void *__restrict__"的参数不兼容

    编辑: 此问题已解决,我添加了 Example_Mem 闪存编程中的"11(UINT16*SourceAddr, UINT16* SourceEndAddr, UINT16* DestAddr)"函数,它已成功,感谢您的帮助。