大家好:
最近使用F28M35H52C1这款芯片,使用M3内核操作芯片内部FLASH的时候遇到了以下问题:
1:
用仿真器在线调试的时候,能够正常的操作。
脱机运行后,程序正常运行,但FLASH写入不成功。
2:
根据API里面所写,在向FLASH写入数据之前,应先将ACTIVE FLASHBANK设置为要操作的BANK,
但是我每次设置执行该操作后,FLASH地址空间值会变,程序会报错进入死循环。
我的操作步骤如下
在对FLASH进行操作前,先将其COPY到ram中运行
#pragma CODE_SECTION(Fapi_issueProgrammingCommand, "ramfuncs");
#pragma CODE_SECTION(Fapi_checkFsmForReady, "ramfuncs");
#pragma CODE_SECTION(Fapi_setActiveFlashBank, "ramfuncs");
执行下面三个函数:
memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
FlashInit();
FlashGainPump ();
oReturnCheck = Fapi_initializeAPI(F021_CPU0_BASE_ADDRESS,60);
初始化BANK语句如下:
Fapi_FlashBankType oActiveFlashBank = Fapi_FlashBank0;
oReturnCheck = Fapi_setActiveFlashBank(oActiveFlashBank);
FLASH操作函数如下
/************************************************************************************/
/***********************************************************************************
* 函数名称: program_internal_flash;
*
* 函数功能描述:向M3内部FLASH起始地址为program_start_addr的空间写入单位为byte,
* 长度为length的数据;
*
* 输入参数: program_start_addr :目的地址起始值;
* program_end_addr :目的地址边界值,操作的地址空间不能大于该数值;
* data_addr :写入数据起始地址
* length :写入数据长度,单位byte;
*
* 返回数据: none;
*
* 注意: 应参考F28M35H datasheet对FLASH进行操作;
* 向错误的地址空间写入操作数可能导致Flash锁死;
************************************************************************************/
void program_internal_flash(unsigned int program_start_addr,
unsigned int program_end_addr,
unsigned char *data_addr,
unsigned char length)
{
if((oReturnCheck == Fapi_Status_Success)&&(program_start_addr<=program_end_addr))
{
oReturnCheck = Fapi_issueProgrammingCommand((unsigned int*)program_start_addr,
data_addr,length,0,0,
Fapi_AutoEccGeneration);
while(Fapi_checkFsmForReady()== Fapi_Status_FsmBusy);
}
}