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.

[参考译文] TMS320F28388D:如何在闪存上的程序和数据运行时将数据写入闪存?

Guru**** 2595805 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1124516/tms320f28388d-how-to-write-data-into-the-flash-when-the-program-and-data-on-it-are-running

器件型号:TMS320F28388D

尊敬的支持人员:

现在、我可以写入闪存空间、

可以用特定的值写入特定的地址。

但看起来闪存在运行时无法自行写入。

我使用以下 cmd 文件将程序加载到闪存上、并在 RAM 上运行。



.TI.ramfunc
{-l F2838x_C28x_FlashAPI.lib}
//.const
//.switch
//.init_array
//.cinit

}负载= FLASH4,
运行= RAMGS2_13、
Load_start (RamfuncsLoadStart)、
load_size (RamfuncsLoadSize)、
Load_End (RamfuncsLoadEnd)、
RUN_START (RamfuncsRunStart)、
run_size (RamfuncsRunSize)、
RUN_END (RamfuncsRunEnd)、
对齐(8)

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

    但是 、我应该如何处理.cinit 段和.const 段等?

    现在、无论我如何修改.cmd 文件、程序在加载程序后始终会进入错误状态。

    请参阅随附的错误。

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

    尊敬的支持人员:

    请参阅以下链接、了解我之前的工作。

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1094241/tms320f28388d-how-to-write-a-binary-file-into-flash-in-my-own-application-code

    现在 CopyData()在 RAM 上运行时运行良好。

    但是、当程序在闪存上运行时、如何更新闪存?

    我希望加载所有段、包括函数、文本。 闪存中的.cinit、.const 等(all)、并在 RAM 上运行它们。

    它不工作。

    请参阅我的.cmd 文件、如下所示、

    请提供一些线索吗? 非常感谢。


    存储器

    /* begin 用于"引导至闪存"引导加载程序模式*/
    开始:origin = 0x080000,length = 0x000002
    BOOT_RSVD:origin = 0x000002,length = 0x0001AF // M0的部分,引导 ROM 将此用于栈*/
    RAMM0:origin = 0x0001B1,length = 0x00024F
    RAMM1:origin = 0x000400,length = 0x0003F8 //片上 RAM 块 M1 */
    // RAMM1_RSVD:origin = 0x0007F8,length = 0x000008 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超出有效内存的预取),保留并不用于代码*/
    RAMD0_1:origin = 0x00C000、length = 0x001000
    // RAMD1:origin = 0x00C800,length = 0x000800
    //RAMLS0:origin = 0x008000、length = 0x000800
    //RAMLS1:origin = 0x008800,length = 0x000800
    //RAMLS2:origin = 0x009000,length = 0x000800
    RAMLS03:origin = 0x008000、length = 0x002000
    RAMLS4:origin = 0x00A000,length = 0x000800
    RAMLS5:origin = 0x00A800,length = 0x000800
    RAMLS6_7:origin = 0x00B000,length = 0x001000
    //RAMLS7:origin = 0x00B800,length = 0x000800
    //RAMLS_TOTAL:origin = 0x008000、length = 0x4000

    RAMGS0:origin = 0x00D000,length = 0x001000
    RAMGS1:origin = 0x00E000、length = 0x001000
    //RAMGS2:origin = 0x00F000,length = 0x001000
    //RAMGS3:origin = 0x010000,length = 0x001000
    //RAMGS4:origin = 0x011000,length = 0x001000
    //RAMGS5:origin = 0x012000,length = 0x001000
    //RAMGS6:origin = 0x013000,length = 0x001000
    //RAMGS7:origin = 0x014000,length = 0x001000
    //RAMGS8:origin = 0x015000,length = 0x001000
    //RAMGS9:origin = 0x016000,length = 0x001000
    RAMGS2_13:origin = 0x00F000、length = 0x00C000

    // RAMGS10:origin = 0x017000,length = 0x001000
    // RAMGS11:origin = 0x018000,length = 0x001000
    // RAMGS12:origin = 0x019000,length = 0x001000
    // RAMGS13:origin = 0x01A000,length = 0x001000
    RAMGS14:origin = 0x01B000,length = 0x001000
    RAMGS15:origin = 0x01C000,length = 0x000FF8
    // RAMGS15_RSVD:origin = 0x01CFF8,length = 0x000008 //根据勘误咨询“Memory: pret撷取 超出有效内存”*/,保留并不用于代码

    /*闪存扇区*/
    FLASH0:origin = 0x080002,length = 0x001FFE /*片上闪存*/
    FLASH1:origin = 0x082000,length = 0x002000 //片上闪存*/
    FLASH2:origin = 0x084000、length = 0x002000 //片上闪存*/
    FLASH3:origin = 0x086000、length = 0x002000 //片上闪存*/
    FLASH4:origin = 0x088000、length = 0x008000 //片上闪存*/
    FLASH5:origin = 0x090000,length = 0x008000 //片上闪存*/
    Flash6:origin = 0x098000、length = 0x008000 //片上闪存*
    FLASH7:origin = 0x0A0000,length = 0x008000 //片上闪存*/
    FLASH8:origin = 0x0A8000、length = 0x008000 //片上闪存*/
    FLASH9:origin = 0x0B0000,length = 0x008000 //片上闪存*/
    FLASH10:origin = 0x0B8000、length = 0x002000 //片上闪存*/
    FLASH11:origin = 0x0BA000、length = 0x002000 //片上闪存*/
    FLASH12:origin = 0x0BC000、length = 0x002000 //片上闪存*/
    FLASH13:origin = 0x0BE000、length = 0x001FF0 /*片上闪存*/
    // FLASH13_RSVD:origin = 0x0BFFF0,length = 0x000010 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:有效内存之外的预取)来保留代码,不要将其用于代码*/
    /*
    CPU1TOCPU2RAM:origin = 0x03A000,length = 0x000800
    CPU2TOCPU1RAM:origin = 0x03B000,length = 0x000800
    *
    CPU1TOCPU2RAM1:origin = 0x03A000、length = 0x000088
    CPU1TOCPU2RAM2:origin = 0x03A088,length = 0x000778
    CPU2TOCPU1RAM1:origin = 0x03B000、length = 0x000088
    CPU2TOCPU1RAM2:origin = 0x03B088,length = 0x000778
    CPUTOCMRAM:origin = 0x039000,length = 0x000800
    CMTOCPURAM:origin = 0x038000,length = 0x000800

    CANA_MSG_RAM:origin = 0x049000、length = 0x000800
    CANB_MSG_RAM:origin = 0x04B000、length = 0x000800

    复位:origin = 0x3FFFC0,length = 0x000002

    部分

    codestart:>开始,align (8)
    .text:>> FLASH4,align (8)
    // for_print{rts2800_fpu64_eabi.lib <_printfi.c.obj>(.text)}RAMGS2_13
    //.cinit:> FLASH7、align (8)
    //.wwitch:>FLASH5,align (8)


    切换
    .cinit
    }负载= FLASH5,
    运行= RAMGS15、
    load_start (_cinit_loadstart)、
    run_start (_cinit_runstart)、
    大小(_cinit_size)


    .reset:> reset,type = DSECT /* not used,*/
    .stack:> RAMD0_1 //RAMM1


    init_array:> FLASH5,align (8)


    .bss:> RAMLS5
    .bss:输出:> RAMLS4
    .bss:CIO :>RAMLS5
    .data:> RAMGS2_13
    //.data:>> FLASH4
    .sysmem:> RAMGS2_13 //RAMLS5
    /*初始化段进入闪存*/
    //.const:> FLASH5、align (8)
    .const:> FLASH4、align (8)


    ramgs0:>RAMGS0,type=NOINIT
    ramgs1:>RAMGS1,type=NOINIT
    /*
    MSGRAM_CPU1_TO_CPU2:>CPU1TOCPU2RAM,type=NOINIT
    MSGRAM_CPU2_TO_CPU1:>CPU2TOCPU1RAM,type=NOINIT
    *
    MSGRAM_CPU1_TO_CPU2 > CPU1TOCPU2RAM1、type=NOINIT
    MSGRAM_DATA_CPU1_TO_CPU2 > CPU1TOCPU2RAM2、type=NOINIT
    MSGRAM_CPU2_TO_CPU1 > CPU2TOCPU1RAM1、type=NOINIT
    MSGRAM_DATA_CPU2_TO_CPU1 > CPU2TOCPU1RAM2、type=NOINIT

    MSGRAM_CPU_TO_CM:> CPUTOCMRAM,type=NOINIT
    MSGRAM_CM_TO_CPU:> CMTOCPURAM,type=NOINIT



    .TI.ramfunc
    {-l F2838x_C28x_FlashAPI.lib}

    }负载= FLASH4,
    运行= RAMGS2_13、
    Load_start (RamfuncsLoadStart)、
    load_size (RamfuncsLoadSize)、
    Load_End (RamfuncsLoadEnd)、
    RUN_START (RamfuncsRunStart)、
    run_size (RamfuncsRunSize)、
    RUN_END (RamfuncsRunEnd)、
    对齐(8)


    isfunc:load = FLASH4,
    运行= RAMM0 | RAMM1 | RAMGS2_13 | RAMLS6_7、
    load_start (isrfuncLoadStart)、
    load_size (isrfuncLoadSize)、
    load_end (isrfuncLoadEnd)、
    run_start (isrfuncRunStart)、
    run_size (isrfuncRunSize)、
    RUN_END (isrfuncRunEnd)、
    PAGE = 0、ALIGN (8)

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

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

    您好、Ping Zhou、

    您是否愿意将闪存 API 移动到 RAM 或您的应用以及 RAM?

    如果我理解正确、您只想将闪存 API 移动到 RAM -正确吗?

    谢谢、此致、
    Vamsi

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

    尊敬的 Vamsi:

    我的目的是更新闪存、请参阅我之前的工作、如下所示:

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1094241/tms320f28388d-how-to-write-a-binary-file-into-flash-in-my-own-application-code

    更新闪存后、程序也可以反复更新闪存。

    我想将所有与闪存写入相关的应用程序移动到 RAM 中。

    我的实验表明、如果只有闪存 API 被移动到 RAM、程序将输入错误、因为闪存中的一些常量数据被写入到另一个值(在我看来)。

    因此、我认为.cinit 和.const 等应该全部移动到 RAM 中。

    非常感谢!

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

    您好、Ping Zhou、

    您是否将调用闪存 API 的所有函数以及 RAM 映射(如闪存 API 使用示例中所示、并在闪存 API 指南中提及)?

    您是否正在擦除闪存 API 映射到的任何扇区?

    谢谢、此致、

    Vamsi

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

    您好、Ping Zhou、

    您是否仍需要有关此方面的帮助?   

    谢谢、此致、
    Vamsi