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:发生闪存写入和读取后复位。 已在 F28377D 上使用 F021闪存 API。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/893883/ccs-tms320f28377d-after-flash-writes-and-read-occurred-reset-used-f021-flash-api-on-f28377d

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

工具/软件:Code Composer Studio

尊敬的 C2K Champs:

我将继续回答最后一个问题。

最后一个问题是以下链接。

https://e2e.ti.com/support/microcontrollers/c2000/f/171/p/891196/3301091#3301091

闪存写入和擦除工作正常、在2~3minite 之后、电路板发生了复位功能。

我不明白为什么它发生了复位功能

禁用看门狗。

我非常乐于助人、感谢您的回答

谢谢、此致、

Edward

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

    爱德华

    闪存擦除/编程/验证序列后、您在应用中执行什么操作?   

    您是否尝试找到导致复位的指令?  请使用断点和步进执行来计算导致它的指令。

    您是否检查了 RESC 寄存器和 NMIFLG 寄存器?  有什么提示吗?  

    希望您在使用任何 ramfunc (.TI.ramfunc)内容之前执行 memcpy()。  memcpy()将在应用程序从 RAM 地址执行之前将代码从闪存复制到 RAM。 否则,应用程序将在 ITRAP 中结束。

    我将根据您的回复将帖子分配给系统专家。

    谢谢、此致、

    Vamsi

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

    尊敬的 Vamsi
    感谢您的回复

    请参阅我的代码(Project_Edward.zip)

    1) 1)闪存擦除/编程/验证序列后、您在应用中执行什么操作?
    ->没有、我只配置了闪存写入和闪存擦除序列。 请参阅以下代码。 请参阅我的代码的 main_cpu1.c。
    总结而言、
    while (1){
    if (SCIARxBuff_CPU1[0]= 0x0061)// a

    Flash_write();//闪存

    否则、如果(SCIARxBuff_CPU1[0]= 0x0062)// b

    FLASH_READ (缓冲器322);//闪存

    否则、如果(SCIARxBuff_CPU1[0]= 0x0063)// c

    FLASH_ERASE ();//闪存

    否则、如果(SCIARxBuff_CPU1[0]= 0x0064)// d

    SCIARxBuff_CPU1[0]= 0x0065;//闪存
    DSP_SCIA_Write (Buffer322、0xFF);//闪存串行写入

    2) 2)您是否尝试找到导致复位的指令? 请使用断点和步进执行来计算导致它的指令。
    ->我找不到。 如何查找? 我将看门狗设置为禁用。

    3) 3)您是否检查了 RESC 寄存器和 NMIFLG 寄存器? 有什么提示吗?
    ->否 我找不到提示。 当程序运行时、程序禁用看门狗。 清除 RESC 和 NMIFLG 寄存器是否有意义?


    4)希望您在使用任何 ramfunc (.TI.ramfunc)内容之前执行 memcpy ()。 memcpy()将在应用程序从 RAM 地址执行之前将代码从闪存复制到 RAM。 否则,应用程序将在 ITRAP 中结束。
    ->如何在使用任何 ramfunc (.TI.ramfunc)内容之前执行 memcpy ()?
    参阅我的代码、我在 flash_programming.c 中使用"#pragma CODE_SECTION (Flash_Programming、ramFuncSection);"
    是这样吗?

    e2e.ti.com/.../Project_5F00_edward.zip

    谢谢、此致、

    Edward

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

    尊敬的 Vamsi

    出现另一个问题。

    如果我将其他函数与 main.c 中的闪存函数一起使用、它将成为 ITRAP。

    while (1){
      DO _UDP_CONFIG (4);//配置套接字4
      if (CONFIG_FLASH_SET_FLAG = 1)// a
      {
         CONFIG_FLASH_SET_FLAG = 0;
         Flash_write();//闪存
      }
      否则、如果(CONFIG_FLASH_SET_FLAG = 2)// c
      {
         CONFIG_FLASH_SET_FLAG = 0;
         FLASH_ERASE ();//闪存
      }

    谢谢、此致、

    Edward

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

    爱德华

    2) 2) 2)不是在 CCS 调试视图中单击"继续"按钮、而是单击"步入"或"步越"按钮。  使用这些按钮、您可以通过指令执行代码指令。  通过这种方法、您可以确定导致复位的指令。  此外、您可以在代码中定期使用断点、然后单击"继续"。 这样、您就可以知道控件是否达到代码中的特定断点。  如果未达到、则您知道该断点之前的代码存在一些需要调试的问题。  您可以右键单击 CCS 中的代码行并启用断点。  

    3) 3)您可以为 NMI 和 ITRAP 启用和定义 ISR、并包括用于调试目的的 Estop。  在 ISR 中、您可以检查这些寄存器的值以了解复位的原因。

    4) 4)映射到 ramfuncs 的任何代码都应在执行该代码之前使用 memcpy()从闪存复制到 RAM。  如果不是、当控制跳转到 RAM 中的相应位置时、由于代码未复制到闪存、将提取 RAM 位置的垃圾、从而导致 ITRAP。  我建议您使用其中一个 C2000Ware 示例、启用闪存构建配置并逐步执行、以了解闪存执行流程。  请参阅此帖子以了解有关此主题的更多详细信息: https://e2e.ti.com/support/microcontrollers/c2000/f/171/p/878674/3250523#3250523

    谢谢、此致、

    Vamsi

     

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

    尊敬的 Vamsi

    感谢您的回复

    如您所知、独立 USB 示例代码运行良好。

    我合并了 USB 示例代码和我的项目代码。 我觉得初始化效果很好。

    正如您所说的,我在代码中从 Device_init()执行 Flash_initModule()之前使用了 memcpy()。(如下代码所示):
    ////代码

    memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);

    //
    //调用闪存初始化以设置闪存等待状态。 此函数必须执行的操作
    //驻留在 RAM 中。
    //
    Flash_initModule (FLASH0CTRL_base、FLASH0ECC_BASE、DEVICE_FLASH_WAITSTATES);

    //////

    我阅读了您的建议 URL 帖子(e2e.ti.com/.../3250523)
    所以我感觉、检查了所有内容。

    但是当我设置闪存写入命令时、它发生了 ITRAP。

    在第二张图片中,Fapi_initiatizeAPI()中出现错误。

    因此、请确认我的源代码。 该代码包含了每个函数。  

    e2e.ti.com/.../0647.Project_5F00_edward.zip

    我指的是"Disassembly"字段。(Excel 文件)
    在提到"Disassembly"字段时、我在错误部分绘制了黄色标记。
    我不理解此装配体部分。

    e2e.ti.com/.../error_5F00_Disaeembly.xlsx

    谢谢、此致、

    Edward

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

    尊敬的 Vamsi

    我解决了。

    问题是 RAM 和闪存堆栈。

    在闪存中存储代码并将其保存在 RAM 中时、RAM 存储器区域崩溃所导致的问题。

    因此、我会缩小存储器区域的大小。

    我真的想知道、如何设置 RAM 和闪存大小、以便 CPU1和 CPU2不会发生碰撞?

    我们仍然存在重置问题...

    我不知道为什么发生复位。

    谢谢、此致、

    Edward

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

    爱德华

    很高兴您能够解决这个问题。

    关于存储器问题、您是否在 CPU1和 CPU2链接器 cmd 文件中使用共享 RAM?   

    能否附加链接器 cmd 文件?   

    谢谢、此致、

    Vamsi

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

    尊敬的 Vamsi

    感谢您的回复

    我在 CPU1和 CPU2链接器 cmd 文件中都使用非共享 RAM。

    我附加了文件。

    请参阅以下内容。

    e2e.ti.com/.../linker_5F00_cmd.zip

    谢谢、此致、

    Edward

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

    爱德华

    为什么在 PAGE 0和 PAGE 1中都定义了 RAMLS2和 RAMLS3?  您只能在一页中定义存储器。   

    谢谢、此致、

    Vamsi

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

    尊敬的 Vamsi

    感谢您的回复

    RAMLS2和 RAMLS3是前几代产品。 (前任曾工作)

    但是、我并不完全了解 RAM。

    我能学到什么吗? 文档或其他内容。

    最后一个问题是由于 RAM 大小不足而发生错误。

    因此、我想增大 CPU1上 RAMGS01的大小。 我该如何工作?

    我对您的评论非常有帮助。

    谢谢、此致、

    Edward

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

    爱德华

    您可以 在 F2837xD 技术讲座中了解链接器命令文件的用法、网址为:

    https://training.ti.com/c2000-f2837xd-microcontroller-workshop?context=1137791-1137781

    如果要增加特定 RAM 块的大小、您始终可以将两个或多个 RAM 块组合在一起。  但是、您需要确保只在一个页面(page0或 page1)中定义任何给定的 RAM 地址。 如果您重复使用(page0和 page1)给定的存储器范围、编译器/链接器不会向您发出错误。  

    关于 GSxRAM: 默认情况下、所有 GSxRAM 块(0至15)都归 CPU1所有。  在链接器 cmd 文件中、您在第1页中定义了许多 GSX RAM。  查看地图文件和应用程序、确定是否确实需要第1页中的许多 GSxRAM 块。  如果您不需要、可以将其中的一些内容移至第0页、并用于代码等

    谢谢、此致、

    Vamsi

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

    尊敬的 Vamsi

    感谢您的回答。

    首先、复位问题似乎已经解决。

    如果我重复测试闪存写入和擦除、它被复位、但是如果它与我的项目代码一同工作、它不能被复位。

    我不知道原因。

    使用此代码进行2天的老化测试表明它未复位且工作正常。

    现在、如果您正确了解内存分配、则可以使用其他应用程序。

    非常感谢您的帮助。

    谢谢、此致、

    Edward

x 出现错误。请重试或与管理员联系。