Part Number: TMS320F28379D
F28379D 双核,自定义 Bootloader ,在CCS内仿真时正常工作,使用FREE RUN模式测试通过.
CPU2 烧录在脱离 CCS 仿真(Flash 直接引导)时失败,CPU1正常。
在执行擦除时,
g_nModbusRegister[0x78] = HWREG(FLASHPUMPSEMAPHORE_BASE); 返回值为0x0001 ;
g_nModbusRegister[0x75] = (uint16_t)(oFlashStatus & 0xFFFF); 返回值为0x0810 ;
g_nModbusRegister[0x76] = (uint16_t)((oFlashStatus & 0xFFFF0000) >> 16);返回值为0x0000 ;
g_nModbusRegister[0x74] 返回值为0x0000 ;
g_nModbusRegister[0x77] 返回值为0x0000 ;
CCS仿真引导和 Device_bootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);引导可能在什么方面的差别会导致这个问题
static bool BL_Flash_EraseRange(uint32_t startAddr, uint32_t endAddr)
{
uint16_t i;
uint32_t sectorStart, sectorEnd;
uint32_t eraseResult = 0;
Fapi_StatusType oReturnCheck;
Fapi_FlashStatusType oFlashStatus;
Fapi_FlashStatusWordType oFlashStatusWord;
const FlashSectorInfo_t *pSectorInfo;
EALLOW;
g_nModbusRegister[0x78] = HWREG(FLASHPUMPSEMAPHORE_BASE);
oReturnCheck = Fapi_issueAsyncCommand(Fapi_ClearStatus);
if (oReturnCheck != Fapi_Status_Success) eraseResult |= 1U;
if (eraseResult != 0)
{
EDIS;
return false;
}
while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady) {}
for (i = 0; i < g_u16SectorCount; i++)
{
pSectorInfo = &g_taSectorInfo[i];
sectorStart = pSectorInfo->sectorAddr;
sectorEnd = sectorStart + 2 * pSectorInfo->sectorLen;
if (sectorEnd <= startAddr || sectorStart >= endAddr) continue;
oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,
(uint32 *)pSectorInfo->sectorAddr);
if (oReturnCheck != Fapi_Status_Success) eraseResult |= (1U << pSectorInfo->errBitIdx);
g_nModbusRegister[0x74] = (uint16_t)(oReturnCheck & 0xFFFF);
while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){}
oFlashStatus = Fapi_getFsmStatus();
g_nModbusRegister[0x75] = (uint16_t)(oFlashStatus & 0xFFFF);
g_nModbusRegister[0x76] = (uint16_t)((oFlashStatus & 0xFFFF0000) >> 16);
if (oFlashStatus != 0) eraseResult |= (1U << (pSectorInfo->errBitIdx));
oReturnCheck = Fapi_doBlankCheck((uint32 *)pSectorInfo->sectorAddr,
pSectorInfo->sectorLen,
&oFlashStatusWord);
if (oReturnCheck != Fapi_Status_Success) eraseResult |= (1U << (pSectorInfo->errBitIdx));
g_nModbusRegister[0x77] = (uint16_t)(oReturnCheck & 0xFFFF);
if (eraseResult != 0)
{
EDIS;
return false;
}
}
EDIS;
return true;
}