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.
我正在使用 TMS320F2.8377万D处理器。 我修改了双闪存应用程序示例,以便在CPU1-2上实现闪存擦除/写入。
两个处理器上的应用程序都启用了监视程序,并在闪存操作之间为其提供服务。
CPU1上的应用程序擦除多个闪存扇区(C,H,I,J),然后使用USB中的数据写入它们。 然后将IPC标记设置为允许CPU2执行相同操作。
启动时,CPU2等待设置IPC标志。 然后擦除多个扇区(C,H,I,J),为CPU1设置IPC标志并进入无限循环。
CPU2设置IPC标记后,CPU1将擦除一个闪存扇区(A),并进入无限循环,而不维修看门狗。 这将触发系统重新引导和操作重新启动。
单独运行此应用程序会导致多个扇区被擦除,并在引导之间进行编程。
大多数时间操作正常。 但是,有时在擦除操作期间,系统会挂起,并在监视程序过期时重新引导。
令人不安的是,在崩溃和重新启动之间,设置为输出的多个GPIO会改变其状态(一些以前的低GPIO会变为高电平,而一些高电平的GPIO会变为低电平)。
这种现象可在下图中看到。 某些GPIO线路在代码操作期间设置,以可视化何时发生的情况。
图像顶部的完整时间线波形显示了重启之间的多个操作。
当黄线变低时,操作开始,当变高时,CPU1将变为无限循环,并停止对看门狗进行维护。 当线条变低时,程序被重置并重新启动。
可以看到两个完整的操作-重新引导循环,其中一个循环失败。
屏幕截图的放大部分显示更改其状态的GPIO行。 这些更改都不会在代码中执行。
蓝色和黄色GPIO在闪存擦除之前设置为高电压,其余切换在系统崩溃时进行。
我已确保已擦除的闪存未分配给命令链接程序文件中的系统资源。
FAPI函数是从RAMLS3-4加载和运行的。
运行此程序一段时间并在不应写入的GPIO上触发,表明在闪存擦除期间发生此崩溃和GPIO故障。
有时是在应用程序中间,有时是在应用程序结束时。
任何关于可能导致这种情况的想法都很有帮助。
谢谢Ugnius。
Ugnius,
以下是一些调试建议:
1) 表5-20。 DataManual中200 MHz时的闪存参数表示典型擦除时间为110 ms (考虑32KW扇区)。 您在决定监督员的服务速率时是否考虑了此规格?
2)如TRM中所述,Flash API是可中断的。 因此,即使正在执行Flash API,您也可以通过中断为看门狗提供服务。 希望您了解这一点。 但是 ,擦除/程序操作正在进行中的闪存库不应有任何读取/提取访问权限。 因此,您应该在RAM中安装ISR。
3)您是否确定您没有擦除包含Flash API的闪存扇区? 您是否有ITRAP处理程序? 您是否尝试从该处理程序切换GPIO? 您的应用程序是否正在尝试执行已擦除闪存中的某些内容,从而获得了ITRAP并卡在ITRAP处理程序导致看门狗重置的无限循环中?
4)您是否将 Fapi_UserDefinedFunctions.c中的函数映射到RAM以执行运行时? 它们应该映射到 .TI.ramfunc部分。
5)您可能已经知道。 但希望再次提及Flash API不配置(启用/禁用)监视程序。 用户应用程序可以配置监视程序并根据需要为其提供服务。 Fapi_UserDefinedFunctions.c中提供的Fapi_serviceWatchdogTimer()函数仅在 Flash API参考指南中提到的Fapi_doVerify()和Fapi_doBlankCheck()函数中调用。
谢谢,此致,
Vamsi
您好,Vamsi:
感谢您的回复。
1.在闪存操作之前,看门狗被维修。 看门狗过期需要800毫秒。
2-3. 代码从闪存B,E,F,G运行 我正在擦除和写入C,H,I,J和A区
4..cmd内存分配显示在 下面的“FAPI memory allocation”答复中。
5.过期的看门狗不是问题。
在进一步调查该问题后,我发现问题是由设置FAPI而不是擦除闪存引起的。
查看擦除和写入闪存的示例,将代码拆分至函数。
导致问题的函数位于下面的“失败函数”答复中。
我在尝试擦除任何内容之前调用此功能。
有时,执行函数Fapi_setActiveFlashBank(Fapi_FlashBank0)时会崩溃;
在这种情况下,全球公益物被驱动到不同的状态。 正常代码停止执行,并且在看门狗未被服务时,处理器重新启动。 崩溃本身不是问题,因为看门狗重置处理器。 问题是GPIOs改变了他们的状态。 受影响引脚的范围未知,因为我观察到不同时间段内不同的GPIO驱动过高。 如果在连接敏感硬件时打开不及时,这可能会导致损坏。
我添加了GPIOs和DAC操作来指示正在发生的情况。
当功能工作时,观察到正确的信号:
黄色- DAC A (添加延迟并在Fapi_initializeAPI完成和Fapi_setActiveFlashBank启动时指示。)
绿色- DAC B。(添加延迟并在Fapi_setActiveFlashBank完成且功能退出时指示。)
蓝色- GPIO70。 (只是一个测试点)
紫色- GPIO4。 (可配置为PWM输出的引脚。)
当它崩溃时,会观察到奇怪的GPIO行为:
它看起来像是 Fapi_setActiveFlashBank(Fapi_FlashBank0)从未完成执行,因为 DAC B从未增加。
另外,其他GPIO会降低或提高,而代码中没有设置这些值。
在独立模式下,代码将以2.5秒的时间运行并重新引导。
启动代码后,5分钟内出现此故障。 有时更早,有时更晚。
需要注意的几点:
1.在功能 Fapi_initializeAPI(F021_CPU0_base_address, 200);和 Fapi_setActiveFlashBank(Fapi_FlashBank0)之间更改DAC缓降; 如果超过80ms, 似乎可以消除故障或降低在测试时间内看不到故障的可能性。
2.在 Flash_operation_init(void) 函数运行时禁用中断似乎会停止出现故障。
正在运行的唯一中断是25us计时器中断,它会增加一些计数器。 我已经初始化了i2c和SPI模块并设置了中断,但它们被配置为从操作,并且没有运行。
FAPI函数来自库,因此我无法看到它们的作用并进一步调试它。
如果计时器中断发生在 Fapi_setActiveFlashBank(Fapi_FlashBank0)执行过程中,是否会导致问题(ISR从闪存运行)?
"FAPI内存分配"
// RAMLS3:原点= 0x0.98万,长度= 0x0.08万
// RAMLS4:原点= 0x00A000,长度= 0x0.08万
RAMLS34:原点= 0x0.98万,长度= 0x0.1万
// FLASHF:原点= 0x9万,长度= 0x0.8万 /*片上闪存*/
FLASHF1:原点= 0x9万,长度= 0x0.01万 /*片上闪存*/
FLASHF2 : Origin = 0x9.01万,length = 0x0.05万 /*片上闪存*/
FLASHF3:原点= 0x9.06万,长度= 0x0.26万 /*片上闪存*/
FLASHF4 :原点= 0x092C00,长度= 0x0.54万 /*片上闪存*/
组
{
fapifuncs {-l F021_API_F2837xD_FPU32.lib }
}
负载= FLASHF3,
RUN = RAMLS34,
Run_start(_FapifuncsRunStart),
load_start(_FapifuncsLoadStart),
load_size (_FapifuncsLoadSize),
页面= 0
ramfuncs:load = FLASHF1,
RUN = RAMLS34,
run_start(_RamfuncsRunStart),
load_start(_RamfuncsLoadStart),
load_size (_RamfuncsLoadSize),
页面= 0
"故障功能"
无效
闪存_操作_初始化(void)
{
uINT16_t test_ind;
SeizeFlashPump();
GpioDataRegs.GPCSET.bit.GPIO70 = 1;
EALLOW;
Flash0EccRegs.ecc_enable.bit.enable = 0x0;
//此函数是初始化基于系统的Flash API所必需的
//执行任何其他Flash API操作之前的频率
oReturnCheck = Fapi_initializeAPI(F021_CPU0_BACK_ADDRESS,200);
对于(test_ind = 0;test_ind < 4096;test_ind++)
{
DacaRegs.DACVALS.bit.DACVALS = test_ind;
DELAY _US (1U);
}
如果(oReturnCheck!= Fapi_Status_Success)
{
GpioDataRegs.GPCCLEAR.bit.GPIO69 = 1;
GpioDataRegs.GPCSET.bit.GPIO70 = 1;
DELAY _US (10万U);
示例_错误(oReturnCheck);
}
GpioDataRegs.GPCSET.bit.GPIO71 = 1;
// Fapi_setActiveFlashBank函数可进一步设置闪存库和FMC (闪存模块控制器)
//要在银行上执行的闪存操作
oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);
对于(test_ind = 0;test_ind < 4096;test_ind++)
{
DacbRegs.DACVALS.bit.DACVALS = test_ind;
DELAY _US (1U);
}
如果(oReturnCheck!= Fapi_Status_Success)
{
GpioDataRegs.GPCCLEAR.bit.GPIO69 = 1;
GpioDataRegs.GPCSET.bit.GPIO70 = 1;
DELAY _US (10万U);
示例_错误(oReturnCheck);
}
EDIS;
GpioDataRegs.GPCCLEAR.bit.GPIO71 = 1;
}
非常感谢Vamsi的帮助。
这一切现在更有意义了。