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.

[参考译文] TMS320F28377D:闪存擦除返回成功、空白检查失败

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1009963/tms320f28377d-flash-erase-returns-succeeds-blank-check-fails

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

调用 Fapi_issueAppoanoudCommandWithAddress()返回 Fapi_Status_Success,但运行 Fapi_doBlankCheck()时显示未发生擦除。

在调用擦除后、我确实有一个 while ()循环等待检查就绪。

在闪存 API 手册中、可以看到这一点

请注意、闪存 API 函数不配置任何 DCSM 寄存器。 用户应用程序应确保配置所需的 DCSM 设置。 例如、如果一个区域是受保护的、那么为了能够擦除或者编辑那个区域的闪存扇区、闪存 API 应该从同一个区域执行。 或者区域应被解锁。 否则,闪存 API 对闪存寄存器的写入将不会成功。 闪存 API 不会检查对闪存寄存器的写入是否正在进行。 它按照擦除/编程序列的要求写入它们、并在写入完成后返回。 这将导致闪存 API 返回错误的成功状态。 例如,调用 Fapi_issueCommandWithAddress (Fapi_EraseSector,Address)时,可以返回成功状态,但这并不意味着扇区擦除成功。  

但我没有设置安全、使用 C2Prog 和 Codeskin 引导加载程序、我可以很好地对 CPU1进行编程。

是否有任何其他需要设置的条件来允许擦除?

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

    Tonyo、

    1)

    在调用擦除函数之前、请检查 EALLOW 是否被执行。  它应该被执行。

    在闪存擦除操作之前、请检查闪存泵信号量是否被正确获得。  在对其组执行编程/擦除操作之前、泵信号量应由相应的内核获得。

    2)  

    如果上述内容不能帮助解决问题、请搜索"当闪存 API 无法擦除或编程时、我们可以考虑哪些常见的调试提示?" 在 https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/951668/faq-faq-on-flash-api-usage-for-c2000-devices 上的闪存 API 常见问题解答中 

    3)  

    在上述常见问题解答中、请搜索以下问题并阅读答案。   

    完成扇区擦除操作后、Fapi_issueAppeApphexCommandAddress (Fapi_EraseSector、xx)函数调用是否返回?

    如果 Fapi_issueAppiCommandWithAddress (Fapi_EraseSector、xx)没有等待擦除操作完成、我们如何知道擦除操作是否成功?

    如果上述建议对解决该问题没有帮助、请告诉我。

    谢谢、此致、
    Vamsi

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

    是的、我相信我已经正确设置了一些内容、下面是相关代码、其中显示使用了 EALLOW/EDIS、还有一个 while ()循环用于测试 FsmReady、还有一个循环用于确保闪存泵为自有设备:

    --开始----

      EALLOW;//泵和 API 需要

      //控制闪存泵
      int pump_ID = 0;

    CPU1
      PUMP_ID = 0x2;
    #Elif Defined (CPU2)
      PUMP_ID = 0x1;
    #endif

    while (FlashPumpSemaphoreRegs.PUMPREQUEST.bit.PUMP_RUSE!= PUMP_ID)
      {
        FlashPumpSemaphoreRegs.PUMPREQUEST.ALL = IPC_PUMP_KEY | PUMP_ID;
      }

      //检查

    if (((DcsmCommonRegs.FLSEM.bit.sem!= 0)&(DcsmCommonRegs.FLSEM.bit.sem!= 3))

    //获取闪存包装程序区域信号量
    Debug_printf ("FLASHPROG_eraseSectors:采用的包装器区域、0x%x\n\r"、DcsmCommonRegs.FLSEC.bit.sem);
    返回 FLASHPROG_STATUS_UNLOCK_ERROR;


    if (((DcsmCommonRegs.SECTSTAT.ALL 和0x3FFFFFFF)!= 0x3FFFFFFF)

    //某些闪存扇区被分配给安全区域(不检查 bank1)
    Debug_printf ("FLASHPROG_eraseSecitors:分配给安全区域的闪存扇区、0x%X\n\r\n、(DcsmCommonRegs.SECTSTAT.ALL 和0x3FFFFFFF));
    返回 FLASHPROG_STATUS_UNLOCK_ERROR;


    if (((DcsmCommonRegs.RAMSTAT.ALL 和0x0000FFFF)!= 0x0000FFFF)

    //某些 RAM 扇区被分配给安全区域
    Debug_printf ("FLASHPROG_eraseSecitors:分配给安全区域的 RAM 扇区、0x%X\n\r"、(DcsmCommonRegs.RAMSTAT.ALL 和0x0000FFFF);
    返回 FLASHPROG_STATUS_UNLOCK_ERROR;


      if (FlashPumpSemaphoreRegs.PUMPREQUEST.bit.PUMP_RUSE!= PUMP_ID)
      {
        Debug_printf ("FLASHPROG_eraseSecitors:FLASHPROG_STATUS_PUMP_ERROR、owner=%x\n"、FlashPumpSemaphoreRegs.PUMPREQUEST.bit.PUMP_Ownership);
        返回 FLASHPROG_STATUS_PUMP_ERROR;
      }

      masks = mask;
      I = 0;

      状态= Fapi_Status_Success;

      while ((掩码!= 0)&&(status = Fapi_Status_Success))
      {
        //如果我们到达此处,则仍有要擦除的扇区
        //查找下一个扇区:
        while ((掩码和1)==0)
        {
          掩码=掩码>> 1;
          i++;
        }
        //擦除
    //    uint16_t stat0 = DisableInt();
        uint32_t 扇区= FLASHPROG_FlashSecorStartAddr[i];
        Debug_printf ("FLASHPROG_eraseSectors:擦除扇区0x%X\n"、扇区);

    #if 0 //仅测试,假擦除
        状态= Fapi_Status_Success;
    其他
        状态= Fapi_issueAppiCommandAppiAddress (Fapi_EraseSector、(uint32_t *)扇区);
        fapi_flushPipeline();

        if (status == Fapi_Status_Success)
        {
          while (fapi_checkFsmForReady()!= fapi_Status_FsmReady) asm (" NOP");

          if (fapi_getFsmStatus ()=0)
          {
            //实际上不需要(如果 EALLOW 被正确设置)-无论如何只检查0x2000字...
            Fapi_FlashStatusWordType oFlashStatusWord;
            状态= Fapi_doBlankCheck (((uint32_t *)扇区、0x1000、&oFlashStatusWord);

            if (status!= Fapi_Status_Success)//<<<此处失败
            {
              debug_printf ("FLASHPROG_eraseSectors:扇区0x%X 不为空、status=%i\n"、扇区、状态);
              //status = Fapi_Status_Success;//仅测试、强制成功
            }
          }
        }
    #endif
    //    RestoreInt (stat0);
        //完成此扇区
        掩码=掩码>> 1;
        i++;
      }
      //保留闪存泵的控制
      FlashPumpSemaphoreRegs.PUMPREQUEST.ALL = IPC_PUMP_KEY | 0x0;

      EDIS;

    ----结束----
    在 Fapi_DoBlankCheck()调用之后代码失败-除了为诊断添加的额外代码(debug_printf()是基于 RAM 的 printf()微型版本,它通过邮箱将文本从 CPU1推送到 CPU2, 然后、CPU2将其推出串行端口)、该代码在产品的上一版本中确实可以正常工作、但现在失败了。
    有些东西已经发生了变化、我对这个芯片的了解不够、无法判断是否还有其他位需要翻转才能使擦除发生。 我已经阅读了 CPU 手册和闪存 API 的相关章节、我的想法已经过时、因此提出了这一要求。
    如果我强制此例程返回成功、则代码会尝试在0x86000处对第一个字节块进行编程、并失败、并显示错误9 FLASHPROG_STATUS_WRITE_ERROR。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Tonyo、

    我没有查看代码-但您确认 EALLOW 和 Pump 信标已被处理。  安全性。

    您能否使用 C2000Ware 中的闪存 API 示例检查是否能够成功擦除扇区?

    谢谢、此致。

    Vamsi

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

    是的、闪存 API 示例按预期运行。

    CPU2正在运行 EtherCAT 程序、这是产品接收闪存更新数据的方式。

    CPU1和 CPU2之间是否存在任何可能禁止擦除的交互?

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

    Tonyo、

    感谢您运行该示例。  这表明您的电压线路达到所需的电平。

    您可能希望集中精力处理 CPU1和 CPU2使用的任何共享资源-可能存在一些争用。  

    您已经检查了闪存泵信号量、FLSEM、安全性 和 EALLOW。

    时钟配置和 RAM 使用情况如何?  检查一个 CPU 在另一个 CPU 执行闪存擦除时是否改变了时钟配置。  或者、如果有 RAM 被其他 CPU 覆盖(但是、购买一个 CPU 只能根据所有权写入一个给定的共享 RAM)。

    您说它以前工作过、最近停止工作-也许您可以对这两个版本进行比较。   

    谢谢、此致、
    Vamsi

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

    我从示例复制了代码以初始化闪存、电荷泵等、然后擦除块并将其放入程序-调用 Fapi_setActiveFlashBank()会产生错误504:无效的 Hclk 值、这毫无意义、因为时钟从未改变(始终以200MHz 运行)。

    仍在尝试确定主错误 CPU2可能会造成什么...

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

    Tonyo、

    您传递给 Fapi_initiatizeAPI()的频率是多少?   

    您在初始化闪存例程中使用的等待状态配置是什么?

    CPU2应用是否获取时钟信号量并配置任何内容?   

    谢谢、此致、

    Vamsi

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

    两个 CPU 都以200MHz 的频率运行。

    在初始化闪存例程中、等待状态被设定为3。 将其设置为0xF 的最大值不会改变任何东西。

    仍在处理 CPU2正在执行或正在执行的操作。

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

    Tonyo、

    现在、您可能希望避免 CPU2调试 CPU1上的擦除(因为您不需要 CPU2进行擦除)。

    您是否在   Fapi_UserDefinedFuncations.c 中编辑了任何内容?

    谢谢、此致、

    Vamsi

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

     Fapi_UserDefinedFuncations.c 中没有任何更改

    发出擦除闪存的命令后、在严格循环中运行 CPU2 500ms 不会发生任何变化。

    发出擦除闪存的命令后、使 CPU2怠速运行也不起作用。  

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

    Tonyo、

    您是否可以进行调试调用?  我们总部位于德克萨斯州休斯顿。  请告诉我您方便的日期和时间。

    谢谢、此致、

    Vamsi

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

    我在俄勒冈州、上午10点到中午、M-F 是最好的

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

    太平洋时间上午10点至中午

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

    Tonyo、

    好的。  我们可以在本周五上午11点举行会议。  请给我发送一个朋友请求(在我的姓名上移动、您将看到"请求好友"按钮)。  收到友谊请求后、我将向您发送会议邀请。

    在我们进行调试调用之前、请从您的项目中删除任何专有信息、并保留我们需要调试的闪存编程代码。

    谢谢、此致、

    Vamsi

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

    好的、我发送了请求、谢谢!

    我真正需要知道的是、CPU2正在采取哪些措施来防止 CPU1擦除/编程闪存。 在指令集手册、TRM 或闪存 API TRM 中、我看不到任何相关内容。

    我缺少什么?

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

    Tonyo、

    TRM 和闪存 API 指南以及有关 CPU1和 CPU2之间泵信标共享的示例讨论/演示。  我已经提到了这个以及时钟信号量(连同其他调试提示)。  您确认 已检查所有内容、但未发现任何问题。

    因此、我认为我可以为查看您的代码提供一些帮助、因此询问您是否可以进行调试调用。  您是否要在这篇帖子中讨论此问题而不是呼叫?  因为您再次发布了问题。  请澄清。

    谢谢、此致、

    Vamsi

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

    我认为此勘误建议不适用于您: 低功耗模式:关闭闪存或保持最小器件活动   

    请查看以防万一。   

    在勘误表中搜索上述建议: https://www.ti.com/lit/pdf/sprz412

    谢谢、此致、
    Vamsi

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

    感谢您提供勘误表链接、我同意此通报不适用。

    但是、在 CPU2通知 CPU1开始擦除闪存之前、我确实向 CPU2添加了一些代码以获取、关闭并释放闪存泵。 这没有解决该问题、但它确实告诉我、CPU1尝试擦除闪存时、CPU2不会对闪存泵产生任何影响。

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

    Tonyo、

    是的、一旦泵与 CPU1配合使用、CPU2就无法阻止它擦除它的组。   

    您说您的应用程序在早期就可以正常运行、在进行一些更改后停止工作。  您是否专注于您所做的改变?   

    谢谢、此致、
    Vamsi

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

    我所做的就是将擦除/编程示例复制到当 CPU2通知 CPU1初始化闪存 API 时调用的例程中:

    #if 1 //仅测试、剪切+粘贴擦除 TI 示例中的闪存

    #define Bzero_SectorC_start     0x86000
    #define Bzero_16KSector _u32length 0x1000

    debug_printf ("FLASHPROG_initFlashApi:--begin--测试闪存擦除\n");

    int num_din闪烁= 1;
      InitSysCtrl();
      Dint;
      InitPieCtrl();
      IER = 0x0000;
      IFR = 0x0000;
      InitPieVectTable();

      //
      //调用闪存初始化以设置闪存等待状态
      //此函数必须驻留在 RAM 中
      //
      _asm (" EALLOW");//EALLOW;
        InitFlash();
      //
      //增益泵信标
      //
        SeizeFlashPump();
        //uint32 u32Index = 0;
        //uint16 I = 0;

        Fapi_StatusType oReturnCheck;
        易失性 Fapi_FlashStatusType oFlashStatus;
        Fapi_FlashStatusWordType oFlashStatusWord;

        //
        //需要此函数来根据系统初始化闪存 API
        //频率才能执行任何其他闪存 API 操作
        //
        oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);

        if (oReturnCheck!= Fapi_Status_Success)
        {
          //
          //检查闪存 API 文档以了解可能的错误
          //
        num_d闪烁= 2;
        Debug_printf ("FLASHPROG_initFlashApi:fapi_initiatalizeAPI status=%i\n"、oReturnCheck);
        Debug_printf ("FLASHPROG_initFlashApi:status=%X\n"、Fapi_getFsmStatus());
        }

        //
        // Fapi_setActiveFlashBank 函数进一步设置闪存组和 FMC
        //闪存操作将在组上执行
        //
        oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
        if (oReturnCheck!= Fapi_Status_Success)
        {
          //
          //检查闪存 API 文档以了解可能的错误
          //
        num_d闪烁= 3;
        Debug_printf ("FLASHPROG_initFlashApi:Fapi_setActiveFlashBank status=%i\n"、oReturnCheck);
        Debug_printf ("FLASHPROG_initFlashApi:status=%X\n"、Fapi_getFsmStatus());
        }

        //
        //擦除扇区 C
        //
        oReturnCheck = Fapi_issueODE19 CommandWithAddress (Fapi_EraseSector、
                (uint32 *) Bzero_SectorC_start);

        //
        //等待 FSM 完成擦除扇区操作
        //
        while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}

        //
        //验证 SectorL 是否被擦除。  擦除步骤本身会执行
        //进行验证。  此验证是可以执行的第二次验证。
        //
        oReturnCheck = Fapi_doBlankCheck ((UINT32 *) Bzero_SectorC_start、
                         Bzero_16KSector u32length、
                         oFlashStatusWord (&O);

        if (oReturnCheck!= Fapi_Status_Success)
        {
          //
          //检查闪存 API 文档以了解可能的错误
          //如果 Erase 命令失败,请使用 Fapi_getFsmStatus()函数获取
          // fmstat 寄存器内容,查看是否有 EV 位、ESUSP 位、
          // Cstat 位或 VOLTSTAT 位被置位(请参阅 API 文档
          //更多详细信息)
          //
        num_d闪烁= 4;
          debug_printf ("FLASHPROG_initFlashApi:fapi_doBlankCheck status=%i\n"、oReturnCheck);
        Debug_printf ("FLASHPROG_initFlashApi:status=%X\n"、Fapi_getFsmStatus());
        }

      Debug_printf ("FLASHPROG_initFlashApi:status=%X\n"、Fapi_getFsmStatus());
      Debug_printf ("FLASHPROG_initFlashApi:--end--测试闪存擦除 oReturnCheck=%i\n"、oReturnCheck);
    #if 1.
    静态 USEC_TIMER t_TOGGLE;
    int i;
    void test_pin (int on);
    for (i=0;<num_blinks;)

    if (USEC_TIMER_ENEed (t_TOGGLE)>= 100000)

    test_pin (-1);
    usec_timer_set (t_toggle);
    i++;


    #endif
      _asm (" EDIS");//EDIS;

    #endif
    除了诊断之外、这也是示例中的内容。 使用 TeraTerm、运行代码会产生:
    FLASHPROG_initFlashApi:--begin--测试闪存擦除
    FLASHPROG_initFlashApi:Fapi_setActiveFlashBank status=504
    FLASHPROG_initFlashApi:STATUS=00000000
    FLASHPROG_initFlashApi:Fapi_doBlankCheck status = 500
    FLASHPROG_initFlashApi:STATUS=00000000
    FLASHPROG_initFlashApi:STATUS=00000000
    FLASHPROG_initFlashApi:--end--测试闪存擦除 oReturnCheck=500
    加电大约45秒后、我还尝试运行相同的代码。
    同样的问题、设置闪存组状态会返回504、"无效的 Hclk 值"、之后 doBlankCheck 返回500、"通用错误失败"。
    如果您可以查看上述内容并确认我按正确的顺序执行操作、我怀疑这可以通过电话解决...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    还在寻找。

    我看到链接器.cmd 文件已更改、这会影响闪存的擦除/编程吗?

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

    Tonyo、

    我将能够在明天调试调用之前查看您的上述新消息。   

    是的、您需要确保 API 及其相关函数映射到闪存以进行加载、并映射 RAM 以进行运行。  此外、请确保您不会擦除闪存 API 映射的扇区。

    谢谢、此致、

    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    似乎所有用于闪存和编程的函数都位于名为'ramfuncs'或'.TI.ramfunc'的段中
    所有函数调用都有一个 pragma 指示链接器将代码放置在何处:
    #pragma CODE_SECTION (funcname、"ramfuncs")
    以下是 CPU1的链接器 cmd 文件:
    --
    /*
     *版权所有(c) 2015-2016、德州仪器(TI)公司
     *保留所有权利。
     *
     *以源代码和二进制形式重新分发和使用、有无
     *如果满足以下条件、则允许进行修改
     符合*:
     *
     ** 源代码的重新分发必须保留上述版权
     *  注意、此条件列表和以下免责声明。
     *
     * *二进制形式的再发行必须复制上述版权
     *  请注意、中的此条件列表和以下免责声明
     *  随分发提供的文档和/或其他材料。
     *
     * *德州仪器公司的名称和名称均不相同
     *  其贡献者可用于认可或推广衍生产品
     *  未经特定的事先书面许可。
     *
     *本软件由版权所有者和贡献者"按原样"提供
     *以及任何明示或暗示的保证、包括但不限于:
     *特定适销性和适用性的隐含保证
     *不承认目的。 在任何情况下、版权所有者不得或
     *派遣国应对任何直接、间接、偶然、特殊、
     *典型或必然的损害(包括但不限于
     *采购替代货物或服务;丧失使用、数据或利润;
     *或业务中断)、无论原因是什么以及任何责任理论、
     *无论是合同、严格责任还是侵权行为(包括疏忽或)
     *否则)因使用本软件而以任何方式产生、
     *即使被告知可能会发生此类损坏。
     *
    /*
     * ==== TMS320F28377D.cmd =========
     * 定义 F28377D 的存储器块开始/长度
     *

    /*
    为了使映像"可编程"、有必要在64位数据边界上对齐闪存程序+数据
      有关详细信息、请参阅 processors.wiki.ti.com/.../C2000_Flash_FAQ 页面底部的"Flash Linker cmd file"

      链接器入门:
       https://software-dl.ti.com/ccs/esd/documents/sdto_cgt_Linker-Command-File-Primer.html

      汇编器/链接器工具手册:
       https://www.ti.com/lit/ug/spru513v/spru513v.pdf?ts=1621463210848
    *

    存储器

    第0页:/* 程序内存*/
      D01SARAM :origin = 0x00B000,length = 0x001000
      开始      :origin = 0x086000,length = 0x000006 //06/* bootloader add*/
      APPHDR:origin = 0x086006,length = 0x00000C // bootloader mod
    // LS05SARAM:origin = 0x008000,length = 0x3000// 0x002000 //*片上 RAM */
    // RAMGS0_GS3:origin = 0x00C000,length = 0x4000
      /*闪存扇区 ABC (0x086020-0x085FFF)为 codeskin 引导加载程序保留*/
      FLASH_EFGHIJKLMN:origin = 0x086020、length =(6*0x8000)+(4*0x2000)//合并 F-N

      复位 :origin = 0x3FFFC0,length = 0x000002

    第1页:/*数据存储器*/

      BOOT_RSVD:origin = 0x000002,length = 0x000120 // M0的一部分,引导 ROM
                                将用于
                                堆栈*/
      MOTOR_variables:origin = 0x000400,length = 0x000400
      M01SARAM:origin = 0x000122,length = 0x0002DE //片上 RAM */

    //  LS05SARAM:origin = 0x008000,length = 0x002000 //片上 RAM */

      /*片上全局共享 RAM */
     // RAMGS0_GS3:origin = 0x00C000,length = 0x3FFF
      LS05SARAM:origin = 0x008000、length = 0x3000// 0x002000 //*片上 RAM */
      RAMGS0_GS3:origin = 0x00C000,length = 0x4000
      RAMGS4_GS8:origin = 0x010000,length = 0x4000
      RAMGS9 :origin = 0x015000,length = 0x000800 // CPU1拥有的共享存储器
      RAMGS9a:origin = 0x015800,length = 0x000400

      RAMGS10:origin = 0x016000,length = 0x000800 // CPU2拥有的共享存储器
      RAMGS10a:origin = 0x016800,length = 0x000400

      // CPU2控制11-14
      RAMGS11:origin = 0x017000,length = 0x001000
      RAMGS12:origin = 0x018000,length = 0x001000
      RAMGS13:origin = 0x019000,length = 0x001000
      RAMGS14:origin = 0x01A000,length = 0x001000

      RAMGS15:origin = 0x01B000,length = 0x001000

      /*共享 MessageRam */
      CPU2TOCPU1RAM :origin = 0x03F800,length = 0x000400
      CPU1TOCPU2RAM :origin = 0x03FC00,length = 0x000400

    第4页:
      MOTOR_variables_C:origin = 0x000400,length = 0x000400


    部分



      /*分配计划领域:*/
      .cinit        :> FLASH_EFGHIJKLMN PAGE = 0,ALIGN (4)
      二进制文件        :> FLASH_EFGHIJKLMN PAGE = 0,ALIGN (4)
      .pinit        :> FLASH_EFGHIJKLMN PAGE = 0,ALIGN (4)
      .text        :{*(.text)}> FLASH_EFGHIJKLMN PAGE = 0、ALIGN (4)
      codestart       :>开始   页= 0、align (4)、{__app_entry =.;}// bootloader add*/
      appheader:  > APPHDR, page = 0 // bootloader add
    #if 1.
      ramfuncs       :LOAD = FLASH_EFGHIJKLMN PAGE = 0,
                 运行= LS05SARAM PAGE = 1、
                 load_start (_RamfuncsLoadStart)、
                 load_size (_RamfuncsLoadSize)、
                 load_end (_RamfuncsLoadEnd)、
                 run_start (_RamfuncsRunStart)、
                 run_size (_RamfuncsRunSize)、
                 run_end (_RamfuncsRunEnd)
    #endif

                 表(BINIT)
    #if 0
      组
      {
      ramfuncs{-l ./lib/F021_API_F2837xD_FPU32.lib}
      }
    #endif

      .TI.ramfunc:{} load = flash_EFGHIJKLMN page = 0,align (4)
                 运行= LS05SARAM PAGE = 1


      /*分配未初始化的数据段:*/
      堆栈        :> LS05SARAM | RAMGS0_GS3 PAGE = 1.
      ebss        :> LS05SARAM | RAMGS0_GS3 PAGE = 1.
      等斯梅姆       :> LS05SARAM | RAMGS0_GS3 PAGE = 1.
      .cio         :> LS05SARAM | RAMGS0_GS3 PAGE = 1.
      taskStackSection  :>LS05SARAM | RAMGS0_GS3 page = 1.
      blk1A  :> MOTOR_variables    page = 1.
      blk1C  :> MOTOR_variables_C   page = 4

      /*初始化段进入闪存*/
      .econst       :> FLASH_EFGHIJKLMN PAGE = 0,ALIGN (4)
      切换       :> FLASH_EFGHIJKLMN PAGE = 0,ALIGN (4)
      .args        :> FLASH_EFGHIJKLMN PAGE = 0,ALIGN (4)

       IQMath       :> FLASH_EFGHIJKLMN PAGE = 0,ALIGN (4)/*数学代码*/
     IQmathTables   :> FLASH_EFGHIJKLMN PAGE = 0,ALIG(4)
       csmpasswds  :> RAMGS4_GS8,PAGE = 1,ALIG(4)
       csm_rsvd  :>RAMGS4_GS8,PAGE = 1,ALIG(4)
       sector2   :> RAMGS4_GS8,PAGE = 1,ALIG(4)
       sector1  :> RAMGS4_GS8,PAGE = 1,ALIG(4)
       LOG5    :> RAMGS4_GS8,PAGE = 1,ALIG(4)
       LOG4    :> RAMGS4_GS8,PAGE = 1,ALIG(4)
       LOG6    :>RAMGS4_GS8,PAGE = 1,ALIG(4)
       Log1    :> RAMGS4_GS8,PAGE = 1,ALIG(4)


      暂存区     :>RAMGS4_GS8   PAGE = 1.

    C1_SharedRAMgs9  :> RAMGS9      PAGE = 1 // CPU1拥有的共享存储器
    C1_SharedRAMgs9a  :> RAMGS9a      PAGE = 1.

    C2_SharedRAMgs10  :> RAMGS10      PAGE = 1 // CPU2拥有的共享存储器
    C2_SharedRAMgs10a :> RAMGS10a     PAGE = 1.

      /*使用 IPC API 驱动程序时需要以下部分定义*/
      组:> CPU1TOCPU2RAM,PAGE = 1
      {
        PUTBUFFER
        PUTWRITEIDX
        GETREADIDX
      }

      组:> CPU2TOCPU1RAM,PAGE = 1
      {
        GETBUFFER:  TYPE = DSECT
        GETWRITEIDX: TYPE = DSECT
        PUTREADIDX: TYPE = DSECT
      }
    --
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Tonyo、

    在您的闪存 API 调用之前、我看不到 EALLOW。   

    您有一个函数,但之后,您调用了 其他函数,如 SeizeFlashPump()-这些函数调用 EDIS。  因此、您需要在调用闪存 API 函数之前包含 EALLOW。

    谢谢、此致、
    Vamsi

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

    我直接从 FLASH_programming CPU01示例中复制了它、它工作正常。 此外、在每个 API 调用之前添加 EALLOW 也不起作用。

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

    Tonyo、  

    请参阅下面的 C2000Ware 示例。  在 EALLOW 之后没有任何其他代码。   

    如果您需要我们的帮助来进一步进行调试、请向我们发送一个我们可以在此处显示的独立项目。

    谢谢、此致、
    Vamsi

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

    Tonyo、

    您对此有任何更新吗?  擦除成功吗?

    谢谢、此致、
    Vamsi

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

    否-如果我运行示例、我可以擦除闪存并对其进行编程、但我的应用程序使用运行 ecat 的 CPU2启动代码、该代码确实可以正常工作、但现在无法正常工作。 我无法向您发送一个"独立项目"、将花费不可合理的时间来完成 ecat 堆栈。 我被骗了。

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

    Tonyo、

    不确定我还能提供什么帮助。  我问您是否可以进行调试呼叫、您离线通知我您只喜欢 E2E 通信。   

    您能否在闪存 API 擦除函数执行之前打开寄存器视图并检查 EALLOW 的值?

    谢谢、此致、
    Vamsi

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

    谢谢、我将进行检查。 坦率地说,我没有期望得到太多帮助,因为这是一个非常奇怪的问题。 你已经尽力了。 如果您遇到任何描述禁用擦除的文档、请将其转发给我-我已经展示了该示例的工作原理、但有一些内容禁止擦除、我无法解释它是什么!

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

    在 RAM 地址空间中、您可以放置和执行基于 RAM 的代码的位置是否存在任何限制?  似乎通过链接器脚本移动内容会使情况变得更糟

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

    Tonyo、

    此新问题是否与本帖子中的原始讨论相关?  如果没有、请打开一个新帖子、以便可以指派 RAM 专家来帮助您。

    请注意:堆栈应该被放置在16位 RAM 地址 范围内。   

    谢谢、此致、
    Vamsi

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

    是的、此问题仍在处理中。 似乎有一个.stack 和一个 taskStackSection、这两个是否都限制在前64k 16位地址字?

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

    Tonyo、

    我知道.stack。  在16位范围内尝试这两种方法。   

    对于您的新问题、 最好启动一个新帖子、因为这是一个两个月的旧帖子。   

    谢谢、此致、
    Vamsi