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.

[参考译文] F28M36P63C2:Fapi 不擦除128K 闪存扇区 E 至 J、但擦除32K 扇区正确。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/851322/f28m36p63c2-fapi-does-not-erase-128k-flash-memory-sectors-e-through-j-but-32-k-sectors-erase-correctly

器件型号:F28M36P63C2

尊敬的 Sirs:

我正在使用 F021_API_CortexM3_LE 库对 M3处理器闪存进行编程。 我们有1M 版本。 所有32K 闪存扇区擦除、但128K 扇区擦除不会。

对 Fapi_issueCommandWithAddress 的调用永远不会返回128K 扇区中的任何一个。

请帮助。

谢谢你

Drew Tkac

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

    Drew、

    1.您是从 RAM 还是闪存执行闪存 API?  您应该只从 RAM 执行它。

    2.这些128KB 扇区是否安全?  如果是、您需要从与目标闪存扇区相同的 RAM 解锁或执行闪存 API。

    3.也可查看 SECZONEREQUEST 寄存器的描述。  如您所知、我们为每个闪存组提供了双区域安全性。 为了防止由从一个区域运行的代码破坏从另一个区域启动的闪存操作、有一个使用这个寄存 器执行的信号量机制(SECCZONEREQUEST 寄存器位的定义请参考 TRM)。 这个信号量必须被从各自区域运行的代码所抓取、以便在分配给这些区域的闪存扇区上启用闪存操作。 您能否检查您的应用是否处理获取此信标?

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

    我们从 RAM 运行。 我将使用您的示例 FLASH_programming_m3示例代码。

    我们尚未更改任何安全设置、因此所有设置都应为默认设置。 除非操作系统已更改它们。

    我尝试使用具有所有四个 SEM 位组合的 KEY 值来设置 SECZONEREQUEST 寄存器。 在所有情况下、扇区 J 未擦除。 请注意、我们没有收到错误、该程序根本不会从 Fapi_issuWithCommandeAddress 函数返回。

    所有设置都应该是默认设置、但我不确定如何验证。

    谢谢、

    Drew

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

    Drew、

    明白了。

    1) 1)如果您在调试器中停止内核、会发生什么情况?  停止 PC 时、PC 位于何处?

    2) 2)停止时、请检查 RESC 寄存器-它可能会为我们提供线索。

    3) 3)在链接器 cmd 文件中、您应该在闪存中有一个闪存 API 加载地址、在 RAM 中有一个运行地址。  您使用哪个闪存扇区加载闪存 API?  

    谢谢、此致、

    Vamsi

     

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

    您好、Vamsi、

    当程序挂起时、PC 设置为0xffffffe

    RESC 寄存器设置为8

    我找不到 NMISHDGLF 寄存器、但 NMI_CFG 为1、NMI_WDPRD 为0xFFFF。 所有其它 NMI 寄存器为0。

    我们的链接器命令文件如下所示:

    存储器

       BootROM (RX)   :origin = 0x0,       length = 0x10000
       FLASH_boot (rwx):origin = 0x200030、  length = 0x4
       闪 存(rwx)   :origin = 0x200034,  length = 0xFFF9C
       C03SRAM (rwx)  :origin = 0x20000000,length = 0x8000
       S07SHRAM (rwx) :origin = 0x20008000,length = 0x10000
       SDRAM (rwx)    :origin = 0x60000000,length = 0x1000000
       C415SRAM (rwx) :origin = 0x20018000,length = 0x18000
       CTOMMSGRAM (R) :origin = 0x2007F000,length = 0x800
       MTOCMSGRAM (RW):origin = 0x2007F800,length = 0x800


    部分

       /*分配程序区域:全部闪存*/
       .text      :> FLASH、ALIGN (8)
       .cinit     :> FLASH、align (8)
       .pinit     :> FLASH、align (8)
       binit     :> FLASH、align (8)
       init_array:> FLASH、align (8)

       /*初始化段进入闪存*/
       .const     :> FLASH、align (8)

       /*分配未初始化的数据段:*/
       .data      :> C03SRAM | C415SRAM
    //   .bss       :> C03SRAM | C415SRAM
       .bss       :> SDRAM
       DMA       :> S07SHRAM | C415SRAM
       .sysmem    :> C03SRAM | C415SRAM
       stack     :> C03SRAM | C415SRAM
       .cio       :> C03SRAM | C415SRAM
       .neeardata  :> C03SRAM | C415SRAM
       .rodata    :> C03SRAM | C415SRAM
       args      :> C03SRAM | C415SRAM
    /*   .sdramHeap   :> SDRAM */

        组
        {
    //         .TI.ramfunc
        ramfuncs
        {
           -l F021_API_CortexM3_LE.lib
    //       -l driverlib.lib
        }
        }

        LOAD =闪存、
        RUN = C03SRAM、
        Load_start (RamfuncsLoadStart)、
        load_size (RamfuncsLoadSize)、
        Load_End (RamfuncsLoadEnd)、
        RUN_START (RamfuncsRunStart)、
        run_size (RamfuncsRunSize)、
        RUN_END (RamfuncsRunEnd)、
        PAGE = 0


        .TI.ramfunc:{} load = flash,run = C03SRAM,table (BINIT)
        ramfuncs:{} load = flash,run = C03SRAM,table (BINIT)



    __STACK_TOP =__STACK + 256;

    谢谢、

    Drew

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

    Drew、

    谢谢你。

    您是否在闪存 API 执行期间启用了看门狗?

    如果是、您是否根据需要提供服务?

    我要求您提供链接器详细信息的原因是了解加载闪存 API 的闪存扇区。 但是、仅链接器代码段并不能在您的情况下提供帮助、因为您在 cmd 中将整个闪存定义为一个条目。 请检查您的映射文件以了解加载了闪存 API 的扇区。 我想知道擦除该扇区会导致此问题。

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

    我们不使用看门狗。 启动时禁用了以下功能:

       /*禁用看门狗模块的时钟电源*/
       SysCtlPeripheralDisable (SYSCTL_Periph_WDOG1);
       SysCtlPeripheralDisable (SYSCTL_Periph_WDOG0);

    从地图上可以看到 FAPI 内容被加载到扇区 H 中。下面是地图的一个片段:

    #define Bzero_SectorH_start       0x00260000
    #define Bzero_SectorH_end         0x0027FFFF

    RAMfuncs  0   00267aa4   000015b4    运行 ADDR = 20000258
                     00267aa4   000006c0 F021_API_CortexM3_LE.lib:read.obj (.text)
                     00268164 00000664                             :FlashStateMachine.obj (.text)
                     002687c8 0000033c                             :Program.obj (.text)
                     00268b04 00000184                             :utilities.obj (.text)
                     00268c88 00000120                             :BlankCheck.obj (.text)
                     00268da8 000000a0                             :Init.obj (.text)
                     00268e48 0000009c                             :FlashStateMachine.obj (.text)
                     00268ee4 00000064                             :ASYNC.obj (.text)
                     00268f48 00000044                             :Verify.obj (.text)
                     00268f8c 00000010                             :Init.obj (.bss)[填充= 0]
                     00268f9c   000000bc    driverlib.lib:flash.obj (ramfuncs)

    .TI.ramfunc
    *         0   00269058   00000548    运行 ADDR = 2000180c
                     00269058   000002a8 flash_programming_m3.obj (.TI.ramfunc:Example_CallFlashAPI)
                     00269300   000000c0 Fapi_UserDefinedFuncations.obj (.TI.ramfunc:Fapi_setupEepromSectorEnable)
                     002693c0   00000090 flash_programming_m3.obj (.TI.ramfunc:prsLtoa)
                     00269450   00000064 flash_programming_m3.obj (.TI.ramfunc:prsReverse)
                     002694b4   0000004c Fapi_UserDefinedFuncations.obj (.TI.ramfunc:Fapi_setupBankSectorEnable)
                     00269500   0000003c flash_programming_m3.obj (.TI.ramfunc:RamUart)
                     0026953c   00000020 flash_programming_m3.obj (.TI.ramfunc:example_Error)
                     0026955c   00000017 flash_programming_m3.obj (.TI.ramfunc:example_done)
                     00269573   00000001    --hole --[填充= 0]
                     00269574   00000016 flash_programming_m3.obj (.TI.ramfunc:fmstat_FAIL)
                     0026958a   00000004 Fapi_UserDefinedFunctions.obj (.TI.ramfunc:Fapi_serviceWatchdogTimer)
                     0026958e   00000002    --hole --[填充= 0]
                     00269590   00000008    rtsv7M3_t_le_eabi.lib:strlen.c.obj (.tramp.strlen.1)
                     00269598   00000008    driverlib.lib:flash.obj (.tramp.FlashLeavePump.1)

    ti_catalog_arm_cortexm3_concertoInit_flashfuncs
    *         0   002695a0   00000048    运行 ADDR = 20001d54
                     002695a0   00000048    Boot.aem3:Boot.oem3 (.ti_catalog_arm_cortexm3_convertoInit_flashfuncs:ti_catalog_arm_cortexm3_convertInit_Boot_initFlash)

    我们似乎只有库的目标文件和一些.c and.h 文件。

    我在 TRM 中读出、我们应该只使用库对处理器闪存进行编程、而不是使用处理器的寄存器编写我们自己的闪存。 我都赞成使用库、但没有源代码很难解决问题。

    PC 处于 FFFFFFFE 状态意味着什么? 这听起来像是某种陷阱向量。

    谢谢、

    Drew

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

    Drew、

    在您的应用链接器 cmd 文件中、您将文本 ramfuncs 映射到闪存。 您是否注意不要擦除所需文本和 ramfuncs 段所在的扇区?  我建议您在这个方向上进行调试。 您可能希望进一步对链接器 cmd 中的闪存扇区进行分频、并确保您不会擦除具有关键代码的扇区。  例如、在扇区擦除之后、控制应该在哪里?  是完整还是已擦除?  请检查一下。

    关于源代码:库中不应进行任何调试。 只要按照建议正确使用该库、闪存 API 本身就不应引起任何调试。

    根据 DS、0xFFFFFFFE 处于 Cortex-M3专用总线空间的保留空间。

    谢谢、此致、
    Vamsi

      

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

    您好、Vamsi、

    我在你的方向上取得了一些成功。 谢谢你。 我通过重新排序.cmd 文件将所有函数移出扇区 J。 我在扇区 I 地址240000处启动了该程序。 实际上扇区 J 已擦除。

    我猜这意味着、当我们尝试擦除扇区 J 中有一些代码或文本正在运行。

    我们的目标是允许客户使用单个命令在处理器闪存中现场升级我们的程序。 十六进制文件将已经从我们自己的闪存文件系统读取到 SDRAM 中。 (在另一个闪存上)。

    我真的不想从 RAM 中运行整个程序。

    我愿意接受有关最佳方式的建议!

    再次感谢。

    Drew

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

    Drew、

    由于您听起来需要更新整个闪存组、因此在擦除所有闪存组之前、您需要将整个闪存编程内核复制到 RAM 中。  这样、您的内核就不会返回到闪存、直到它完成了对闪存组的更新。  请注意、当在闪存组/OTP 上进行擦除或编程操作时、不应从闪存组/OTP 进行任何读取或提取访问。 因此、闪存 API 函数、调用闪存 API 函数的用户应用程序函数以及任何 ISR (中断服务例程)都必须从 RAM 中执行。

    例如、下面显示的整个代码片段应该从 RAM 中执行(包括下面突出显示的 FSM 状态轮询)、而不仅仅是闪存 API 函数。 原因是 Fapi_issueODE19 CommandWithAddress()函数向 FSM 发出擦除命令,但不会等到擦除操作结束。 只要 FSM 忙于当前操作、就不应进行闪存访问。

    //

    //擦除扇区

    //

    oReturnCheck = Fapi_issueODE19 CommandWithAddress (Fapi_EraseSector、扇区地址);

    //

    //等待擦除操作结束

    //

    while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、

    我做了一些进一步的测试、我认为在扇区 I (240000)上启动程序时扇区 J 被擦除的原因是它已经从 JTAG 上传中被擦除。 我移动了所有链接器段(.cinit、.const 等)以加载到闪存中并从 RAM 运行。 我无法移动所有.text 段、因为链接器抱怨了一些解压缩例程。 移动所有其他段不允许我删除扇区 J

    因此、使用#pragma、我分配了调用链中的所有函数、以便对闪存进行编程、使其耗尽 RAM。 这也不允许我对 J 区进行编程

    今天早上我又尝试了一件事。 我在23fff0开始了.text。 这只在扇区 J 中放置16个字节。实际上、在擦除扇区 J 时、确保没有从扇区 J 执行任何代码

    该扇区 J 未擦除。

    总之、所有扇区被移动到 RAM、用于闪存编程的调用链中的所有函数被移动到 RAM。 扇区 J 中只保留16字节的.text、无法擦除。

    我不确定如何从这里继续。 很明显、扇区 J 可以通过 JTAG 进行编程、我们也使用串行进行编程。 我们始终执行 JTAG。 也许我们需要直接使用闪存寄存器?

    我们非常感谢您的任何帮助。

    Drew

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

    Drew、

    正如您之前所说的、我假设当您说擦除扇区 J 失败时、擦除调用没有返回。 或者您是否从擦除函数获得了错误返回?  如果存在擦除故障、则 FMSTAT 值是多少?

    关于应用程序映射: 它不仅涉及在闪存擦除/编程操作期间不执行/读取闪存。 它还涉及到您擦除的内容的需求-擦除完成后、您的闪存擦除/编程应用程序是否会尝试访问/执行这些16字节的.text?  如果是、则会失败、因为擦除后它不再存在。

    您可以为不想擦除的所有代码指定几个扇区(可以是它们的自定义引导加载程序、闪存编程内核等)、并在通过从 RAM 执行闪存 API 擦除/编程其他扇区时保持其完好无损。  您可能已经注意到、在闪存 API 使用示例中、我们没有触及示例内容映射的扇区。

    谢谢、此致、

    Vamsi

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

    您好、Vamsi、

    我要感谢你在这个问题上提供的所有帮助和指导。 我们成功地使用我们的应用程序对 M3处理器闪存进行了编程。 总之、我们遇到了一些问题:

    1) 1)我们尝试在 TI-BIOS 运行后从调用中执行闪存编程代码。 尽管闪存位于 RAM 中、但我认为一些 TI-RTOS 中断正在闪存之外运行、并导致闪存锁定。 因此我更改了它、以便在开始 BIOS 调用之前完成对闪存进行编程的调用。 就我们的用户而言、我们可以解决这个问题。

    2) 2)我安装了一些 UART 输出功能、该功能在 RAM 之外运行、但在擦除某些闪存后仍会导致锁定。 我删除了 UART RAM 函数并使用了调试器。 我仍然需要提出某种方式来输出闪存过程的状态。

    3) 3)此时擦除工作正常、但我们编程时遇到了一些问题。 使用每个调用16字节的示例和编程函数、我们需要在 .CMD 文件中使用 align (16)。 align (8)不够好。 否则、我们将从编程函数中得到一个错误。 在.CMD 文件中具有闪存标签的任何段都必须具有 align (16)、否则闪存程序将失败。

    因此、我想我们可以解决这个问题。 再次感谢您的帮助。

    Drew

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

    Drew、

    很高兴我能提供帮助。

    在#3上:是的、当起始地址为128位对齐时、最多可以对16字节进行编程。  因此、最好对齐映射到闪存的所有段、以在128位边界上对齐-在该器件中、M3为对齐(16)。  

    搜索"10. 使用 Fapi_issueProgrammingCommand()一次可以对多少位进行编程?" 链接: http://processors.wiki.ti.com/index.php/C2000_Flash_FAQ

    请注意、上述常见问题解答页面中的答案以 C28x 为例进行编写。 但是、需要注意的是、只有在地址为128位对齐时、才能对最大16字节的数据进行编程。

    我要关闭此帖子。

    谢谢、此致、
    Vamsi