F28M35H操作内部FLASH的问题



大家好:

       最近使用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);
     }
}