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.
您好的团队:
客户的项目分为引导加载程序和应用程序、 闪存 A-D 中的引导加载程序以及 闪存 E-K 中的应用程序
当使用 JTAG 进行调试时、程序可以正常工作、但是在将程序加载到闪存并运行后、程序无法正常运行。
客户似乎已将代码从闪存复制到 RAM:
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize); memcpy(&RamfuncsFapiRunStart, &RamfuncsFapiLoadStart, (size_t)&RamfuncsFapiLoadSize); CMD文件: .TI.ramfuncFapi : { --library=../F2837xD_flashapi/lib/F021_API_F2837xD_FPU32.lib } LOAD = FLASHG, RUN = RAMD1, RUN_START(_RamfuncsFapiRunStart), LOAD_START(_RamfuncsFapiLoadStart), LOAD_SIZE(_RamfuncsFapiLoadSize), PAGE = 0, ALIGN(4)
但项目仍然有这个问题。
此致、
绿色
其他:
CCS 版本:11.0.0.00012、SDK 版本: C2000Ware_4_00_00_00
memcpy 代码
#ifdef _FLASH // // Copy time critical code and flash setup code to RAM. This includes the // following functions: InitFlash(); // // The RamfuncsLoadStart, RamfuncsLoadSize, and RamfuncsRunStart symbols // are created by the linker. Refer to the device .cmd file. // memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize); memcpy(&RamfuncsFapiRunStart, &RamfuncsFapiLoadStart, (size_t)&RamfuncsFapiLoadSize); memcpy(&RamfuncsFpuRunStart, &RamfuncsFpuLoadStart, (size_t)&RamfuncsFpuLoadSize); memcpy(&RamfuncsUserRunStart, &RamfuncsUserLoadStart, (size_t)&RamfuncsUserLoadSize); // // Call Flash Initialization to setup flash waitstates. This function must // reside in RAM. // Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, DEVICE_FLASH_WAITSTATES); #endif
闪存初始化并调用 Eras\Write 函数:
/* * BswEep.c * * Created on: 2022��4��5�� * Author: Thinkpad-T14 */ #include "Includes.h" #pragma CODE_SECTION(BswEep_init, ".User.ramfunc"); uint16_t BswEep_init(void) { uint16_t ReturnValue=0; Fapi_StatusType oFapi_Status1,oFapi_Status2; Flash_claimPumpSemaphore(FLASHPUMPSEMAPHORE_BASE, FLASH_CPU1_WRAPPER); EALLOW; oFapi_Status1 = Fapi_initializeAPI(F021_CPU0_BASE_ADDRESS, DEVICE_SYSCLK_FREQ/1000000); Flash_disableECC(FLASH0ECC_BASE); oFapi_Status2 = Fapi_setActiveFlashBank(Fapi_FlashBank0); Flash_enableECC(FLASH0ECC_BASE); EDIS; if( (oFapi_Status1 != Fapi_Status_Success) || (oFapi_Status2 != Fapi_Status_Success) ) { ReturnValue=0; } else { ReturnValue=BswEep_ReadFLSL(); ReturnValue=ReturnValue & BswEep_ReadFLSM(); ReturnValue=ReturnValue & BswEep_ReadFLSN(); } GeBswEep_Flag_InitReady=ReturnValue; return ReturnValue; } #pragma CODE_SECTION(BswEep_ReadFLSL, ".User.ramfunc"); uint16_t BswEep_ReadFLSL(void) { uint16_t ReturnValue=0; Fapi_StatusType oFapi_Status; DINT; EALLOW; oFapi_Status = Fapi_doMarginRead((uint32 *)(0x0BA000),(uint32 *)&CeAswNvm_U_EcuInformation,sizeof(GeAswNvm_Type_EcuInformationUnion)/2,Fapi_NormalRead); EDIS; EINT; if(oFapi_Status == Fapi_Status_Success) ReturnValue=1; else ReturnValue=0; return ReturnValue; } #pragma CODE_SECTION(BswEep_ReadFLSM, ".User.ramfunc"); uint16_t BswEep_ReadFLSM(void) { uint16_t ReturnValue=0; Fapi_StatusType oFapi_Status1,oFapi_Status2; DINT; EALLOW; oFapi_Status1 = Fapi_doMarginRead((uint32 *)(0x0BC000),(uint32 *)&CeAswNvm_U_BoardInformation,sizeof(GeAswNvm_Type_BoardInformationUnion)/2,Fapi_NormalRead); oFapi_Status2 = Fapi_doMarginRead((uint32 *)(0x0BC100),(uint32 *)&CeAswNvm_U_CalibInformation,sizeof(GeAswNvm_Type_CalibInformationUnion)/2,Fapi_NormalRead); EDIS; EINT; if( (oFapi_Status1 == Fapi_Status_Success) && (oFapi_Status2 == Fapi_Status_Success) ) ReturnValue=1; else ReturnValue=0; if(CeAswNvm_U_BoardInformation.NvmData.BoardID<1) CeAswNvm_U_BoardInformation.NvmData.BoardID=1; else if(CeAswNvm_U_BoardInformation.NvmData.BoardID>100) CeAswNvm_U_BoardInformation.NvmData.BoardID=100; if( (CeAswNvm_U_BoardInformation.NvmData.SciBaudRate == 9600) || (CeAswNvm_U_BoardInformation.NvmData.SciBaudRate == 19200) || (CeAswNvm_U_BoardInformation.NvmData.SciBaudRate == 38400) || (CeAswNvm_U_BoardInformation.NvmData.SciBaudRate == 57600) || (CeAswNvm_U_BoardInformation.NvmData.SciBaudRate == 115200) ) {} else { CeAswNvm_U_BoardInformation.NvmData.SciBaudRate=115200; } if( (CeAswNvm_U_BoardInformation.NvmData.CanBaudRate == 125000) || (CeAswNvm_U_BoardInformation.NvmData.CanBaudRate == 250000) || (CeAswNvm_U_BoardInformation.NvmData.CanBaudRate == 500000) || (CeAswNvm_U_BoardInformation.NvmData.CanBaudRate == 1000000) ) {} else { CeAswNvm_U_BoardInformation.NvmData.CanBaudRate=250000; } return ReturnValue; } #pragma CODE_SECTION(BswEep_ReadFLSN, ".User.ramfunc"); uint16_t BswEep_ReadFLSN(void) { uint16_t ReturnValue=0; Fapi_StatusType oFapi_Status; Fapi_FlashStatusWordType oFapi_FlashStatusWord; uint16_t tempIndex=0; uint16_t LeBswEep_U16_UnionSize=0; //used to save size of Unions in 16-bits uint32_t LeBswEep_U32_TgtAddr=0; //Command Target Address; DINT; LeBswEep_U16_UnionSize=sizeof(GeAswNvm_Type_AppInformationUnion); for(tempIndex=0;tempIndex<(0x2000/LeBswEep_U16_UnionSize);tempIndex++) { LeBswEep_U32_TgtAddr=0x0BE000+tempIndex*LeBswEep_U16_UnionSize; EALLOW; oFapi_Status = Fapi_doBlankCheck((uint32 *)LeBswEep_U32_TgtAddr,LeBswEep_U16_UnionSize/2,&oFapi_FlashStatusWord); EDIS; if(oFapi_Status == Fapi_Status_Success) { break; } } if ( (tempIndex>=0x2000/LeBswEep_U16_UnionSize) || (tempIndex==0) ) { GeAswNvm_U_AppInformationLocationIndex[1]=0x0BE000; GeAswNvm_U_AppInformationLocationIndex[0]=GeAswNvm_U_AppInformationLocationIndex[1]+0x2000-LeBswEep_U16_UnionSize-(0x2000%LeBswEep_U16_UnionSize); EALLOW; oFapi_Status = Fapi_doMarginRead((uint32 *)GeAswNvm_U_AppInformationLocationIndex[0],(uint32 *)&CeAswNvm_U_AppInformation,LeBswEep_U16_UnionSize/2,Fapi_NormalRead); EDIS; } else { GeAswNvm_U_AppInformationLocationIndex[1]=0x0BE000+tempIndex*LeBswEep_U16_UnionSize; GeAswNvm_U_AppInformationLocationIndex[0]=GeAswNvm_U_AppInformationLocationIndex[1]-LeBswEep_U16_UnionSize; EALLOW; oFapi_Status = Fapi_doMarginRead((uint32 *) GeAswNvm_U_AppInformationLocationIndex[0],(uint32 *)&CeAswNvm_U_AppInformation,LeBswEep_U16_UnionSize/2,Fapi_NormalRead); EDIS; } EINT; if(oFapi_Status == Fapi_Status_Success) ReturnValue=1; else ReturnValue=0; CeAswNvm_U_AppInformation.NvmData.Reserved1=0; return ReturnValue; } #pragma CODE_SECTION(BswEep_EraseFLSL, ".User.ramfunc"); uint16_t BswEep_EraseFLSL(void) { uint16_t ReturnValue=0; Fapi_StatusType oFapi_Status,oFapi_Status1,oFapi_Status2; Fapi_FlashStatusType oFapi_FlashStatus; Fapi_FlashStatusWordType oFapi_FlashStatusWord; DINT; SysCtl_disableWatchdog(); EALLOW; oFapi_Status = Fapi_doBlankCheck((uint32 *)(0x0BA000),0x1000,&oFapi_FlashStatusWord); EDIS; if(oFapi_Status !=Fapi_Status_Success) { EALLOW; oFapi_Status1 = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,(uint32 *)(0x0BA000)); while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady){} oFapi_FlashStatus = Fapi_getFsmStatus(); oFapi_Status2 = Fapi_doBlankCheck((uint32 *)(0x0BA000),0x1000,&oFapi_FlashStatusWord); EDIS; if( (oFapi_Status1 != Fapi_Status_Success) || (oFapi_Status2 != Fapi_Status_Success) || (oFapi_FlashStatus!=0) ) ReturnValue=0; else ReturnValue=1; } else { ReturnValue=1; } SysCtl_enableWatchdog(); DEVICE_DELAY_US(60000); EINT; return ReturnValue; } #pragma CODE_SECTION(BswEep_EraseFLSM, ".User.ramfunc"); uint16_t BswEep_EraseFLSM(void) { uint16_t ReturnValue=0; Fapi_StatusType oFapi_Status,oFapi_Status1,oFapi_Status2; Fapi_FlashStatusType oFapi_FlashStatus; Fapi_FlashStatusWordType oFapi_FlashStatusWord; DINT; SysCtl_disableWatchdog(); EALLOW; oFapi_Status = Fapi_doBlankCheck((uint32 *)(0x0BC000),0x1000,&oFapi_FlashStatusWord); EDIS; if(oFapi_Status !=Fapi_Status_Success) { EALLOW; oFapi_Status1 = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,(uint32 *)(0x0BC000)); while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady){} oFapi_FlashStatus = Fapi_getFsmStatus(); oFapi_Status2 = Fapi_doBlankCheck((uint32 *)(0x0BC000),0x1000,&oFapi_FlashStatusWord); EDIS; if( (oFapi_Status1 != Fapi_Status_Success) || (oFapi_Status2 != Fapi_Status_Success) || (oFapi_FlashStatus!=0) ) ReturnValue=0; else ReturnValue=1; } else { ReturnValue=1; } SysCtl_enableWatchdog(); DEVICE_DELAY_US(60000); EINT; return ReturnValue; } #pragma CODE_SECTION(BswEep_EraseFLSN, ".User.ramfunc"); uint16_t BswEep_EraseFLSN(void) { uint16_t ReturnValue=0; Fapi_StatusType oFapi_Status,oFapi_Status1,oFapi_Status2; Fapi_FlashStatusType oFapi_FlashStatus; Fapi_FlashStatusWordType oFapi_FlashStatusWord; DINT; SysCtl_disableWatchdog(); EALLOW; oFapi_Status = Fapi_doBlankCheck((uint32 *)(0x0BE000),0x1000,&oFapi_FlashStatusWord); EDIS; if(oFapi_Status !=Fapi_Status_Success) { EALLOW; oFapi_Status1 = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,(uint32 *)(0x0BE000)); while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady){} oFapi_FlashStatus = Fapi_getFsmStatus(); oFapi_Status2 = Fapi_doBlankCheck((uint32 *)(0x0BE000),0x1000,&oFapi_FlashStatusWord); EDIS; if( (oFapi_Status1 != Fapi_Status_Success) || (oFapi_Status2 != Fapi_Status_Success) || (oFapi_FlashStatus!=0) ) ReturnValue=0; else { ReturnValue=1; GeAswNvm_U_AppInformationLocationIndex[1]=0x0BE000; GeAswNvm_U_AppInformationLocationIndex[0]=GeAswNvm_U_AppInformationLocationIndex[1]+0x2000-sizeof(GeAswNvm_Type_AppInformationUnion)-(0x2000%sizeof(GeAswNvm_Type_AppInformationUnion)); } } else { ReturnValue=1; GeAswNvm_U_AppInformationLocationIndex[1]=0x0BE000; GeAswNvm_U_AppInformationLocationIndex[0]=GeAswNvm_U_AppInformationLocationIndex[1]+0x2000-sizeof(GeAswNvm_Type_AppInformationUnion)-(0x2000%sizeof(GeAswNvm_Type_AppInformationUnion)); } SysCtl_enableWatchdog(); DEVICE_DELAY_US(60000); EINT; return ReturnValue; } #pragma CODE_SECTION(BswEep_WriteFLSL, ".User.ramfunc"); uint16_t BswEep_WriteFLSL(void) { uint16_t ReturnValue=0; Fapi_StatusType oFapi_Status; Fapi_FlashStatusType oFapi_FlashStatus; Fapi_FlashStatusWordType oFapi_FlashStatusWord; uint16_t tempIndex=0; uint16_t LeBswEep_U16_UnionSize=0; //used to save size of Unions in 16-bits DINT; SysCtl_disableWatchdog(); LeBswEep_U16_UnionSize=sizeof(GeAswNvm_Type_EcuInformationUnion); EALLOW; oFapi_Status = Fapi_doBlankCheck((uint32 *)(0x0BA000),LeBswEep_U16_UnionSize/2,&oFapi_FlashStatusWord); EDIS; if(oFapi_Status != Fapi_Status_Success) { ReturnValue=0; } else { oFapi_Status=Fapi_Status_Success; oFapi_FlashStatus=0; for(tempIndex=0; tempIndex<(LeBswEep_U16_UnionSize/4) && (oFapi_Status==Fapi_Status_Success) && (oFapi_FlashStatus==0) ;tempIndex++) { EALLOW; oFapi_Status = Fapi_issueProgrammingCommand((uint32 *)(0x0BA000+tempIndex*4), (uint16 *)(&CeAswNvm_U_EcuInformation.FlsBuffer[0]+tempIndex*4), 4, 0, 0, Fapi_AutoEccGeneration); while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady){} oFapi_FlashStatus = Fapi_getFsmStatus(); EDIS; } EALLOW; oFapi_Status = Fapi_doVerify((uint32 *)(0x0BA000),LeBswEep_U16_UnionSize/2,(uint32 *)(&CeAswNvm_U_EcuInformation.FlsBuffer[0]),&oFapi_FlashStatusWord); EDIS; if( (oFapi_Status != Fapi_Status_Success) ) { ReturnValue=0; } else ReturnValue=1; } SysCtl_enableWatchdog(); DEVICE_DELAY_US(60000); EINT; return ReturnValue; } #pragma CODE_SECTION(BswEep_WriteFLSM, ".User.ramfunc"); uint16_t BswEep_WriteFLSM(void) { uint16_t ReturnValue=0; Fapi_StatusType oFapi_Status,oFapi_Status1,oFapi_Status2; Fapi_FlashStatusType oFapi_FlashStatus; Fapi_FlashStatusWordType oFapi_FlashStatusWord; uint16_t tempIndex=0; uint16_t LeBswEep_U16_UnionSize=0; //used to save size of Unions in 16-bits DINT; SysCtl_disableWatchdog(); LeBswEep_U16_UnionSize=sizeof(GeAswNvm_Type_BoardInformationUnion)+sizeof(GeAswNvm_Type_CalibInformationUnion); EALLOW; oFapi_Status = Fapi_doBlankCheck((uint32 *)(0x0BC000),LeBswEep_U16_UnionSize/2,&oFapi_FlashStatusWord); EDIS; if(oFapi_Status != Fapi_Status_Success) { ReturnValue=0; } else { oFapi_Status=Fapi_Status_Success; oFapi_FlashStatus=0; for(tempIndex=0;tempIndex<(sizeof(GeAswNvm_Type_BoardInformationUnion)/4) && (oFapi_Status==Fapi_Status_Success) && (oFapi_FlashStatus==0) ;tempIndex++) { EALLOW; oFapi_Status = Fapi_issueProgrammingCommand((uint32 *)(0x0BC000+tempIndex*4), (uint16 *)(&CeAswNvm_U_BoardInformation.FlsBuffer[0]+tempIndex*4), 4, 0, 0, Fapi_AutoEccGeneration); while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady){} oFapi_FlashStatus = Fapi_getFsmStatus(); EDIS; } oFapi_Status=Fapi_Status_Success; oFapi_FlashStatus=0; for(tempIndex=0;tempIndex<(sizeof(GeAswNvm_Type_CalibInformationUnion)/4) && (oFapi_Status==Fapi_Status_Success) && (oFapi_FlashStatus==0) ;tempIndex++) { EALLOW; oFapi_Status = Fapi_issueProgrammingCommand((uint32 *)(0x0BC100+tempIndex*4), (uint16 *)(&CeAswNvm_U_CalibInformation.FlsBuffer[0]+tempIndex*4), 4, 0, 0, Fapi_AutoEccGeneration); while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady){} oFapi_FlashStatus = Fapi_getFsmStatus(); EDIS; } EALLOW; oFapi_Status1 = Fapi_doVerify((uint32 *)(0x0BC000),sizeof(GeAswNvm_Type_BoardInformationUnion)/2,(uint32 *)(&CeAswNvm_U_BoardInformation.FlsBuffer[0]),&oFapi_FlashStatusWord); oFapi_Status2 = Fapi_doVerify((uint32 *)(0x0BC100),sizeof(GeAswNvm_Type_CalibInformationUnion)/2,(uint32 *)(&CeAswNvm_U_CalibInformation.FlsBuffer[0]),&oFapi_FlashStatusWord); EDIS; if( (oFapi_Status1 != Fapi_Status_Success) || (oFapi_Status2 != Fapi_Status_Success) ) ReturnValue=0; else ReturnValue=1; } SysCtl_enableWatchdog(); DEVICE_DELAY_US(60000); EINT; return ReturnValue; } #pragma CODE_SECTION(BswEep_WriteFLSN, ".User.ramfunc"); uint16_t BswEep_WriteFLSN(void) { uint16_t ReturnValue=0; uint16_t WriteFlag=0; Fapi_StatusType oFapi_Status; Fapi_FlashStatusType oFapi_FlashStatus; Fapi_FlashStatusWordType oFapi_FlashStatusWord; uint16_t tempIndex=0; uint16_t LeBswEep_U16_UnionSize=0; //used to save size of Unions in 16-bits DINT; SysCtl_disableWatchdog(); LeBswEep_U16_UnionSize=sizeof(GeAswNvm_Type_AppInformationUnion); EALLOW; oFapi_Status=Fapi_doVerify( (uint32 *)GeAswNvm_U_AppInformationLocationIndex[0], LeBswEep_U16_UnionSize/2,(uint32 *)(&CeAswNvm_U_AppInformation.FlsBuffer[0]),&oFapi_FlashStatusWord); EDIS; if(oFapi_Status == Fapi_Status_Success) { WriteFlag=0; } else if( (GeAswNvm_U_AppInformationLocationIndex[1]-0x0BE000+LeBswEep_U16_UnionSize)>0x2000) { WriteFlag=BswEep_EraseFLSN(); } else { WriteFlag=1; } if(WriteFlag) { oFapi_Status=Fapi_Status_Success; oFapi_FlashStatus=0; for(tempIndex=0;tempIndex<(LeBswEep_U16_UnionSize/4) && (oFapi_Status==Fapi_Status_Success) && (oFapi_FlashStatus==0) ;tempIndex++) { EALLOW; oFapi_Status = Fapi_issueProgrammingCommand((uint32 *)(GeAswNvm_U_AppInformationLocationIndex[1]+tempIndex*4), (uint16 *)(&CeAswNvm_U_AppInformation.FlsBuffer[0]+tempIndex*4), 4, 0, 0, Fapi_AutoEccGeneration); while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady){} oFapi_FlashStatus = Fapi_getFsmStatus(); EDIS; } EALLOW; oFapi_Status=Fapi_doVerify( (uint32 *)GeAswNvm_U_AppInformationLocationIndex[1],LeBswEep_U16_UnionSize/2,(uint32 *)(&CeAswNvm_U_AppInformation.FlsBuffer[0]),&oFapi_FlashStatusWord); EDIS; if(oFapi_Status == Fapi_Status_Success) { ReturnValue=1; GeAswNvm_U_AppInformationLocationIndex[0]=GeAswNvm_U_AppInformationLocationIndex[1]; GeAswNvm_U_AppInformationLocationIndex[1]+=LeBswEep_U16_UnionSize; } else { ReturnValue=0; } } else{} SysCtl_enableWatchdog(); DEVICE_DELAY_US(60000); EINT; return ReturnValue; }
绿色环保、
我将在几天内回顾并返回给您。
谢谢、此致、
Vamsi
绿色环保、
请 提供 有关您的陈述的更多详细信息、"但在将程序加载到闪存并运行后、它无法正常运行"。
您是否可以提供任何特定的错误/状态来进行分析?
谢谢、此致、
Vamsi
其余程序正常运行、与 Fapi 相关的函数将返回错误值。
例如执行:
oFapi_Status = Fapi_issueProgrammingCommand (x、x、4、0、0、Fapi_AutoEccGeneration)
返回值状态为:
Fapi_Error_Fail=500
typedef enum { Fapi_Status_Success=0, /* Function completed successfully */ Fapi_Status_FsmBusy, /* FSM is Busy */ Fapi_Status_FsmReady, /* FSM is Ready */ Fapi_Status_AsyncBusy, /* Async function operation is Busy */ Fapi_Status_AsyncComplete, /* Async function operation is Complete */ Fapi_Error_Fail=500, /* Generic Function Fail code */ Fapi_Error_StateMachineTimeout, /* State machine polling never returned ready and timed out */ Fapi_Error_OtpChecksumMismatch, /* Returned if OTP checksum does not match expected value */ Fapi_Error_InvalidDelayValue, /* Returned if the Calculated RWAIT value exceeds 15 - Legacy Error */ Fapi_Error_InvalidHclkValue, /* Returned if FClk is above max FClk value - FClk is a calculated from HClk and RWAIT/EWAIT */ Fapi_Error_InvalidCpu, /* Returned if the specified Cpu does not exist */ Fapi_Error_InvalidBank, /* Returned if the specified bank does not exist */ Fapi_Error_InvalidAddress, /* Returned if the specified Address does not exist in Flash or OTP */ Fapi_Error_InvalidReadMode, /* Returned if the specified read mode does not exist */ Fapi_Error_AsyncIncorrectDataBufferLength, Fapi_Error_AsyncIncorrectEccBufferLength, Fapi_Error_AsyncDataEccBufferLengthMismatch, Fapi_Error_FeatureNotAvailable /* FMC feature is not available on this device */ } ATTRIBUTE_PACKED Fapi_StatusType;
绿色环保、
他们是否能够成功执行 C2000Ware 中的闪存编程示例?
谢谢、此致、
Vamsi