主题中讨论的其他部件:C2000WARE, UNIFLAASH
工具/软件:TI C/C++编译器
我被卡住了。
我正在尝试为F2.8075万构建启动加载器。 我的引导加载程序的大部分是从示例程序中提取的。
在从调试器初始加载时,API可以毫无问题地擦除和写入闪存。 它可以在重置后加载和运行应用程序。 但在任何重置后,Erase函数(oReturnCheck = Fapi_issueSecCommandWithAddress(Fapi_EraseSector, SectorAddress);) 返回"Fapi_Status_SUCCES",但空白检查失败(实际上没有更改任何闪存)。 由于无法通过此部件,我无法判断重置后是否有任何写入操作有效。
在这里的论坛中,我检查了API是否正在运行RAM,这似乎是(在本例中是RAMD0,如果它有所不同,尽管我尝试过其他部分)。 根据反汇编地址,RAM不足的代码的其他部分似乎还可以。
cmd文件:
组
{
.ti.ramfunc
{-l F021_API_F2837xD_FPU32.lib}
}
load = bootloader,
Run = RAMD0,
load_start(_RamfuncLoadStart),
load_size (_RamfuncLoadSize),
load_end (_RamfuncLoadEnd),
run_start(_RamfuncRunStart),
Run_Size (_RamfuncRunSize),
Run_End(_RamfuncRunEnd),
页面= 0,对齐(4)
****
主菜单的第一行:
Memcopy (&RamfuncLoadStart,&RamfuncLoadEnd,&RamfuncRunStart);
****
MEM复制功能:
void Memcopy(volatile UINT16 *SourceAddr,volatile UINT16* SourceEndAddr,volatile UINT16* DestAddr)
{
while (SourceAddr < SourceEndAddr)
{
*DestAddr++=*SourceAddr++;
}
返回;
}
*******
实际擦除部分调用的函数:
#pragma code_section (Flash_Erase_sector,"ramfuncs");
FAPI_StatusType Flash_Erase_Sector (UINT32 *秒地址,UINT16秒长度)
{
Volatile Fapi_StatusType oReturnCheck;
FAPI_FlashStatusWordType oFlashStatusWord;
//
//擦除扇区:
//
EALLOW;
//oReturnCheck = Fapi_issueSecCommandWithAddress (Fapi_EraseSector,SectorAddress);
oReturnCheck = Fapi_issue3cCommandWithAddress (Fapi_EraseSector, SectorAddress);
//
//等待FSM完成擦除扇区操作
//
while (Fapi_checkFsmForReady()!= Fapi_Status_FsmReady){}
EDIS;
IF (oReturnCheck!= Fapi_Status_Success)
{
//
//查看Flash API文档以了解可能的错误
//如果Erase命令失败,请使用Fapi_getFsmStatus()函数获取
// fmstat寄存器内容,查看是否有EV位,ESUSP位,
//设置Cstat位或VOLTSTAT位(请参阅API文档了解
//更多详细信息)
//
错误((UINT16) oReturnCheck);
}
//
//验证扇区是否已擦除。 擦除步骤本身执行
//在运行时进行验证。 此验证是可以执行的第二次验证。
//
EALLOW;
oReturnCheck = Fapi_doBlankCheck (SectorAddress,SectorLength,&oFlashStatusWord);
EDIS;
IF (oReturnCheck!= Fapi_Status_Success)
{
//
//查看Flash API文档以了解可能的错误
//如果Erase命令失败,请使用Fapi_getFsmStatus()函数获取
// fmstat寄存器内容,查看是否有EV位,ESUSP位,
//设置Cstat位或VOLTSTAT位(请参阅API文档了解
//更多详细信息)
//
错误((UINT16) oReturnCheck);
}
Return oReturnCheck (返回oReturnCheck);
}
******
初始化函数:
#pragma code_section (Flash_Init_Flash_API,"ramfuncs");
void Flash_Init_Flash_API (void)
{
Volatile Fapi_StatusType oReturnCheck;
EALLOW;
//禁用ECC
Flash0EccRegs.ecc_enable.bit.enable = 0x0;
//初始化闪存以便可以写入:
oReturnCheck = Fapi_initializeAPI(F021_CPU0_BACK_ADDRESS,120);
IF (oReturnCheck!= Fapi_Status_Success)
{
//
//查看Flash API文档以了解可能的错误
//
错误((UINT16) oReturnCheck);
}
EDIS;
FLASH_initialized =真;
}
****
注意,在调用擦除扇区功能之前,我先关闭ECC,然后关闭看门狗。 启动加载程序启动时以及通信可以启动之前调用API init函数。 用户功能直接从示例复制而不进行任何编辑。
任何我可能做错的事情。 这种API比F2.8035万更简单易用。 我不知道它只在第一次使用调试器加载时工作的方式,然后再也不会。
谢谢!
Kyle