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.

[参考译文] TMS570LC4357:在同一存储体上执行代码和擦除时出现问题

Guru**** 2445440 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1302060/tms570lc4357-problems-with-executing-code-and-erasing-on-the-same-bank

器件型号:TMS570LC4357

大家好、

我要求为我的客户提供一些帮助:

您好、TI 工程师、如果您需要咨询

背景:当前代码在闪存组0上运行、由于我自己的业务需要、我需要擦除闪存组0的扇区

在调用 Fapi_issueAsyncCommandWithAddress 后、擦除了组0的扇区、结果是 calledEraseWait、具体实现非常简单、结果是无限循环。
...
Fapi_issueAsyncCommandWithAddress(CommandWithAddress,2/* Fapi_Erase 扇区的起始地址*/);
RET = EraseWait();
...
bool  IsFsmReady (void)//获取 FMSTAT 的忙位
{
   返回 ((L2FMC->FMSTAT 和 FMSTA_BUSY_MASK)==  0 ?  真 : );
uint32_t EraseWait (void)
{
  while (IsFsmReady()== false){}
  返回0;
1.
一开始、我发现一旦调用 Fapi_issueAsyncCommandWithAddress、电路板就会冻结、红灯也会亮起
定位之后、它是在我添加了中断相关功能

根据 F021闪存 API 参考指南2.01.01版中的提示:

(1) 从当前正在执行擦除命令(扇区或存储体)的存储体中读取闪存位置将暂停 CPU、直到擦除命令完成并且 FMSTAT 寄存器指示 FSM 不忙。

(2) 从当前正在执行编程命令的存储体中读取闪存位置将暂停 CPU、直到编程命令完成并且 FMSTAT 寄存器指示 FSM 不繁忙

我想是我在擦除/写入时因中断而中断读取存储在库0中的代码、从而导致 CPU 停顿
所以我在擦除、读取和写入的过程中都关闭了中断、问题暂时解决了。
2.  
由于我不想成为无限循环、因此我想根据数据表中提供的最大擦除/写入时间、检查当前等待时间是否超过了数据表提供的最大值
因此、在进入 while 循环之前、我会得到一个 StartTime、每次获取 while 中的 currTime 时、我都会进行区分、以确定所用时间是否已超过最大时间、如果超过、则返回异常退出
这样做后、我发现电路板再次卡住、定位后、在  调用 Fapi_issueAsyncCommandWithAddress 后仍然卡住
擦除当前存储体时、读取当前存储体将导致 CPU 停止
3.
可以正常执行该操作的原因是、在擦除等待函数中只有一个死循环、该死循环足够小、可以预先存储到 ICache、因此在执行时不需要访问存储体0
它恰好能够平滑地执行它。
为了验证我的想法、我在启动阶段对缓存启用进行了更改。
如果是启用缓存、我可以顺利完成擦除操作
在禁用高速缓存的情况下、在调用 Fapi_issueAsyncCommandWithAddress 后、电路板将冻结、红灯将亮起
这证明了我的想法。
现在、有疑问的问题是、

(1) 从当前正在执行擦除命令(扇区或存储体)的存储体中读取闪存位置将暂停 CPU、直到擦除命令完成并且 FMSTAT 寄存器指示 FSM 不忙。

(2) 从当前正在执行编程命令的存储体中读取闪存位置将暂停 CPU、直到编程命令完成并且 FMSTAT 寄存器指示 FSM 不繁忙

这两句中提到、如果在读取期间擦除当前存储体、CPU 将暂停、直到擦除完成、且 FMSTAT 的繁忙位为0、并将继续。

这种延续是如何实现的? 当前机制是让 CPU 自行继续读取、还是通过某种方法通知 CPU 继续读取

我需要在同一个存储体上执行和擦除、是否有任何解决方案

此致、

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

    尊敬的 Ben:

    不应在同一个存储体上执行和擦除。

    "F021闪存 API 库无法从与 为 API 命令操作所选择的活动闪存存储体相同的存储体中执行"。

    Unknown 说:
    我需要在同一个银行中执行并擦除、是否有任何解决方案[/报价]

    如果您确实要执行此操作、则应将所有闪存 API 从闪存组0复制到 RAM。 一旦将闪存 API 复制到 RAM、则可以擦除和写入闪存组0中的扇区。

    请参阅以下主题、了解更多详细信息:

    (+) TMS570LS3137:TMS570LS3137:在运行时编写闪存-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    --

    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    请理解、现在我们将调用两个 FAPI Fapi_issueAsyncCommandWithAddress 和 Fapi_issueProgrammingCommand 的代码、以启动 FSM 的过程准备好进入 SRAM 以解决该问题、但前提是关闭中断。

    阅读手册和 TI 论坛上的其他问题后、我使用宏 FAPI_SUSPEND_FSM 进行测试、暂停正在进行的擦除或写入、然后继续执行擦除或写入该闪存的闪存组代码。

    现在我们希望使用这个宏在中断处理开始时暂停闪存的擦除/写入操作、然后在中断完成后回来继续擦除和写入闪存。 但是、当前中断矢量表和其他与中断相关的代码内容都位于0x0。 在起始地址中、在擦除存储体0扇区时、我是否仍然可以正常执行中断或任务调度?

    此致、

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

    尊敬的 Ben:

    在起始地址中,在擦除存储体0扇区时,是否还有办法可以正常执行中断或任务调度?

    如果您正在尝试擦除组0、则同一组0中的代码将不会被执行。  

    --
    谢谢。此致、
    Jagadish。