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.

[参考译文] 编译器/TMS320F2.8075万:闪存API在初始运行时工作,但在重置后不工作。

Guru**** 2576195 points
Other Parts Discussed in Thread: C2000WARE, UNIFLASH

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/641261/compiler-tms320f28075-flash-api-works-on-initial-run-but-not-after-reset

部件号:TMS320F2.8075万
主题中讨论的其他部件:C2000WAREUNIFLAASH

工具/软件: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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Kyle,

    首次加载时,它可能会通过,因为Flash插件正确配置了Flash包装程序。  以下是您可以检查的一些事项:

    1)我在链接程序命令文件中看到.ti.ramfunc。 但您在代码中使用的是"ramfuncs"。  您是否也将"ramfuncs"映射到Flash以进行加载和RAM以进行运行?  如果您使用的是最新的编译器,则可能需要将"ramfuncs"替换为'.ti.ramfunc"。

    2)您是否调用了Fapi_setActiveFlashBank(Fapi_FlashBank0)?

    3)请使用memcpy()函数代替memcopy()函数。 memcpy()现在是RTS库的一部分。

    4)擦除操作后,您是否可以检查fmstat寄存器的值? 您可以使用Fapi_getFsmStatus()函数进行此操作。 有关fmstat寄存器的详细信息,请参见3.2 6-7 Fapi_getFsmStatus()中有关此函数的说明,网址 为http://www.ti.com/lit/pdf/spnu629。  下面是示例代码。

    //擦除扇区

    oReturnCheck = Fapi_issue3cCommandWithAddress (Fapi_EraseSector, SectorAddress);

    //等待FSM完成擦除扇区操作
    while (Fapi_checkFsmForReady()!= Fapi_Status_FsmReady){}

    IF (oReturnCheck!= Fapi_Status_Success)

       示例_错误(oReturnCheck);
    }

    //读取fmstat寄存器内容以了解FSM的状态
    // erase命令查看是否存在任何与擦除操作相关的错误
    oFlashStatus = Fapi_getFsmStatus();

    如果(oFlashStatus!= 0)

       //检查fmstat的Flash API文档并进行相应的调试
       // Fapi_getFsmStatus()函数提供fmstat寄存器内容。
       //检查是否有EV位,ESUSP位,Cstat位或
       //已设置VOLTSTAT位(有关详细信息,请参阅API文档)。
       fmstat_fail ();
    }

    5)您是否检查了在 poFlashStatusWord中返回的空白check函数的地址?  是扇区的第一个地址位置吗?

    6) 您使用的闪存等待状态配置是什么?

    7)您是否按照  TRM中的CSM密码匹配流程(PMF)的建议对密码位置执行了虚拟读取,以取消您正在尝试擦除的区域的安全?

    8) 闪存擦除失败时,您是否确定PLL配置正确?

    9)确保将Fapi_UserDefinedFunctions.c文件中的函数分配给.ti.ramfunc (如果尚未分配)。  如果您使用C2000Ware中的此文件,则该文件应该已经存在。

    由于使用的闪存技术不同,因此为该设备提供的闪存API与F2.8035万的不同。  另请注意,F2807x中的闪存具有更多的功能,如ECC,程序多个单词等,因此它比早期的API复杂一些。

    谢谢,此致,
    Vamsi

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢快速回复...

    1.是的。 有两个Memcopy函数可加载到RAM的不同部分。
    2.是的,在“擦除扇区”功能之前调用一次,并且在调用第一个“擦除扇区”之前检查结果。 它始终在第一次擦除调用时失败。
    3.我用这个代替以前的版本尝试了它,但没有运气(我现在将用memcpy保留它):
    新函数(此时显示两个):
    memcpy (&RamfuncRunStart,&RamfuncLoadStart,(size_t)&RamfuncLoadSize);
    memcpy (&RamfuncsRunStart,&RamfuncsLoadStart,(size_t)&RamfuncsLoadSize);

    4.状态恢复为0xC10... 根据链接,这是"擦除验证失败"。 我不确定这是否有助于确定问题...

    5.结构中的第一个值是0x8.4万,它是C区的起点,这是我尝试擦除的第一个扇区。

    6.根据我的InitFlash功能,这是以下设置:
    Flash0CtrlRegs.FRDCNTL.bit.RWAIT = 0x2;(这也是擦除失败后寄存器读回的内容)。 这看起来适用于120MHz时钟。 虽然此设置似乎已关闭,但它根本不起作用,而不仅仅是在编程后。

    7.我不是因为我没有设置密码。 我将它添加到了我的闪存初始化函数中(使用标准CsmUnlock found sysctrl.c)。 存在相同的行为,闪存检查功能中的状态为0xC10。

    8.我相信这是或我的CAN计时(我发送数据的方式)会关闭,我不会进行通信。

    9.就像我说的那样,我没有对该文件中的任何内容进行调整,但我只是检查了一下,它像以前一样调用了".TI.ramfunc"。

    如果您知道可能存在什么问题,请告诉我。

    谢谢!
    Kyle
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想我会澄清第8点。 我在处理器上安装了20MHz的晶体,并使用以下设置了PLL:
    InitSysPll (XTAL_OSC,IMULT_12,FMULT_0,PLLCLK_BY_2);\\20MHz*12/2=120MHz

    我希望这能有所帮助。

    再次感谢,
    Kyle
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Kyle,

    不确定您为什么会使用两种不同的ramfuns -是否有任何优势? 您可能会分配给两个不同的RAM块-但它有何帮助? 我只是想降低调试的复杂性。

    谢谢,此致,
    Vamsi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    瓦姆西
    我的一些代码使用调用“Ramfuns”的旧方法,而不是在编译器版本6发布后采用的“.TI.ramfuns”。

    为什么需要? 我有其他功能不适合一个RAM块,所以我将它们拆分。 向上。 在其它程序中,某些程序需要在更快的内存中运行(2.8035万具有不同的RAM部分,它们以不同的速度运行)。 如果您担心不会因为这一点,那么我对您的链接器/编译器没有太大的信心,因为它允许任何人将他们想要的任何程序放在他们想要的任何地方。

    我非常怀疑这是导致问题的原因。 但是,我知道您正在寻找任何东西。

    在玩游戏时,我注意到,添加CsmUnlock实际上会导致擦除失败,即使在编程之后也是如此(它以前的工作方式)。 这使我相信错误确实是由处理器锁定内存的这些部分引起的。 这将使调试器解锁内存并允许勘误和写入,然后在重置后将其默认值再次设置为锁定。

    没有意义的是CsmUnlock不起作用的原因:
    #pragma code_section (CsmUnlock,"ramfuncs");
    UINT16 CsmUnlock()

    //
    //使用当前密码加载密钥寄存器。 0xFFFF是虚拟的
    //密码。 用户应使用的正确密码替换它们
    // DSP。
    //

    EALLOW;
    DcsmZ1Regs.Z1_CSMKEY0 = 0xFFFFFFFF;
    DcsmZ1Regs.Z1_CSMKEY1 = 0xFFFFFFFF;
    DcsmZ1Regs.Z1_CSMKEY2 = 0xFFFFFFFF;
    DcsmZ1Regs.Z1_CSMKEY3 = 0xFFFFFFFF;

    DcsmZ2Regs.Z2_CSMKEY0 = 0xFFFFFFFF;
    DcsmZ2Regs.Z2_CSMKEY1 = 0xFFFFFFFF;
    DcsmZ2Regs.Z2_CSMKEY2 = 0xFFFFFFFF;
    DcsmZ2Regs.Z2_CSMKEY3 = 0xFFFFFFFF;
    EDIS;

    返回CSM_SUCCESS;
    }

    我确认调试器设置为虚拟密码,并且处理器已使用UniFlash...解锁

    对于DCSM来说,就示例而言,没有太多的内容。 调用DCSM的示例似乎根本不涉及DCSM。 在我浏览技术数据表的DCSM部分时,我是否错过了一些东西,或者您能否将我指向一个更好的资源。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有关CmsUnlock的更新。 将解锁功能更改为(所有闪存键均设置为0xFFFF):

    #pragma code_section (DcsmZ1Unlock,"ramfuncs");
    void DcsmZ1解锁(void)

    volatile long int *CSM =(volatile long int *) 0x5F010;//CSM寄存器文件
    volatile long int *CSMPWL =(volatile long int *) 0x7.8028万;//CSM密码位置(假定默认区域SEL块)
    易失性int tmp;
    int i;
    //读取CSM密码位置(PWL)的128位
    //
    对于(i=0;i<4;i++) tmp =*CSMPWL++;
    //如果密码位置(CSMPWL)全部= 1 (0xFFff),
    //则区域现在将不安全。 如果密码
    //不是所有的(0xFFFF),则需要以下代码
    //取消CSM的安全。

    //将128位密码写入CSMKEY寄存器
    //如果此密码与中存储的密码匹配
    // CSLPPL则CSM将变得不安全。 如果没有
    //匹配,则区域将保持安全。
    //密码示例为:
    //使用0x11.1122万2233344445555666677778888。22.3334万。</s>44.4555万 56.6667万777.8888万
    *CSM++= FLASH_KEY_0;//在0x5F010处注册Z1_CSMKEY0
    *CSM ++= FLASH_KEY_1;//在0x5F012处注册Z1_CSMKEY1
    *CSM ++= FLASH_KEY_2;//在0x5F014处注册Z1_CSMKEY2
    *CSM ++= FLASH_KEY_3;//在0x5F016处注册Z1_CSMKEY3
    }

    和:
    #pragma code_section (DcsmZ2Unlock,"ramfuncs");
    void DcsmZ2Unlock (void)(作废DcsmZ2解

    volatile long int *CSM =(volatile long int *) 0x5F050;//CSM寄存器文件
    volatile long int *CSMPWL =(volatile long int *) 0x7.8228万;//CSM密码位置(假定默认区域SEL块)
    易失性int tmp;
    int i;
    //读取CSM密码位置(PWL)的128位
    //
    对于(i=0;i<4;i++) tmp =*CSMPWL++;
    //如果密码位置(CSMPWL)全部= 1 (0xFFff),
    //则区域现在将不安全。 如果密码
    //不是所有的(0xFFFF),则需要以下代码
    //取消CSM的安全。

    //将128位密码写入CSMKEY寄存器
    //如果此密码与中存储的密码匹配
    // CSLPPL则CSM将变得不安全。 如果没有
    //匹配,则区域将保持安全。
    //密码示例为:
    //使用0x11.1122万2233344445555666677778888。22.3334万。</s>44.4555万 56.6667万777.8888万
    *CSM++= FLASH_KEY_0;
    *CSM++= FLASH_KEY_1;
    *CSM++= FLASH_KEY_2;
    *CSM++= FLASH_KEY_3;
    }

    我现在可以擦除并再次写入,但在重置后不能。 两种模式之间的注册视图对于DcsmZ1Regs在两种模式之间是相同的... 所以很遗憾,我不认为这是原因。

    我会尝试将所有内容迁移到".TI.Ramfuns",我会让您知道如何迁移。

    谢谢!
    Kyle
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Kyle,

    如果您尚未更改任何安全设置,则CSM解锁不会导致任何问题。 实际上,在这种情况下,您不需要CSM解锁功能。 仅当用户更改了默认密码设置时,才需要CSM解锁。 Vamsi所要求的是安全初始化,需要在重置后完成。 如果使用调试重置,则会通过GEL文件进行处理。 如果重置看门狗,则BootROM会执行相同的操作。 您使用的是哪种重置方法?

    此致,
    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Kyle,

    Vivek将负责处理您的安全问题。

    关于RAM使用情况:我了解到出于速度原因,您正在尝试使用不同的RAM。 但我认为它不适用于F2.8075万 (或F2.8035万 - Vivek可以确认)。 此外,如果给定的RAM块中不适合某些内容,则始终可以将它们放入链接程序命令文件中的单个块中。

    谢谢,此致,
    Vamsi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Vivek,

    我的引导加载程序在第一次运行时工作,因此当调试器重置处理器时,一切都正常。

    我正在使用看门狗通过功能代码重置处理器。  那时我不能再擦除或写入,所以这是BootROM处理它的地方。  这是我需要帮助的地方。  因为它不会在BootROM启动处理器后擦除或写入闪存。  密码从未写过,寄存器显示两个区域都不安全...

    我做错了什么?

    谢谢!

    Kyle

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Kyle,

    在调试重置后,您是否加载任何代码或通过BootROM运行它?
    另外,重置看门狗后,您是否知道您的代码是否按预期执行? 我的意思是,WD重置后,设备是否可以正常启动并跳转到您的引导加载程序?

    此致,

    Vivek Singh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vivek,
    我运行自己的代码。 我自己的引导加载程序。 我不使用,也不会使用TI的BootROM写入闪存(不是选项)。

    是的,我的代码按预期执行。 我有通信(CAN),我可以读/写EEPROM (使用I2C的独立IC)。 我的指示灯正常闪烁。 我为电源设置并运行PWM。 我甚至可以在芯片中的其他位置对功能代码执行校验和,然后跳转到它... 功能代码运行正常。

    重置后唯一不能做的是通过我自己的引导加载程序擦除和写入闪存(从引导加载程序加载后工作正常)。

    我希望这能有所帮助。

    谢谢!
    Kyle
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    各位,
    我让它发挥作用。

    初始化过程中发生了一些奇怪的事情,或者由于某种原因导致初始化中断,必须重新执行。 我不知道是什么或为什么。 但需要在擦除功能之前再次调用它。

    因此,基本上,我通过在我的擦除函数中再次调用Fapi_initializeAPI (尽管它以前已经被调用)来修复它(以前我在擦除中只是使用了setActiveBank)。 我不知道为什么这可以解决问题,但确实可以解决。 作为良好的衡量标准,我还在此处加入了CSMUnlock呼叫,因为我最终需要它。

    我的擦除功能现在基本上如下所示:
    CsmUnlock (已添加)
    EALLOW
    FAPI_initializeAPI (已添加,但以前调用)
    FAPI_setActiveFlashBank
    EDIS

    逐扇区擦除和检查功能。

    另请注意。  在使用示例时。  我发现在重新启动后,我无法在闪存A部分中运行示例,我的也是如此。

    因此,我还阻止了闪存A的使用...  我不知道为什么会出现这种情况,但我不需要这种记忆,所以这不是什么大问题。   

    感谢您的帮助,

    Kyle

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Kyle,

    闪存A已引导至闪存入口点。  这就是当您擦除应用程序时,重新启动后应用程序无法正常工作的原因。

    关于初始化: 当我检查您的代码时,我没有看到对Fapi_setActiveFlashBank(Fapi_FlashBank0)的函数调用,因此早些时候要求您确保它就位。  可能是您在呼叫前没有EALLOW。   

    谢谢,此致,

    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    瓦姆西

    感谢你们的快速响应。  但这最后一个答复是不必要的,使我更加沮丧。  

    您刚才暗示我正在从闪存A中运行程序,然后我擦除了闪存A, 然后想知道为什么我的程序在重新启动后不能运行。   对我来说,这是相当侮辱,我会做一些很愚蠢的事。  此外 ,它还告诉我,你们显然不知道启动加载程序应该如何工作。  

    如果您真的认为引导加载程序会擦除自身,那么您对强大的引导加载程序的理解就会出错。 注意: 程序可以擦除自身,但这种情况非常罕见,因为在现场执行升级非常危险,因为"积木"设备的可能性非常高。  在升级过程中,引导加载程序应该能够从坏负载或断电中恢复。  擦除自身的程序不能执行这些操作,因此不可靠...

    这是在我告诉你,我可以擦除,写入和加载一个程序之后。  我重新启动后,它仍然可以正常工作,但您唯一的API无法再擦除或写入闪存。  我还有通信,我还有PWM功能等...  我在这个主题中多次提到过...   

    对于setActiveFlashBank。  您直接问我是否使用了该工具以及其他一些问题。  大约一个小时后,我回答了代码中的位置,我肯定在使用它,也回答了所有其他问题。  

    那么,您是否还在阅读我的回答?

    最重要的是。  您的API返回"SUCCESS (成功)",如果失败 ,您的API错误消息根本没有帮助。  在这种情况下,API甚至不能告诉我它不再被正确初始化...

    下面是您帮助下一个滞留在此API上的问题的大纲:

    1. 不要使用Flash A,任何其他闪存扇区似乎都正常,但由于某些未知原因,它将无法正常工作,因此只需将其标记为不可用,以便实际使用。

    不要相信我?  请使用示例代码来尝试。  从闪存A (而非D)加载它并添加重新启动...它将停止运行...但它将重新启动并运行程序,只是API将失败。

    2. 擦除功能通常如下所示:

    EALLOW;

    CsmUnlock();// 如果需要

    FAPI_Init函数();

    FAPI_setActiveBank();

    擦除要擦除的扇区...

    EDIS;

    3. 那么您应该可以像示例一样编写。

    我很抱歉这么苛刻,但这让我感到非常沮丧,而您却暗示我不知道我在做什么,从而使我感到非常沮丧。  它表明您真的没有阅读我的回复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Kyle,  

    我很遗憾我的帖子被认为是侮辱性的。  这不是我的意思。  我努力为客户提供尽可能最好的支持。  然而,电子通信有时也有其局限性。  我同意,有时我的问题对于高级用户来说是基本问题。  我的用意只是帮助缩小问题的范围。  

    我想逐一介绍您迄今为止报告的每个项目,以确保我理解并解决您的问题:  

    1) Fapi_issuecebcCommandWithAddress()返回success:    

    此函数发出命令并返回。  它不会等待结果,以便CPU可以继续执行其他相关任务。  有关使用Fapi_getFsmStatus()和Fapi_doBlankCheck()检查擦除状态的信息,请参阅API指南(www.ti.com/.../spnu629)中的3.2 2部分。   

    2) Fapi_initializeAPI()返回成功:   

    此函数初始化API而不是硬件寄存器。  如果此函数的变量所使用的RAM不受保护(如果受保护,则它应属于执行API的内存的同一区域),则此函数将不会无法初始化。   

    3)关于Flash A扇区使用问题:   

    查看您的说明后,我在Flash API示例的链接器命令文件中将Flash D替换为Flash A。  我执行了该示例,然后执行了调试重置/重新启动序列,它工作正常。  我还尝试在调试重新启动后执行电源循环,结果正常。  不确定我是否遗漏了与您的程序匹配的其他内容。  请告诉我,我可以重复此实验。   

    4)引导加载程序:   

    11月27日,您提到您正在执行“逐扇区擦除和检查功能”,这使我认为您可能已经擦除了A扇区。 作为我正常调试过程的一部分,我想确认入口点仍已编程。  如果您的应用程序启动,通信和外围设备正常工作,则我同意不是这样。  

    5)调用 两次Fapi_initializeAPI():  

    这不是必需的。  我理解这似乎可以解决问题,但不应该需要-我认为代码中仍然存在问题。   

    以下是一些调试想法:

    • 应用程序是否可能在第一次调用后覆盖初始化所使用的RAM?  这会破坏以后API调用所需的初始化。
    • 复位前后的代码顺序是否不同?  重置后是否可能未完成闪存API初始化?  
    • 如果更改了系统频率或等待状态,则必须调用此功能(API指南中的3.1 1部分)。  在您的情况下,第一次和第二次调用Fapi_initializeAPI()之间是否有任何变化?   

    11月27日,您说擦除功能最初只有Fapi_setActiveFlashBank()。  我检查了您在11月20日发布的擦除功能和初始化功能。  我在初始化函数中看到了Fapi_initializeAPI(),但 在擦除函数中没有看到Fapi_setActiveFlashBank()。  我想你可能没有注意到erase函数中缺少的Fapi_setActiveFlashBank()。  我认为您可能在调试过程中在擦除函数中添加了Fapi_initializeAPI()和Fapi_setActiveFlashBank()函数以及EALLOW,以获得成功。  但是,您似乎有另一个擦除函数(您将其调用为擦除函数),该函数调用“Flash_Erase_Sector”函数。  我认为Flash_Erase_Sector()是您所引用的erase函数,并根据该假设提供了输入。  如果我遗漏了什么,请告诉我。

    谢谢,此致,

    Vamsi