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.

[参考译文] TMS320F28388D:闪存擦除

Guru**** 2607635 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000481/tms320f28388d-flash-erase

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

您好!  

我使用 F28388D 控制器、我面临一种奇怪的行为。

我正在运行 一个500微秒的单独调度程序,我能够将数据复制到闪存扇区7,8,9。 但是、当我尝试擦除 CPU1的扇区13时、不会发生这种情况、我在10ms 时刷新看门狗、但相同的功能在 CPU2中工作正常、我可以擦除扇区13。 不了解2个不同 CPU 的行为差异

擦除扇区所遵循的步骤:

Flash_claimPumpSemaphore(FLASH_CPU1_WRAPPER);

Fapi_initializeAPI(F021_CPU0_BASE_ADDRESS,CPU_FREQUENCY_MHZ);

Fapi_setActiveFlashBank(Fapi_FlashBank0);

Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,0xBE000);

while (FdFlashOperationStatus() != Fapi_Status_FsmReady){}

FdFlashEraseVerify(0xBE000);

gstrCpu1IpcRegs.PUMPREQUEST.all = FLASH_PUMP_KEY (0x5A5A0000UL)

使用的宏如下所示

typedef 枚举

FLASH_CPU1_W包装 程序= 0x2、//!< CPU1包装程序
FLASH_CPU2_WRAPPER = 0x1 //!< CPU2包装程序
} Flash_pumpOwnership;

//定义映射到 FMC 寄存器的直接访问
#define F021_CPU0_REGISTER_ADDRESS 0x0005F800

//定义映射到 FMC 寄存器的直接访问。
#define F021_CPU0_base_address (((Fapi_FmcRegisterType *) F021_CPU0_register_address)

#define CPU_FREQUENCY MHz 200

每次调用擦除时都遵循相同的操作。 对于任何要检查的指针、问题可能是什么

谢谢、

Nagesh

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

    Nagesh、

    看门狗刷新是什么意思?  这是否意味着每10ms 处理一次看门狗?  只要您没有从正在进行当前擦除操作的闪存组执行看门狗刷新代码、这就不是问题。

    如数据表中所述、一个扇区的擦除时间超过10ms -因此、在擦除操作期间、您不应干扰(不允许访问)该组。  擦除时间可能因扇区而异(或因组而异)、因此这两者之间的区别就在于您所看到的不同。   

    一般性意见:希望您检查闪存 API 函数的返回值。  我在上面复制的快照中看不到这一点。  此外、我看不到您在擦除后检查 fmstat 值-您应该检查它。

    谢谢、此致、
    Vamsi

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

    您好、Vamsi、  

    当我在连接到 CCS 时也禁用10ms 的外部看门狗时、这组相同的代码工作正常。 将在连接模式下检查 FMSTAT 寄存器值、该值可用于文件、但会获得寄存器值。

    被擦除的扇区中没有放置任何代码。

    谢谢、

    Nagesh

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

    您好、Vamsi、  

    我在连接模式下对 FMSTAT 寄存器进行了快速检查、它保持零。

    我能否轮询以擦除闪存扇区13、直到 fmstat 寄存器为零?

    因为在未连接模式下、我将无法检查 FMSTAT 寄存器。

    谢谢、

    Nagesh

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

    Nagesh、

    如闪存 API 指南、闪存 API wiki 中所述、如 C2000Ware 中的闪存 API 使用示例所示:

    1) 1)发出擦除命令后、必须等待命令完成。   请参阅下面突出显示的内容-您可以使用 Fapi_checkFsmForReady()轮询要完成的闪存操作。

    2) 2)另外,在闪存操作结束后,您应该使用 Fapi_getFsmStatus()来检查 fmstat 值。  见上文。  如果不为零、则应将擦除操作视为失败。

    如果您在擦除正在进行时访问闪存组、或者您生成了一个复位(通过外部看门狗)来停止正在进行的擦除、那么擦除操作将失败。  在擦除的扇区中是否有任何代码或数据无关紧要-当擦除或编程正在进行时、不应该对闪存组进行任何访问。  此外、不应出现功率损耗或复位情况。

    谢谢、此致、
    Vamsi

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

    Nagesh、

    您对此有任何更新吗?  我是否可以 将其视为已关闭?

    谢谢、此致、
    Vamsi