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.
工具与软件:
我有一个基于应用手册 spna192构建的 CCS 工程。 我在尝试运行应用程序时收到文件擦除错误。 奇怪的是、应用程序会正常加载和运行、但它无法擦除闪存。 我曾尝试在工程属性中使用"所有扇区"来擦除 闪存、但在其余闪存地址空间中看到非 FFFFFFFF 地址。 这在已知良好的 LaunchPad 和生产板上具有类似的行为方式。 我怀疑是配置错误导致了此问题。 我尝试使 icashe 无效并调用 Fapi_flushPipel()但没有成功。
例如 FFFF FFFF FF7F FFFF FFFF FFFF FFFF FFCB FEFF FFFF FFFF FFFF
FFFF FFBF FFFF FFBE FBFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
FFFE FFFF FF5F 7FFF FFFF FFFF FF7B EFFF FFFF FFFF FFFF FFF7
FFFF FFFF FFFF FFFF FFFB FFFF FFB7 DFFF FFFF BFFF FFEF FFB6 D9FF
FFFF FFFF FFFF FFFF FFFF FFF6 FDFF FFFF FFFF FFFF FF7F FFFF FFB7
DFFF
感谢任何帮助。
uint32_t Fapi_Block (uint32_t ulAddr、uint32_t Size)
{
uint8_t i=0u;
uint8_t ucStartBank;
uint8_t ucEndBank;
uint8_t ucStartSector;
uint8_t ucEndSector;
uint32_t EndAddr;
uint32_t status;
#if 1.
EndAddr = ulAddr + Size;
for (i = 0;I < NUMBEROFSECTORS;i++)
{
if ((ulAddr >=(uint32_t)(FLASH_SECTOR[i].start))&&(ulAddr <((uint32_t) FLASH_SECTOR[i].start + FLASH_SECTOR[i].length))
{
ucStartBank = flash_sector[i].bankNumber;
ucStartSector = i;
休息;
}
}
for (i = ucStartSector;i < NUMBEROFSECTORS;i++)
{
if (EndAddr <=(((uint32_t) flash_sector[i].start)+ flash_sector[i].length))
{
ucEndBank = FLASH_SECTOR[i].bankNumber;
ucEndSector = i;
休息;
}
}
// API 版本2.01
状态= Fapi_initializeFlashBanks ((uint32_t) SYS_CLK_FREQ);
if (status == Fapi_Status_Success)
{
Status = Fapi_enableAutoEccCalculation ();
for (i = ucStartBank;i <(ucEndBank + 1);i++)
{
if (status!= Fapi_Status_Success)
{
休息;
}
状态= Fapi_setActiveFlashBank(( Fapi_Flash 类型) i );
if (status!= Fapi_Status_Success)
{
休息;
}
// API 版本2.01
状态= Fapi_enableMainBankSectors (0xFFFF);
if (status!= Fapi_Status_Success)
{
休息;
}
while (fapi_check_fsm_ready_busy!=4074 Fapi_Status_Fsm);
}
for (i=ucStartSector;i<(ucEndSector+1);i++)
{
Fapi_issueAsyncCommandWithAddress (Fapi_Erase 52ctor、FLASH_SECTOR[i].start);
if (status!= Fapi_Status_Success)
{
休息;
}
while (fapi_check_fsm_ready_busy == Fapi_Status_Fsm y);
while (FAPI_GET_FSM_STATUS!= Fapi_Status_Success);
}
}
status |= Flash_Erase_Check (ulAddr、size);
返回(状态);
}
uint32_t Flash_Erase_Check (uint32_t Start_Address、uint32_t 字节)
{
uint32_t error = ERASE_NO_ERR;
寄存器 uint32_t * dst1 =(uint32_t *) Start_Address;
寄存器 uint32_t bytes =字节;
_iCacheInvalidate_();
Fapi_flushPipeline();/*刷新高速缓存*/
while (字节> 0U)
{
if (*dst1++!= 0xFFFFFFFFU)
{
错误= ERASE_ERR;
休息;
}
字节-= 0x4U;
}
返回错误;
}
尊敬的 Richard:
这只是预期行为、 这是由 ECC single-bit 校正导致的 并且该器件中的 ECC 校正和检测将始终处于启用状态。
有关更多详细信息、请参阅以下主题:
(11) TMS570LC4357:Uniflash 工具无法正确擦除闪存。 -基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛
(11) TMS570LC4357:不删除闪存-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛
——
谢谢、此致、
Jagadish。
谢谢! 这让我很失望!
因此、对示例代码中的 Flash_Erase_ 4.0的调用将不起作用。 另一方面、我认为没有实际的方法来验证擦除。 我要把它注释掉。
Jagadish
如果我可以再施加一次? 引导加载程序正常工作并且看起来可靠。 我不得不注释出一个呼叫 Flash_Program_Check (),以使这个工作然而。 在每次32字节写入后、代码都会尝试验证写入。 即使写入成功、我也偶尔会在其中一次写入时收到验证错误。 它的行为就像缓存行有过时的数据一样。 尝试使 ICache 无效没有帮助。 我认为没有 API 可用于刷新和使 dcache 无效。 如果我忽略验证错误、映像会启动并具有正确的文本。 你有什么想法吗?
丰富
尊敬的 Richard:
[报价 userid="556984" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1411515/tms570lc4357-tms570-bootloader-failure-spna192/5406692 #5406692"]即使写入成功、我偶尔也会在一次写入时收到验证错误。 它的行为就像缓存行有过时的数据一样。 [报价]是的、这是可以实现的。
试图使 ICache 无效没有帮助。 我认为没有 API 可用于刷新和使 dcache 无效。 如果我忽略验证错误、映像会启动并具有正确的文本。 您是否有任何想法?
我们将执行一件事、
首先完全禁用高速缓存并验证代码、您可以通过取消选中 HALCoGen 中的以下复选框来禁用高速缓存:
实际上、这将帮助我们确认它是否真正归因于高速缓存。 禁用缓存后、我们的验证应该会成功。
如果它在缓存禁用后正常工作、则可以对相应的闪存区域执行一项称为"直写"的设置、并可以进行测试:
(+) RM57L843:无法开始 EMAC 传输-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛
如果我们将直写式存储器设置为一个区域、则对相应区域的任何写入都会更新缓存和主存储器、因此该问题应该得到解决。
——
谢谢、此致、
Jagadish。