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.

[参考译文] CCS/TMS320F28377D:在 F28377D 上使用 F021闪存 API 的一个奇怪问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/891196/ccs-tms320f28377d-a-strange-question-using-f021-flash-api-on-f28377d

器件型号:TMS320F28377D
主题中讨论的其他器件:C2000WARE

工具/软件:Code Composer Studio

尊敬的 C2K Champs:

我们面临一个使用 F021闪存 API 的奇怪问题。 器件是 C2000Ware_2_00_00_02的 F28377D 和闪存 API。

首先、电路板硬件没有问题、我们可以运行示例代码。

但是、当我们使用 CCS 软件将闪存 API 添加到 SDS200i 时、我们会面临这个问题。

调用 Fapi_issue19 CommandWithAddress 擦除闪存时、oReturnCheck = Fapi_issue19 CommandWithAddress (Fapi_EraseSector、(UINT32 *) Bzero_SectorM_START);

我们首先对扇区 M 进行编程、然后使用"Flash、oReturnCheck = Fapi_issueCommandWithAddress (Fapi_EraseSector、(UINT32 *) Bzero_SectorM_start)擦除扇区 M;"将报告没有源代码错误或转到下图所示的非法区域。

2、到下一步、它还将报告类似下图的问题。

我在下面提到另一篇文章、但我无法解决

e2e.ti.com/.../552162

请提供意见和建议。

谢谢、此致、

Edward

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

    请参阅以下我的源代码。

    #include "F28x_Project.h"
    #include
    #include "flash_programming_c28.h"//闪存 API 示例头文件
    #include "F021_F2837xD_C28x.h"

    //
    //定义
    //
    #define words _in_flash_buffer 0xFF //用于测试的数据/程序缓冲区
    //闪存 API 函数

    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>=15009000
    #define ramFunc 部分".TI.ramfunc"
    其他
    #define ramFunc 段"ramfuncs "
    #endif
    #endif

    //
    //全局
    //
    #pragma DATA_SECTION (缓冲区、"BufferDataSection");
    uint16 Buffer[words _in_flash_buffer + 1];
    uint32 *缓冲器32 =(uint32 *)缓冲器;

    UINT16状态= 0;

    //
    //函数原型
    //
    void Example_Error (Fapi_StatusType 状态);
    void example_done (void);
    void example_CallFlashAPI (void);

    //
    //主函
    //
    void main (void)

    //
    //步骤1. 初始化系统控制:
    //启用外设时钟
    //此示例函数位于 F2837xD_SYSCTRL.c 文件中。
    //
    InitSysCtrl();

    //
    //解锁 CSM
    //
    //如果 API 函数将在不安全的 RAM 中运行
    //然后 CSM 必须被解锁才能用于闪存
    // API 函数来访问闪存。
    //如果从安全内存执行闪存 API 函数
    //则不需要此步骤。
    //
    //DcsmZ1Unlock();

    //
    //步骤2. 初始化 GPIO:
    //此示例函数位于 F2837xD_GPIO.c 文件和中
    //说明了如何将 GPIO 设置为其默认状态。
    //
    // InitGpio();//针对此示例跳过

    //
    //步骤3. 清除所有中断并初始化 PIE 矢量表:
    //禁用 CPU 中断
    //
    Dint;
    //
    //将 PIE 控制寄存器初始化为默认状态。
    //默认状态为禁用所有 PIE 中断和标志
    //被清除。
    //此函数位于 F2837xD_PIECTRL.c 文件中。
    //
    InitPieCtrl();

    //
    //禁用 CPU 中断并清除所有 CPU 中断标志:
    //
    IER = 0x0000;
    IFR = 0x0000;

    //
    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //这将填充整个表,即使是中断也是如此
    //在本例中未使用。 这对于调试很有用。
    //可以在 DSP2802x_DefaultIsr.c 中找到 shell ISR 例程
    //此函数可在 F2837xD_PieVect.c 中找到
    //
    InitPieVectTable();

    EINT;
    //
    //将时间关键代码和闪存设置代码复制到 RAM
    //这包括 InitFlash()、闪存 API 函数和任何函数
    //分配给 ramfuncs 段。
    // RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsRunStart
    //符号由链接器创建。 请参阅器件.cmd 文件。
    //
    //memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);

    //
    //调用闪存初始化以设置闪存等待状态
    //此函数必须驻留在 RAM 中
    //
    InitFlash();

    //
    //增益泵信标
    //

    //SeizeFlashPump();
    //
    //跳转到 RAM 并调用闪存 API 函数
    //


    Example_CallFlashAPI();

    //
    // Example_CallFlashAPI -此函数将连接到闪存 API。
    //此函数中使用的闪存 API 函数是
    //从 RAM 中执行
    //
    #pragma CODE_SECTION (Example_CallFlashAPI、ramFuncSection);
    空示例_CallFlashAPI (空)

    uint32 u32Index = 0;
    uint16 i = 0;

    Fapi_StatusType oReturnCheck;
    易失性 Fapi_FlashStatusType oFlashStatus;
    Fapi_FlashStatusWordType oFlashStatusWord;

    while (1)

    开关(状态)

    情况0:
    中断;
    情况1://闪存扇区 M 数据写入

    SeizeFlashPump();

    //DINT;
    EALLOW;

    //
    //需要此函数来根据系统初始化闪存 API
    //频率才能执行任何其他闪存 API 操作
    //
    oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);

    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //
    //example_Error (oReturnCheck);

    //
    // Fapi_setActiveFlashBank 函数进一步设置闪存组和 FMC
    //闪存操作将在组上执行
    //
    oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //
    //example_Error (oReturnCheck);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    //
    //擦除扇区 C
    //
    oReturnCheck = Fapi_issueODE19 CommandWithAddress (Fapi_EraseSector、
    (uint32 *) Bzero_SectorM_START);
    //
    //等待 FSM 完成擦除扇区操作
    //
    while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //如果 Erase 命令失败,请使用 Fapi_getFsmStatus()函数获取
    // fmstat 寄存器内容,查看是否有 EV 位、ESUSP 位、
    // Cstat 位或 VOLTSTAT 位被置位(请参阅 API 文档
    //更多详细信息)
    //
    //example_Error (oReturnCheck);

    //
    //读取 fmstat 寄存器内容以了解之后 FSM 的状态
    //用于任何调试的程序命令
    //
    oFlashStatus = fapi_getFsmStatus();
    if (oFlashStatus!=0)

    //example_Error (oReturnCheck);

    //
    //验证 SectorL 是否被擦除。 擦除步骤本身会执行
    //进行验证。 此验证是可以执行的第二次验证。
    //
    oReturnCheck = Fapi_doBlankCheck ((UINT32 *) Bzero_SectorM_START、
    Bzero_16KSector u32length、
    oFlashStatusWord (&O);
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //如果 Erase 命令失败,请使用 Fapi_getFsmStatus()函数获取
    // fmstat 寄存器内容,查看是否有 EV 位、ESUSP 位、
    // Cstat 位或 VOLTSTAT 位被置位(请参阅 API 文档
    //更多详细信息)
    //
    //example_Error (oReturnCheck);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


    for (i=0;i <= word_in_flash_buffer;i++)

    Buffer[i]= i;

    对于(i=0、u32Index = Bzero_SectorM_START;
    (u32Index <(Bzero_SectorM_START + wors_in_flash_buffer))&&
    (oReturnCheck = Fapi_Status_Success);i+= 8、u32Index+= 8)

    oReturnCheck = fapi_issueProgrammingCommand ((UINT32 *) u32Index、Buffer+I、
    8、
    0、
    0、
    Fapi_AutoEccGeneration);
    while (fapi_checkFsmForReady ()=fapi_Status_FsmBusy);
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //
    //example_Error (oReturnCheck);

    //
    //读取 fmstat 寄存器内容以了解之后 FSM 的状态
    //用于任何调试的程序命令
    //
    oFlashStatus = fapi_getFsmStatus();
    if (oFlashStatus!= 0)

    //Check FMSTAT 并进行相应的调试
    //example_Error (oReturnCheck);

    //
    //验证编程的值。 Program 步骤本身会进行验证
    //进行。 此验证是可以执行的第二次验证。
    //
    oReturnCheck = fapi_doVerify (((uint32 *) u32Index、
    4、Buffer32+(I/2)、
    oFlashStatusWord (&O);
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //
    //example_Error (oReturnCheck);

    //
    //启用 ECC
    //
    Flash0EccRegs.ecc_enable.bit.enable = 0xA;

    EDIS;//保护设置

    //
    //保持对闪存泵的控制
    //
    ReleaseFlashPump();

    //EDIS;
    //EINT;
    状态= 0;
    中断;
    案例2://闪存扇区 M 擦除

    SeizeFlashPump();

    Flash0EccRegs.ecc_enable.bit.enable = 0x0;
    _asm (" RPT #7 || NOP");

    //DINT;
    EALLOW;//保护清零

    ////
    /////此函数是基于系统初始化闪存 API 所必需的
    ////频率,然后才能执行任何其他闪存 API 操作
    ////
    // oReturnCheck = fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);
    // if (oReturnCheck!= Fapi_Status_Success)
    //{
    ////
    ////检查闪存 API 文档以了解可能的错误
    ////
    ////Example_Error (oReturnCheck);
    //}
    //
    ////
    //// fapi_setActiveFlashBank 函数进一步设置闪存组和 FMC
    ////闪存操作将在组上执行
    ////
    // oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
    // if (oReturnCheck!= Fapi_Status_Success)
    //{
    ////
    ////检查闪存 API 文档以了解可能的错误
    ////
    ////Example_Error (oReturnCheck);
    //}

    //
    //擦除扇区 C
    //
    oReturnCheck = Fapi_issueODE19 CommandWithAddress (Fapi_EraseSector、
    (uint32 *) Bzero_SectorM_START);
    //
    //等待 FSM 完成擦除扇区操作
    //
    while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //如果 Erase 命令失败,请使用 Fapi_getFsmStatus()函数获取
    // fmstat 寄存器内容,查看是否有 EV 位、ESUSP 位、
    // Cstat 位或 VOLTSTAT 位被置位(请参阅 API 文档
    //更多详细信息)
    //
    //example_Error (oReturnCheck);

    //
    //读取 fmstat 寄存器内容以了解之后 FSM 的状态
    //用于任何调试的程序命令
    //
    oFlashStatus = fapi_getFsmStatus();
    if (oFlashStatus!=0)

    //example_Error (oReturnCheck);

    //
    //验证 SectorL 是否被擦除。 擦除步骤本身会执行
    //进行验证。 此验证是可以执行的第二次验证。
    //
    oReturnCheck = Fapi_doBlankCheck ((UINT32 *) Bzero_SectorM_START、
    Bzero_16KSector u32length、
    oFlashStatusWord (&O);
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //如果 Erase 命令失败,请使用 Fapi_getFsmStatus()函数获取
    // fmstat 寄存器内容,查看是否有 EV 位、ESUSP 位、
    // Cstat 位或 VOLTSTAT 位被置位(请参阅 API 文档
    //更多详细信息)
    //
    //example_Error (oReturnCheck);

    //
    //启用 ECC
    //
    Flash0EccRegs.ecc_enable.bit.enable = 0xA;
    _asm (" RPT #7 || NOP");

    EDIS;//保护设置

    //
    //保持对闪存泵的控制
    //
    ReleaseFlashPump();

    //EDIS;
    //EINT;
    状态= 0;
    中断;
    情况3://闪存0xFFFF 虚拟数据写入

    SeizeFlashPump();

    //DINT;
    EALLOW;

    //
    //需要此函数来根据系统初始化闪存 API
    //频率才能执行任何其他闪存 API 操作
    //
    oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);

    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //
    Example_Error (oReturnCheck);

    //
    // Fapi_setActiveFlashBank 函数进一步设置闪存组和 FMC
    //闪存操作将在组上执行
    //
    oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //
    Example_Error (oReturnCheck);

    for (i=0;i <= word_in_flash_buffer;i++)

    Buffer[i]= i+2;

    对于(i=0、u32Index = Bzero_SectorM_START;
    (u32Index <(Bzero_SectorM_START + wors_in_flash_buffer))&&
    (oReturnCheck = Fapi_Status_Success);i+= 8、u32Index+= 8)

    oReturnCheck = fapi_issueProgrammingCommand ((UINT32 *) u32Index、Buffer+I、
    8、
    0、
    0、
    Fapi_AutoEccGeneration);
    while (fapi_checkFsmForReady ()=fapi_Status_FsmBusy);
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //

    //
    //读取 fmstat 寄存器内容以了解之后 FSM 的状态
    //用于任何调试的程序命令
    //
    oFlashStatus = fapi_getFsmStatus();
    if (oFlashStatus!= 0)

    //Check FMSTAT 并进行相应的调试
    Example_Error (oReturnCheck);

    //
    //验证编程的值。 Program 步骤本身会进行验证
    //进行。 此验证是可以执行的第二次验证。
    //
    oReturnCheck = fapi_doVerify (((uint32 *) u32Index、
    4、Buffer32+(I/2)、
    oFlashStatusWord (&O);
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //
    Example_Error (oReturnCheck);

    //
    //启用 ECC
    //
    Flash0EccRegs.ecc_enable.bit.enable = 0xA;

    EDIS;//保护设置

    //
    //保持对闪存泵的控制
    //
    ReleaseFlashPump();

    //EDIS;
    //EINT;
    状态= 0;
    中断;
    默认值:
    中断;


    //
    // Example_Error -对于此示例,如果发现错误,请在此处停止
    //
    #pragma CODE_SECTION (Example_Error、ramFuncSection);
    空示例错误(Fapi_StatusType 状态)

    //
    //错误代码将位于 status 参数中
    //
    //_asm (" ESTOP0");

    //
    // example_done -对于此示例,完成后,只需在此处停止即可
    //
    #pragma CODE_SECTION (example_done、ramFuncSection);
    void example_done (void)(空)

    //_asm (" ESTOP0");

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

    我设置 flash.cmd 文件。
    如下所示:
    部分

    .text:> FLASH、page = 0、align (4)
    .cinit:> FLASH,page = 0,align (4)
    .const:> FLASH、PAGE = 0、ALIGN (4)
    .econst:> FLASH、PAGE = 0、ALIGN (4)
    .pinit:> FLASH、PAGE = 0、ALIGN (4)
    .switch:> FLASH、PAGE = 0、ALIGN (4)

    但我无法解决它。

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

    爱德华

    看起来您是从闪存执行闪存 API 函数。  对吧?

    如果您看一下闪存 API 使用示例(C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\dual\flash_programming\cpu01\flash_programming_cpu1_flash.cmd)使用的链接器命令文件、您将注意到闪存 API 库和 ramfuncs (或.TI.ramfunc)被组合在一起并运行一个指定的闪存地址和一个闪存加载 RAM。

    您能否尝试一下、并告诉我这是否可以解决您的问题?

    谢谢、此致、
    Vamsi

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

    爱德华

    如 表4-13中所述。 TRM 的 CPU1的等待点地址(http://www.ti.com/lit/ug/spruhm8h/spruhm8h.pdf)、您的应用程序将以 ITRAP ISR 结束。   

    如前所述、请为 ramfuncs 和 Flash API 库分配一个闪存加载地址和 RAM 运行地址。  并在执行任何闪存 API 函数或 ramfuncs 代码之前调用 memcpy()函数。

    谢谢、此致、

    Vamsi

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

    尊敬的 Vamsi

    非常感谢您的回复
    如上代码所示、我使用了 memcpy 函数。
    如下所示:
    #pragma CODE_SECTION (Example_CallFlashAPI、ramFuncSection);
    空示例_CallFlashAPI (空)

    上部代码基于闪存 API 使用示例(C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\dual\flash_programming\cpu01\flash_programming_cpu1_flash.cmd)。

    谢谢、此致、

    Edward

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

    爱德华

    我看到 memcpy()在您的代码中被注释掉。  请检查。

    此外、请仔细查看链接器 cmd 文件。  闪存 API 库应具有加载闪存地址和 RAM 运行地址;我在链接器 cmd 文件中看不到这一点。

    谢谢、此致、

    Vamsi

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

    尊敬的 Vamsi

    感谢您的回复

    我正在检查您的评论。

    我附加了以下 cmd 文件。

    //如果使用、用户必须在项目链接器设置中定义 CLA_C
    // CLA C 编译器
    //项目属性-> C2000链接器->高级选项->命令文件
    //预处理->--define
    #ifdef CLA_C
    //为将要使用的 CLA 暂存区定义大小
    //由 CLA 编译器生成局部符号和 temps
    //还强制引用标记的特殊符号
    //暂存区是。
    CLA_ScratchPad_size = 0x100;
    --undef_sym=__cla_scratchpad_end
    --undef_sym=__cla_scratchpad_start
    #endif //cla_C
    存储器

    第0页:/*程序内存*/
    /*内存(RAM/FLASH)块可移动到 Page1进行数据分配*/
    /* begin 用于"引导至闪存"引导加载程序模式*/

    开始:origin = 0x080000,length = 0x000002
    RAMM0:origin = 0x000122、length = 0x0002DE
    RAMD0:origin = 0x00B000、length = 0x000800
    RAMLS2:origin = 0x009000,length = 0x000800
    RAMLS3:origin = 0x009800,length = 0x000800
    复位:origin = 0x3FFFC0,length = 0x000002

    RAMGS01:origin = 0x00C000,length = 0x002000
    // RAMGS0:origin = 0x00C000,length = 0x001000
    // RAMGS1:origin = 0x00D000,length = 0x001000

    RAMGS23:origin = 0x00E000,length = 0x002000
    // RAMGS2:origin = 0x00E000,length = 0x001000
    // RAMGS3:origin = 0x00F000,length = 0x001000

    /*闪存扇区*/
    FLASHA:origin = 0x080002,length = 0x001FFE /*片上闪存*/
    FLASHB:origin = 0x082000、length = 0x002000 //片上闪存*
    FLASHC:origin = 0x084000,length = 0x002000 //片上闪存*/
    FLASHD:origin = 0x086000、length = 0x002000 //片上闪存*/
    FLASHE:origin = 0x088000、length = 0x008000 //片上闪存*/
    FLASHF:origin = 0x090000,length = 0x008000 //片上闪存*
    FLASHG:origin = 0x098000、length = 0x008000 //片上闪存*/
    FLASHH:origin = 0x0A0000,length = 0x008000 //片上闪存*/
    FLASHI:origin = 0x0A8000、length = 0x008000 //片上闪存*/
    FLASHJ:origin = 0x0B0000,length = 0x008000 //片上闪存*/
    FLASHK:origin = 0x0B8000、length = 0x002000 //片上闪存*/
    FLASHL:origin = 0x0BA000、length = 0x002000 //片上闪存*/
    FLASHM:origin = 0x0BC000、length = 0x002000 //片上闪存*/
    FLASHN:origin = 0x0BE000、length = 0x002000 //片上闪存*/

    第1页:/*数据存储器*/
    /*内存(RAM/FLASH)块可移动到 PAGE0进行程序分配*/

    BOOT_RSVD:origin = 0x000002,length = 0x000120 // M0的一部分,引导 ROM 将此用于栈*/
    RAMM1:origin = 0x000400、length = 0x000400 //片上 RAM 块 M1 *
    RAMD1:origin = 0x00B800,length = 0x000800

    RAMLS0123:origin = 0x008000、length = 0x002000
    // RAMLS0:origin = 0x008000,length = 0x000800
    // RAMLS1:origin = 0x008800,length = 0x000800
    // RAMLS2:origin = 0x009000,length = 0x000800
    // RAMLS3:origin = 0x009800,length = 0x000800

    RAMLS4:origin = 0x00A000,length = 0x000800
    RAMLS5:origin = 0x00A800,length = 0x000800

    RAMGS4567891011:origin = 0x010000,length = 0x008000
    // RAMGS4:origin = 0x010000,length = 0x001000
    // RAMGS5:origin = 0x011000,length = 0x001000
    // RAMGS6:origin = 0x012000,length = 0x001000
    // RAMGS7:origin = 0x013000,length = 0x001000
    // RAMGS8:origin = 0x014000,length = 0x001000
    // RAMGS9:origin = 0x015000,length = 0x001000
    // RAMGS10:origin = 0x016000,length = 0x001000
    // RAMGS11:origin = 0x017000,length = 0x001000
    RAMGS12131415:origin = 0x018000,length = 0x004000 //*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
    // RAMGS12:origin = 0x018000,length = 0x001000 //*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
    // RAMGS13:origin = 0x019000,length = 0x001000 //*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
    // RAMGS14:origin = 0x01A000,length = 0x001000 //*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
    // RAMGS15:origin = 0x01B000,length = 0x001000 //*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *

    // EMIF1_CS0n:origin = 0x8000000,length = 0x10000000
    EMIF1_CS2n:origin = 0x00100000,length = 0x00200000
    EMIF1_CS3n:origin = 0x00300000,length = 0x00080000
    EMIF1_CS4n:origin = 0x00380000,length = 0x00060000
    EMIF2_CS0n:origin = 0x90000000,length = 0x10000000
    EMIF2_CS2n:origin = 0x00002000,length = 0x00001000

    CLA1_MSGRAMLOW:origin = 0x001480,length = 0x000080
    CLA1_MSGRAMHIGH:origin = 0x001500,length = 0x000080

    CPU2TOCPU1RAM:origin = 0x03F800,length = 0x000400
    CPU1TOCPU2RAM:origin = 0x03FC00,length = 0x000400

    upp_MSGRAMTX:origin = 0x006C00,length = 0x000100
    upp_MSGRAMRX:origin = 0x006E00,length = 0x000100
    SDRAM:origin = 0x80000000,length = 0x10000000 //* 512Kx16 SDRAM */

    部分

    /*分配计划领域:*/
    .cinit:> FLASHB,PAGE = 0,ALIGN (4)
    .pinit:> FLASHB,PAGE = 0,ALIGN (4)
    .text:>> FLASHB | FLASHC | FLASHD | FLASHE,PAGE = 0,ALIG(4)
    codestart:> begin,page = 0,align (4)

    /*分配未初始化的数据段:*/
    .stack:>RAMM1,PAGE = 1.
    CPU1
    //.ebss:>> RAMGS0 | RAMGS1 | RAMGS2 | RAMGS3,PAGE = 1.
    .ebss:> RAMLS0123,PAGE = 1
    //.ebss:> RAMGS01,page = 1.
    filter_RegsFile:>RAMLS0123,page = 1.
    // Filter_RegsFile:> RAMGS01,page = 1.
    #endif

    CPU2
    .ebss:> RAMLS0123,PAGE = 1
    //.ebss:> RAMGS01,page = 1.
    filter_RegsFile:>RAMLS0123,page = 1.
    // Filter_RegsFile:> RAMGS01,page = 1.
    #endif
    .esysmem:>RAMD1,page = 1.
    .cio:>RAMD1,page = 1.

    /*初始化段进入闪存*/
    .econst:>> FLASHF | FLASHG | FLASHH、PAGE = 0、ALIGN (4)
    .switch:> FLASHB,PAGE = 0,ALIGN (4)

    .reset:> reset,page = 0,type = DSECT //未使用,*/
    .farbss:> SDRAM,页= 1


    SHARERAMGS4:> RAMGS4567891011,PAGE = 1
    SHARERAMGS15:> RAMGS12131415,PAGE = 1
    // EXDRAM:> SDRAM,PAGE = 1.
    // SHARERAMGS0:> RAMGS0,PAGE = 1
    // SHARERAMGS1:>RAMGS1,PAGE = 1.
    // SHARERAMGS2:>RAMGS2,PAGE = 1.
    // SHARERAMGS3:>RAMGS3,PAGE = 1.
    // SHARERAMGS4:> RAMGS4,PAGE = 1
    // SHARERAMGS5:> RAMGS5,PAGE = 1
    // SHARERAMGS5:> RAMGS5,PAGE = 1
    // SHARERAMGS6:> RAMGS6,PAGE = 1
    // SHARERAMGS7:> RAMGS7,PAGE = 1
    // SHARERAMGS8:> RAMGS8,PAGE = 1
    // SHARERAMGS9:> RAMGS9,PAGE = 1
    // SHARERAMGS10:> RAMGS10,PAGE = 1

    // SHARERAMGS11:> RAMGS11,PAGE = 1
    // SHARERAMGS12:> RAMGS12,PAGE = 1/*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
    // SHARERAMGS13:> RAMGS13,PAGE = 1/*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
    // SHARERAMGS14:> RAMGS14,PAGE = 1/*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
    // SHARERAMGS15:> RAMGS15,PAGE = 1 //仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 *
    CPU1
    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>=15009000
    .TI.ramfunc:{}负载= FLASHD | FLASHE、
    运行= RAMGS01、
    //수정포인트= RAMLS0 | RAMLS1 | RAMGS14 | RAMGS15、//μ s
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0、ALIGN (4)
    其他
    ramfuncs:load = FLASHD | FLASHE,
    运行= RAMGS01、
    //수정포인트= RAMLS0 | RAMLS1 | RAMGS14 | RAMGS15、//μ s
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0、ALIGN (4)
    #endif
    #endif
    #endif //end #ifdef CPU1

    CPU2
    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>=15009000
    .TI.ramfunc:{}负载= FLASHD | FLASHE、
    运行= RAMGS23、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0、ALIGN (4)
    其他
    ramfuncs:load = FLASHD | FLASHE,
    运行= RAMGS23、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0、ALIGN (4)
    #endif
    #endif
    #endif //结束#ifdef CPU2


    /* CLA 特定部分*/
    Cla1Prog:load = FLASHD、//수정포인트
    수정포인트= RAMLS2 | RAMLS3、//μ s
    load_start (_Cla1funcsLoadStart)、
    load_end (_Cla1funcsLoadEnd)、
    run_start (_Cla1funcsRunStart)、
    load_size (_Cla1funcsLoadSize)、
    PAGE = 0、ALIGN (4)


    CLADataLS4:> RAMLS4,PAGE = 1//μ 수정포인트
    CLADataLS5:> RAMLS5,page = 1//수정포인트 μ s
    Cla1ToCpuMsgRAM:> CLA1_MSGRAMLOW,page = 1.
    CpuToCla1MsgRAM:>CLA1_MSGRAMHIGH,PAGE = 1.

    #ifdef CLA_C
    /* CLA C 编译器段*/
    //
    //必须被分配给 CLA 具有写入访问权限的内存
    //
    CLAscratch:
    {*。obj (CLAscratch)
    。 += CLA_ScratchPad_size;
    *。obj (CLAscratch_end)}> RAMLS5、page = 1

    暂存区:>RAMLS5,PAGE = 1.
    .bss_cla:> RAMLS5,page = 1.
    const_cla:load = FLASHD,
    运行= RAMLS5、
    run_start (_Cla1ConstRunStart)、
    Load_start (_Cla1ConstLoadStart)、
    load_size (_Cla1ConstLoadSize)、
    PAGE = 1.
    #endif //cla_C


    CPU1
    /*使用 IPC API 驱动程序时需要以下部分定义*/
    组:> CPU1TOCPU2RAM,PAGE = 1

    PUTBUFFER
    PUTWRITEIDX
    GETREADIDX

    组:> CPU2TOCPU1RAM,PAGE = 1

    GETBUFFER:TYPE = DSECT
    GETWRITEIDX:TYPE = DSECT
    PUTREADIDX:TYPE = DSECT

    #endif

    CPU2
    /*使用 IPC API 驱动程序时需要以下部分定义*/
    组:> CPU2TOCPU1RAM,PAGE = 1

    PUTBUFFER
    PUTWRITEIDX
    GETREADIDX

    组:> CPU1TOCPU2RAM,PAGE = 1

    GETBUFFER:TYPE = DSECT
    GETWRITEIDX:TYPE = DSECT
    PUTREADIDX:TYPE = DSECT

    #endif
    /*以下部分定义适用于 SDFM 示例*/
    // Filter1_RegsFile:> RAMGS1,PAGE = 1,fill=0x1111
    // Filter2_RegsFile:> RAMGS2,PAGE = 1,fill=0x2222
    // Filter3_RegsFile:> RAMGS3,page = 1,fill=0x3333
    // Filter4_RegsFile:> RAMGS4,page = 1,fill=0x4444
    // Differit_RegsFile:>RAMGS5,page = 1,fill=0x3333

    /*
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //文件结束。
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *

    谢谢、此致、

    Edward

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

    尊敬的 Vamsi

    我修改了我的闪存代码以进行注释。
    请检查以下代码。
    1.将每个函数(FLASH_WRITE、FLASH_READ、FLASH_ERASE)添加到 RAM 中
    2.当我检查执行时、它仍然会弹出断点。
    3.有时它会执行复位。 执行 FLASH_ERASE 时。

    //主代码

    void main (void)

    //
    //初始化设备时钟和外设
    //
    device_init();
    InitFlash();
    //SeizeFlashPump();
    DSP_EmifInit();

    USB_GPIOEnable();
    //
    // GPIO35是 LED 引脚。
    //
    GPIO_setPinConfig (GPIO_35_GPIO35);
    GPIO_setDirectionMode (35、GPIO_DIR_MODE_OUT);

    //
    // GPIO9是 SCI Rx 引脚。
    //
    GPIO_setMasterCore (9、GPIO_CORE_CPU2);
    GPIO_setPinConfig (GPIO_9_SCIRXDA);
    GPIO_setDirectionMode (9、GPIO_DIR_MODE_IN);
    GPIO_setPadConfig (9、GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode (9、GPIO_QUAL_异 步);

    //
    // GPIO8是 SCI Tx 引脚。
    //
    GPIO_setMasterCore (8、GPIO_CORE_CPU2);
    GPIO_setPinConfig (GPIO_8_SCITXDA);
    GPIO_setDirectionMode (8、GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig (8、GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode (8、GPIO_QUAL_异 步);
    #ifdef CPU1_DEBUG
    DSP_SCIA_Init();

    MSG ="hello\r\n";
    DSP_SCIA_Write (msg、7);
    #endif
    // ConfigureUART();// UART a debug init
    // UARTprintf ("\n\nHello world!\n");

    //
    // GPIO14是 W5300 /Reset 引脚。
    //
    GPIO_setPinConfig (GPIO_14_GPIO14);
    GPIO_setDirectionMode (14、GPIO_DIR_MODE_OUT);

    //GpioDataRegs.GPASET.bit.GPIO14=1;
    //GpioDataRegs.GPACLEAR.bit.GPIO14=1;

    SYSCTL_selectCPUForPeripheral (SYSCTL_CPUSEL5_SCI、1、SYSCTL_CPUSEL_CPU1);

    DSP_TimerInit();

    EtherNet_Init();
    //communication_init();

    ftpd_init (gWIZNETINFO.IP);

    #ifdef _debug
    #endif
    Dint;
    //
    //初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
    //
    interrupt_initModule();
    //
    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //
    IER = 0x0000;
    IFR = 0x0000;
    interrupt_initVectorTable();

    //
    // ISR
    //
    INTERRUPT_REGTER (INT_TIMER0、&DSP_Timer0_ISR);
    中断寄存器(INT_Timer1、&DSP_Timer1_ISR);
    INTERRUPT_REGTER (INT_TIMER2、&DSP_Timer2_ISR);
    #ifdef CPU1_DEBUG
    INTERRUPT_REGTER (INT_SCIA_RX、&DSP_SCIA_RX_ISR);
    INTERRUPT_REGTER (INT_SCIA_TX、&DSP_SCIA_TX_ISR);
    #endif
    USB_IntRegister ();
    //
    //为了确保精确的时序,请使用只写指令来写入
    //整个寄存器。 因此、如果任何配置位发生更改
    //在 configCPUTimer 和 initCPUTimers 中,还必须进行以下设置
    //更新。
    //
    CPUTimer_enableInterrupt (CPUTIMER0_BASE);
    CPUTimer_enableInterrupt (CPUTIMEer1_base);
    CPUTimer_enableInterrupt (CPUTIMEer2_base);

    //
    //启用连接到 CPU 定时器0的 CPU INT1、INT13和 INT14,
    //分别为 CPU 定时器1和 CPU 定时器2。
    //在 PIE 中启用 TINT0:组1中断7
    //
    INTERRUPT_ENABLE (INT_TIMER0);
    INTERRUPT_ENABLE (INT_Timer1);
    INTERRUPT_ENABLE (INT_TIMER2);
    #ifdef CPU1_DEBUG
    INTERRUPT_ENABLE (INT_SCIA_RX);
    INTERRUPT_ENABLE (INT_SCIA_TX);
    #endif
    USB_IntMasterEnable();
    // EINT;//启用全局中断 INTM
    // ERTM;//启用全局实时中断 DBGM
    // usb_host_msc ();

    //
    //启用全局中断(INTM)和实时中断(DBGM)
    //
    while (SDRAM_Init());

    #ifdef _standalone
    IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH);
    #endif
    EINT;//启用全局中断 INTM
    ERTM;//启用全局实时中断 DBGM
    //
    //启动 CPU 定时器0、CPU 定时器1和 CPU 定时器2。
    //
    CPUTimer_startTimer (CPUTIMER0_BASE);
    CPUTimer_startTimer (CPUTIMEer1_base);
    CPUTimer_startTimer (CPUTIMEer2_base);

    usb_host_msc ();

    #if 1.
    while (1){
    //ReadLine2();
    if (SCIARxBuff_CPU1[0]= 0x0061)// a

    flash_write();
    ///FLASH_STstate = 1;
    //g_con_FLAG = 1;

    否则、如果(SCIARxBuff_CPU1[0]= 0x0062)// b

    FLASH_READ (缓冲器322);
    ///FLASH_STstate = 2;
    //g_con_FLAG = 2;

    否则、如果(SCIARxBuff_CPU1[0]= 0x0063)// c

    FLASH_ERASE ();
    ///FLASH_STstate = 3;
    //g_con_FLAG = 3;

    否则、如果(SCIARxBuff_CPU1[0]= 0x0064)// d

    SCIARxBuff_CPU1[0]= 0x0065;
    DSP_SCIA_Write (缓冲器322、0xFF);
    //g_con_FLAG = 4;

    否则、如果(SCIARxBuff_CPU1[0]= 0x0065)// e

    //SCIARxBuff_CPU1[0]= 0x0066;
    //DSP_SCIA_Write (缓冲器322、0xFF);
    //DSP_SCIA_Write ((UINT16*) rtext、15);

    //do udp_config (4);//配置套接字4
    //ftpd_run (test_buf1);//套接字2、3
    // loopback _UDPS (0、test_BUF1、1000);
    // loopback_TCPS (7、test_buf1、1000);
    // loopback_tcpC (4、test_buf5、destip1、5000);

    ----------------------------------------

    //闪存写入

    #pragma CODE_SECTION (Flash_write、ramFuncSection);
    void Flash_write (void)

    uint32 u32Index = 0;
    uint16 i = 0;

    Fapi_StatusType oReturnCheck;
    易失性 Fapi_FlashStatusType oFlashStatus;
    Fapi_FlashStatusWordType oFlashStatusWord;

    SeizeFlashPump();

    //DINT;
    EALLOW;

    //
    //需要此函数来根据系统初始化闪存 API
    //频率才能执行任何其他闪存 API 操作
    //
    oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);

    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //
    //Flash_Error (oReturnCheck);

    //
    // Fapi_setActiveFlashBank 函数进一步设置闪存组和 FMC
    //闪存操作将在组上执行
    //
    oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //
    //Flash_Error (oReturnCheck);

    for (i=0;i <= word_in_flash_buffer;i++)

    Buffer[i]= i;

    对于(i=0、u32Index = Bzero_SectorM_START;
    (u32Index <(Bzero_SectorM_START + wors_in_flash_buffer))&&
    (oReturnCheck = Fapi_Status_Success);i+= 8、u32Index+= 8)

    oReturnCheck = fapi_issueProgrammingCommand ((UINT32 *) u32Index、Buffer+I、
    8、
    0、
    0、
    Fapi_AutoEccGeneration);
    while (fapi_checkFsmForReady ()=fapi_Status_FsmBusy);
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //
    //Flash_Error (oReturnCheck);

    //
    //读取 fmstat 寄存器内容以了解之后 FSM 的状态
    //用于任何调试的程序命令
    //
    oFlashStatus = fapi_getFsmStatus();
    if (oFlashStatus!= 0)

    //Check FMSTAT 并进行相应的调试
    //Flash_Error (oReturnCheck);

    //
    //验证编程的值。 Program 步骤本身会进行验证
    //进行。 此验证是可以执行的第二次验证。
    //
    oReturnCheck = fapi_doVerify (((uint32 *) u32Index、
    4、Buffer32+(I/2)、
    oFlashStatusWord (&O);
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //
    //Flash_Error (oReturnCheck);

    //
    //启用 ECC
    //
    Flash0EccRegs.ecc_enable.bit.enable = 0xA;

    EDIS;//保护设置

    //
    //保持对闪存泵的控制
    //
    ReleaseFlashPump();

    //闪存擦除

    #pragma CODE_SECTION (Flash_erase、ramFuncSection);
    空 Flash_erase (空)

    uint32 u32Index = 0;
    uint16 i = 0;

    Fapi_StatusType oReturnCheck;
    易失性 Fapi_FlashStatusType oFlashStatus;
    Fapi_FlashStatusWordType oFlashStatusWord;

    SeizeFlashPump();

    //Flash0EccRegs.ecc_enable.bit.enable = 0x0;

    //DINT;
    EALLOW;//保护清零

    //
    //需要此函数来根据系统初始化闪存 API
    //频率才能执行任何其他闪存 API 操作
    //
    oReturnCheck = Fapi_initializeAPI (F021_CPU0_BASE_ADDRESS、200);
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //
    //Flash_Error (oReturnCheck);

    //
    // Fapi_setActiveFlashBank 函数进一步设置闪存组和 FMC
    //闪存操作将在组上执行
    //
    oReturnCheck = Fapi_setActiveFlashBank (Fapi_FlashBank0);
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //
    //Flash_Error (oReturnCheck);

    //
    //擦除扇区 C
    //
    oReturnCheck = Fapi_issueODE19 CommandWithAddress (Fapi_EraseSector、
    (uint32 *) Bzero_SectorM_START);
    //
    //等待 FSM 完成擦除扇区操作
    //
    while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //如果 Erase 命令失败,请使用 Fapi_getFsmStatus()函数获取
    // fmstat 寄存器内容,查看是否有 EV 位、ESUSP 位、
    // Cstat 位或 VOLTSTAT 位被置位(请参阅 API 文档
    //更多详细信息)
    //
    //Flash_Error (oReturnCheck);

    //
    //读取 fmstat 寄存器内容以了解之后 FSM 的状态
    //用于任何调试的程序命令
    //
    oFlashStatus = fapi_getFsmStatus();
    if (oFlashStatus!=0)

    //Flash_Error (oReturnCheck);

    //
    //验证 SectorL 是否被擦除。 擦除步骤本身会执行
    //进行验证。 此验证是可以执行的第二次验证。
    //
    oReturnCheck = Fapi_doBlankCheck ((UINT32 *) Bzero_SectorM_START、
    Bzero_16KSector u32length、
    oFlashStatusWord (&O);
    while (fapi_checkFsmForReady()!= fapi_Status_FsmReady){}
    if (oReturnCheck!= Fapi_Status_Success)

    Flash_Error (oReturnCheck);

    //
    //启用 ECC
    //
    //Flash0EccRegs.ecc_enable.bit.enable = 0xA;

    EDIS;//保护设置

    //
    //保持对闪存泵的控制
    //
    ReleaseFlashPump();

    //EDIS;
    //EINT;

    //闪存读取

    #pragma CODE_SECTION (Flash_Read、ramFuncSection);
    空 Flash_Read (UINT32 *缓冲器321)

    uint32 u32Index = 0;
    uint16 i = 0;

    Fapi_StatusType oReturnCheck;
    易失性 Fapi_FlashStatusType oFlashStatus;
    Fapi_FlashStatusWordType oFlashStatusWord;

    //SeizeFlashPump();

    //DINT;
    EALLOW;

    #if 0
    对于(i=0、u32Index = Bzero_SectorM_START;
    (u32Index <(Bzero_SectorM_START + wors_in_flash_buffer))&&
    (oReturnCheck = Fapi_Status_Success);i++、u32Index++)

    oReturnCheck = fapi_doinMargad ((uint32 *) u32Index、Buffer321+I、1、Fapi_normalRead);

    其他
    oReturnCheck = fapi_doinMargad (((uint32 *) Bzero_SectorM_START、Buffer321、wors_in_flash_buffer、fapi_normalRead);
    if (oReturnCheck!= Fapi_Status_Success)

    //
    //检查闪存 API 文档以了解可能的错误
    //
    Flash_Error (oReturnCheck);

    oFlashStatus = fapi_getFsmStatus();
    if (oFlashStatus!= 0)

    //Check FMSTAT 并进行相应的调试
    Flash_Error (oReturnCheck);

    #endif
    //
    //启用 ECC
    //
    //Flash0EccRegs.ecc_enable.bit.enable = 0xA;

    EDIS;//保护设置

    //
    //保持对闪存泵的控制
    //
    //ReleaseFlashPump();

    //EDIS;
    //EINT;

    //
    // Flash_Error -对于此示例,如果发现错误,请在此处停止
    //
    #pragma CODE_SECTION (Flash_Error、ramFuncSection);
    空 Flash_Error (Fapi_StatusType 状态)

    //
    //错误代码将位于 status 参数中
    //
    //_asm (" ESTOP0");

    //
    // Flash_done -对于此示例、完成后、只需在此处停止
    //
    #pragma CODE_SECTION (Flash_DONE、ramFuncSection);
    空 Flash_Done (空)

    //_asm (" ESTOP0");

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

    爱德华

    在链接器 cmd 文件中、我看不到闪存 API 库映射到闪存进行加载、而映射到 RAM 进行运行。  

    请浏览我之前建议的链接器 cmd 文件并更正您的链接器 cmd。

    此外、请勿复制帖子正文中的所有代码和链接器 cmd。 请附上这些文档。  我没有查看您的代码。

    谢谢、此致、
    Vamsi

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

    尊敬的 Vamsi

    好的。 我正在尝试您的建议。

    我附加了 cmd 文件。 请确认参考文件。

    如何将闪存 API 库映射到闪存和 RAM?  请告诉我一些建议。

    e2e.ti.com/.../28377D_5F00_FLASH.zip

    谢谢、此致、
    Edward

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

    爱德华

    如果查看闪存 API 使用示例 (C2000Ware_x_xx_xx_xx\device_support\f2837xd\examples\dual\flash_programming\cpu01\flash_programming_cpu1_flash.cmd)使用的链接器命令文件、您将看到  F021_API_F2837xD_FPU32.lib  已映射、 用于加载 FLAS03和 FLASHD。  请参见下面的。  我在您共享的链接器 cmd 文件中看不到这一点。     

    #ifdef __TI_Compiler_version__
    #if __TI_Compiler_version__>=15009000


    .TI.ramfunc
    {-l F021_API_F2837xD_FPU32.lib

    }负载= FLASHD,
    运行= RAMLS03
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0
    其他


    ramfuncs
    {-l F021_API_F2837xD_FPU32.lib}

    }负载= FLASHD,
    运行= RAMLS03、
    load_start (_RamfuncsLoadStart)、
    load_size (_RamfuncsLoadSize)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    run_size (_RamfuncsRunSize)、
    run_end (_RamfuncsRunEnd)、
    PAGE = 0
    #endif
    #endif

    谢谢、此致、
    Vamsi

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

    尊敬的 Vamsi
    我根据您的建议修改了链接文件。 然后、我感觉解决了这个问题。 但当我测试它时、它又发生了另一种情况。
    闪存写入和擦除工作正常、在2~3minite 之后、电路板发生了复位功能。

    我不明白为什么它发生了复位功能。

    我非常乐于助人、感谢您的回答。

    谢谢、此致、

    Edward

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

    爱德华

    很高兴闪存擦除/编程现在工作正常。

    关于复位: 如果启用了看门狗、请确保它被处理。  此外、检查 TRM 中的 RESC 寄存器和 NMIFLG 寄存器。  您将了解可能的复位源、并且可以在该方向进行调试。

    由于本帖子中讨论的原始闪存程序问题已解决、我建议您打开一个新帖子、以讨论您的进一步重置问题。  这有助于我们将帖子分配给相应的专家、以更好地帮助您。

    谢谢、此致、

    Vamsi

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

    非常感谢。
    正如您所说、我将发布以进一步询问重置问题。
    谢谢你。