TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS570LC4357: 在同一个Bank上执行代码及擦写的问题

Part Number:TMS570LC4357

TI工程师,你好,我有问题需要咨询

背景:当前代码运行在Bank 0上,同时因为自身业务需要,我需要对Bank 0的Sector进行擦写

在调用Fapi_issueAsyncCommandWithAddress对Bank 0的一个Sector进行擦除之后会调用一个EraseWait,具体实现很简单,就是一个死循环
Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, /*Sector的起始地址*/);
ret = EraseWait();
bool IsFsmReady(void) // 获取FMSTAT的busy位
{
    return ((L2FMC->fMStat & FMSTA_BUSY_MASK) == 0 ? true : false);
}
uint32_t EraseWait(void)
{
    while (IsFsmReady() == false) { }
    return 0;
}
1.
在最开始的情况下,我发现只要到调用了Fapi_issueAsyncCommandWithAddress,板子就会卡死,并且红灯亮起
经过定位是我加入了中断的相关功能后出现的

根据F021 Flash API Reference Guide Version 2.01.01里的提示:

(1) Reading a Flash memory location from the bank that an erase command (sector or bank) is currently being performed will stall the CPU until the erase command finishes and the FMSTAT register indicates the FSM is not busy.

(2) Reading a Flash memory location from the bank that an program command is currently being performed will stall the CPU until the program command finishes and the FMSTAT register indicates the FSM is not busy

我认为是我在擦/写时被中断打断后,中断读取存放在Bank 0中的代码,导致了CPU Stall而卡死
于是我在擦除和读写的过程中都关闭了中断,问题暂时得到了解决。
2. 
因为不希望是一个死循环,根据数据手册里提供的最大擦除/写入时间,我希望检测当前等待的时间是否已经超过数据手册提供的最大值
于是在进入while循环前,我获取了一个startTime, 并在while里每次获取currTime并作差判断经过时间是否已经超过最大时间,若超过则返回异常退出
在这样实现后,我发现板子再次卡死,经过定位,依然是在调用Fapi_issueAsyncCommandWithAddress后卡死
判断应该还是之前的问题,在对当前的Bank进行擦写的时候,读当前的Bank会导致CPU Stall
3.
猜测之前能够正常进行的原因,是Erase Wait (写对应Program Wait)函数里只有一个死循环while,函数足够小,它被预取到ICache中,所以在执行时不需要访问Bank 0
而让我恰好能够顺利执行。
为了验证我的想法,我在启动阶段,对Cache的使能进行了修改。
在Cache Enable的情况下,我可以顺利完成擦写
在Cache Disable的情况下, 在调用了Fapi_issueAsyncCommandWithAddress后,板子就会卡死,并且红灯亮起
这证明了我的想法。
现在的疑惑点是,

(1) Reading a Flash memory location from the bank that an erase command (sector or bank) is currently being performed will stall the CPU until the erase command finishes and the FMSTAT register indicates the FSM is not busy.

(2) Reading a Flash memory location from the bank that an program command is currently being performed will stall the CPU until the program command finishes and the FMSTAT register indicates the FSM is not busy

这两句话中有提到,读取时若当前Bank正在擦写,CPU会Stall,直到擦写完成,FMSTAT的BUSY位为0,才会继续。

这里的继续是如何实现的? 是当前的机制会自己让CPU继续,还是通过什么方法通知CPU,让CPU继续进行读取

我需要在同一个Bank上执行并擦写,是否有什么解决方案

谢谢

Ben Qin:

你好,为了更好的解决您的问题,我将咨询相关资深工程师,一旦得到回复会立即回复您。

,

Ben Qin:

你好,参考下工程师的回复:

You are not supposed to do executing and erasing on the same bank.

"The F021 Flash API library cannot be executed from the same bank as the active bank selected for the API commands to operate on".

Jialiang Ou 说:我需要在同一个Bank上执行并擦写,是否有什么解决方案

If you really want to do this operation, then you should copy the all the Flash APIs from flash bank-0 to the RAM. Once you copy the Flash APIs to the RAM then you can erase and write to the sectors in Flash Bank-0.

Please refer below thread for more details:

(+) TMS570LS3137: TMS570LS3137: Writing Flash During Runtime – Arm-based microcontrollers forum – Arm-based microcontrollers – TI E2E support forums

,

Jialiang Ou:

明白, 现在我们将调用Fapi_issueAsyncCommandWithAddress和Fapi_issueProgrammingCommand这两个FAPI开始到FSM Ready这个过程的代码都移至SRAM中解决了这个问题,但是在关中断的条件下。

经过对手册其其他TI论坛里的问题的阅览,我测试使用宏FAPI_SUSPEND_FSM将正在进行的擦除或写入挂起后,可以继续执行擦除或写入所在bank的代码

现在是希望在中断处理的开始使用这个宏挂起Flash的擦除/写入操作,将中断执行完毕后在再回来继续Flash的擦写,但是当前中断向量表等中断相关的代码内容都在0x0开始的地址中,有什么办法可以让我在对bank 0的sector进行擦写时,依然可以正常的执行中断或任务调度吗

,

Ben Qin:

已向相关工程师跟进

,

Ben Qin:

Jialiang Ou 说:有什么办法可以让我在对bank 0的sector进行擦写时,依然可以正常的执行中断或任务调度吗

如果您尝试擦除 Bank 0,则不会执行同一 Bank 0 中的代码。

赞(0)
未经允许不得转载:TI中文支持网 » TMS570LC4357: 在同一个Bank上执行代码及擦写的问题
分享到: 更多 (0)