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/TMS320F28377D:如何将数据读取并写入 MCU 内部闪存

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/591767/ccs-tms320f28377d-how-to-read-and-write-data-to-the-mcu-internal-flash

器件型号:TMS320F28377D
Thread 中讨论的其他器件: controlSUITE

工具/软件:Code Composer Studio

你(们)好  

我需要处理闪存中的计数器、因此每次断电和通电时、电流值都不会丢失。

闪存中是否存在任何可使用的地址? 如果是、如何访问它们?

谢谢!

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

    Shimon、

    TMS320F28377D 每个 CPU 具有512KB 的闪存。  请查看数据表中的表6.3.2闪存存储器映射,网址  为。

    您可以为数据指定几个闪存扇区、并可使用它们对计数器数据进行编程。  请参阅以下主题、了解如何使用闪存实现此目的:  

    您可以使用 F021_API_F2837xD_FPU32.lib (闪存 API 库)擦除/编程闪存。  此库可从 controlSUITE\device_support\f2837xD\V210\F2837xD_common\lib 中获取。

    闪存 API 使用示例也可从 controlSUITE\device_support\f2837xD\V210\F2837xD_examples_Dual\flash_programming 获取

    闪存 API 文档位于 controlSUITE\device_support\f2837xD\V210\doc\FlashAPI_Doc.

    请注意、在闪存中执行代码时、不能擦除/编程闪存。  因此、您需要具有一个针对闪存 API 函数(以及针对调用闪存 API 函数的函数)的 RAM 运行地址、如上面提到的示例所示。

    希望这对您有所帮助。

    谢谢、此致、

    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的快速响应。 最后一个问题是、如果我想从闪存启动程序、我无法从其他未使用的闪存扇区进行读取/写入?

    如何从 RAM 引导程序? 您指的是内部或外部 RAM??
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Shimon、

    我想您正在询问我关于从 RAM 运行闪存 API 的建议。  当在 F2837xD 上进行闪存擦除/编程操作时、不应访问该闪存组(用于获取/读取)。  因此、您不能从要执行擦除/编程操作的闪存组执行闪存 API。  相反、您可以将闪存 API 库分配给.TI.ramfunc 部分(检查 controlSUITE\device_support\f2837xd\V210\F2837xD_examples_Dual\flash_programming\cpu01中的 flash_programming_cpu1_flash.cmd 文件)、并在运行时使用 memcpy ()函数执行闪存 API 函数之前将闪存 API 函数从闪存复制到内部 RAM。  这样、闪存 API 被加载到闪存中、但是将被复制到 RAM 中以在闪存组上执行擦除/编程操作。

    如果您在 我在上一篇帖子的回复中指向的示例中步入 InitSysCtrl()函数,您将注意到 memcpy()函数的用法。

    如果您有任何疑问、请告诉我。

    谢谢、此致、

    Vamsi

     

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

    但我看到、对于这个问题、在内部闪存中执行时间计数器并不是一个很好的主意、因为每次写入新值都需要擦除整个扇区。

    那么、我的下一个问题是、如果有任何机会、TMS320f28377D 中的片上有某种时间计数器?

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

    复位后、计数器复位或保存存储的最后一个数字?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Shimon、

    您不必在每次要更新该值时擦除该扇区。  您可以在闪存中实现简单的 EEPROM 仿真方法、如 https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/319481中所述 -这样您就不必为每次更新擦除闪存。   

    您可以在 RAM 中实现计时器(或在 TRM 中检查 CPU 计时器、网址 为 http://www.ti.com/lit/ug/spruhm8f/spruhm8f.pdf)、并在断电之前更新闪存中的值。  器件中的 CPU 计时器会被复位以进行下电上电/复位。   

    谢谢、此致、

    Vamsi

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

    你(们)好,Vamsi

    感谢您提供信息。 该线程的链接会链接到其他线程、他们建议在其中使用 EEPROM 仿真器。 我将对此进行检查。  

    谢谢!

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

    我正在处理 Sprab69文档和示例。 我查看了该示例、并注意到该示例与2833系列相关。 我使用的是 F2837xD。 是否相关?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Shimon、

    EEPROM 的概念类似。  但是、您使用的闪存 API 函数在两个器件之间是不同的。

    此外、F2837xD 闪存具有 ECC。  这将要求您一次在 F2837xD 上对至少64位(在64位边界上对齐)进行编程。  因此、即使变量只需要16位或32位、也必须为其分配至少64位的值。  

    谢谢、此致、

    Vamsi

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

    感谢你的帮助

    但我在 EEPROM 仿真器示例中找不到许多函数和变量。 例如 memcopy(..) 功能。 此函数应该位于 string.h 文件中、但我找不到它...

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

    memcpy()现在是 RTS 库的一部分。

    请注意、我们没有用于 F2837xD 器件的 EEPROM 解决方案。 您在该文档中看到的 EEPROM 函数不能直接用于此器件。 我要求您仔细研究、以便您可以根据需要开发解决方案。

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

    我理解、但现在的问题是以下几行:

    Memcopy (&Flash28_API_LoadStart、&Flash28_API_LoadEnd、&Flash28_API_RunStart)

    在 EEPROM 示例中、这些变量位于 Flash2823x_API_Library.h 文件中。 在我的项目中、我能找到可创建的文件吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Shimon、

    在 F2823x 器件链接器 cmd 文件中、我们使用两组符号-一组用于 ramfuncs、另一组用于 Flash28_API、复制自下面相应的链接器命令文件。  

    Flash28_API:
    {
    -lFlash28335_API_V210.lib (.econst)
    -lFlash28335_API_V210.lib (.text)
    } 负载= FLASHD、
    运行= RAML0、
    Load_start (_Flash28_API_LoadStart)、
    Load_End (_Flash28_API_LoadEnd)、
    RUN_START (_Flash28_API_RunStart)、
    PAGE = 0
    
    ramfuncs :LOAD = FLASHD,
    运行= RAML0、
    load_start (_RamfuncsLoadStart)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    PAGE = 0 

    对于 F2837xD 和其他最新器 件、我们仅为".TI.ramfunc"部分和闪存 API 库使用一组符号、如下所示:使用 GROUP 指令(以下摘自 controlSUITE\device_support\f2837xd\vx\F2837xD_examples_Dual\flash_programming\cpu01flash_programming_cpu1.cpu1文件)。  这些符号由链接器在链接步骤中定义。  所有这些符号都在 F2837xD_GlobalPrototypes.h 文件中声明。

    组
    {
    .TI.ramfunc
    {-l F021_API_F2837xD_FPU32.lib}
    
    负载= FLASHD、
    运行= RAMLS03、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0 

    谢谢、此致、

    Vamsi