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.

[参考译文] TMS320F28386S:如何将 OTP 设置为从闪存引导。 请提供帮助。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1247168/tms320f28386s-how-to-set-otp-to-boot-from-flash-please-help

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

大家好、我有新的 F28386S MCU、并通过14引脚 JTAG 设计了一个用于它和所有程序的分接板。 我在汇编器中编写代码、一切都运行良好。 CCS 版本9将我的代码下载至闪存存储器、然后我用绿色三角形按钮来运行我的代码。 当我关闭 MCU 电源然后再加电时、我的代码不会运行。 我阅读了技术参考手册中的内容、即必须设置引导引脚和 OTP、这样我就完成了。 GPIO 72和 GPIO 84现在具有4.7K 的上拉电阻器。 这2个 GPIO 现在在启动时很高=从闪存引导。 那么、我执行了该操作、但仍然无法从闪存引导。  

我的问题是、如何将 OTP 设置为从闪存引导。 我不打算在将来更改此设置以从其他外部器件引导、因此可以选择从闪存引导。 我还知道、该寄存器是一次性编程寄存器、可以从闪存无限期引导。  

任何帮助都将非常感谢,我的意思也是这样。

感谢大家、希望很快收到您的反馈。

皮特

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

    Pete、

    我在 C2000Ware 中有一个示例.cmd 文件、用来从闪存程序运行。

    请注意存储器中指向闪存地址的"开始"部分、该地址将用于存储代码的起始点。

    你将在 SECTIONS 区域中看到、我们将"codestart"的标签/地址分配给该地址。  这是我们嵌入在 code_start_branch.asm 文件中的标签、用于处理一些预主器件设置。  CODE_START_BRANCH 完成后会立即调用您的"main"函数。

    调试模式工作的原因是、在加载后 CCS 闪存插件中有一个选项连接到"goto" main ()、而不使用独立发生的引导过程。

    我们有一些选项(EMU 引导模式)可在调试器连接时调试不同的引导模式(包括闪存)。  如果你想尝试一下、在你加载代码后、你可以发出一个 CPU->Reset、这应该跳过引导 ROM 的起始地址。  然后、你可以"运行"、如果你的代码按照预期运行、那么你可以知道独立启动应该也应该起作用。

    EMU_boot、我相信 CCS 中有一个用于设置此功能的脚本、否则您可以在存储器窗口中手动写入。   有关这些详细信息、请查看 TRM www.ti.com/.../spruii0的第5章。

    此致!

    马修

    MEMORY
    {
       /* BEGIN is used for the "boot to Flash" bootloader mode   */
       BEGIN            : origin = 0x080000, length = 0x000002
       BOOT_RSVD        : origin = 0x000002, length = 0x0001AF     /* Part of M0, BOOT rom will use this for stack */
       RAMM0            : origin = 0x0001B1, length = 0x00024F
       RAMM1            : origin = 0x000400, length = 0x0003F8     /* on-chip RAM block M1 */
    //   RAMM1_RSVD       : origin = 0x0007F8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
       RAMD0            : origin = 0x00C000, length = 0x000800
       RAMD1            : origin = 0x00C800, length = 0x000800
       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
       RAMLS6           : origin = 0x00B000, length = 0x000800
       RAMLS7           : origin = 0x00B800, length = 0x000800
       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
       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     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
       /* Flash sectors */
       FLASH0           : origin = 0x080002, length = 0x001FFE  /* on-chip Flash */
       FLASH1           : origin = 0x082000, length = 0x002000  /* on-chip Flash */
       FLASH2           : origin = 0x084000, length = 0x002000  /* on-chip Flash */
       FLASH3           : origin = 0x086000, length = 0x002000  /* on-chip Flash */
       FLASH4           : origin = 0x088000, length = 0x008000  /* on-chip Flash */
       FLASH5           : origin = 0x090000, length = 0x008000  /* on-chip Flash */
       FLASH6           : origin = 0x098000, length = 0x008000  /* on-chip Flash */
       FLASH7           : origin = 0x0A0000, length = 0x008000  /* on-chip Flash */
       FLASH8           : origin = 0x0A8000, length = 0x008000  /* on-chip Flash */
       FLASH9           : origin = 0x0B0000, length = 0x008000  /* on-chip Flash */
       FLASH10          : origin = 0x0B8000, length = 0x002000  /* on-chip Flash */
       FLASH11          : origin = 0x0BA000, length = 0x002000  /* on-chip Flash */
       FLASH12          : origin = 0x0BC000, length = 0x002000  /* on-chip Flash */
       FLASH13          : origin = 0x0BE000, length = 0x001FF0  /* on-chip Flash */
    //   FLASH13_RSVD     : origin = 0x0BFFF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
       CPU1TOCPU2RAM   : origin = 0x03A000, length = 0x000800
       CPU2TOCPU1RAM   : origin = 0x03B000, length = 0x000800
       CPUTOCMRAM      : origin = 0x039000, length = 0x000800
       CMTOCPURAM      : origin = 0x038000, length = 0x000800
    
       CANA_MSG_RAM     : origin = 0x049000, length = 0x000800
       CANB_MSG_RAM     : origin = 0x04B000, length = 0x000800
    
       RESET            : origin = 0x3FFFC0, length = 0x000002
    }
    
    SECTIONS
    {
       codestart           : > BEGIN, ALIGN(8)
       .text               : >> FLASH1 | FLASH2 | FLASH3 | FLASH4, ALIGN(8)
       .cinit              : > FLASH4, ALIGN(8)
       .switch             : > FLASH1, ALIGN(8)
       .reset              : > RESET, TYPE = DSECT /* not used, */
       .stack              : > RAMM1
    
    #if defined(__TI_EABI__)
       .init_array      : > FLASH1, ALIGN(8)
       .bss             : > RAMLS5
       .bss:output      : > RAMLS3
       .bss:cio         : > RAMLS5
       .data            : > RAMLS5
       .sysmem          : > RAMLS5
       /* Initalized sections go in Flash */
       .const           : > FLASH5, ALIGN(8)
    #else
       .pinit           : > FLASH1, ALIGN(8)
       .ebss            : > RAMLS5
       .esysmem         : > RAMLS5
       .cio             : > RAMLS5
       /* Initalized sections go in Flash */
       .econst          : >> FLASH4 | FLASH5, ALIGN(8)
    #endif
    
       ramgs0 : > RAMGS0, type=NOINIT
       ramgs1 : > RAMGS1, type=NOINIT
       
       MSGRAM_CPU1_TO_CPU2 : > CPU1TOCPU2RAM, type=NOINIT
       MSGRAM_CPU2_TO_CPU1 : > CPU2TOCPU1RAM, type=NOINIT
       MSGRAM_CPU_TO_CM    : > CPUTOCMRAM, type=NOINIT
       MSGRAM_CM_TO_CPU    : > CMTOCPURAM, type=NOINIT
    
       /* The following section definition are for SDFM examples */
       Filter_RegsFile  : > RAMGS0
       Filter1_RegsFile : > RAMGS1, fill=0x1111
       Filter2_RegsFile : > RAMGS2, fill=0x2222
       Filter3_RegsFile : > RAMGS3, fill=0x3333
       Filter4_RegsFile : > RAMGS4, fill=0x4444
       Difference_RegsFile : >RAMGS5, fill=0x3333
    
       #if defined(__TI_EABI__)
           .TI.ramfunc : {} LOAD = FLASH3,
                            RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
                            LOAD_START(RamfuncsLoadStart),
                            LOAD_SIZE(RamfuncsLoadSize),
                            LOAD_END(RamfuncsLoadEnd),
                            RUN_START(RamfuncsRunStart),
                            RUN_SIZE(RamfuncsRunSize),
                            RUN_END(RamfuncsRunEnd),
                            ALIGN(8)
       #else
           .TI.ramfunc : {} LOAD = FLASH3,
                            RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
                            LOAD_START(_RamfuncsLoadStart),
                            LOAD_SIZE(_RamfuncsLoadSize),
                            LOAD_END(_RamfuncsLoadEnd),
                            RUN_START(_RamfuncsRunStart),
                            RUN_SIZE(_RamfuncsRunSize),
                            RUN_END(_RamfuncsRunEnd),
                            ALIGN(8)
       #endif
    
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    

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

    大家好、Matt、我在上面使用了您的命令文件、并且重建了我的汇编程序、将其下载至我的 MCU 并运行。 运行正常、但当我关闭 MCU 并重新开启时、仍然无法从闪存引导。 然后、我写入了一个小型 asm 程序来读取位置0x80000、以查看它是否已将0x00000000写入该位置并且其仍为0xFFFFFFFF、因此未发生任何变化。 在 TRM 中、如果此位置等于0x00000000、则从闪存引导;如果它等于0xFFFFFFFF、则从 USB 引导。 上面的命令文件显然没有写入此内存位置。

    您能告诉我如何将0x00000000写入地址0x80000、以便我的 MCU 从闪存引导吗?

    此外、我在 CCS 中创建了一个空白汇编器文件、因此它没有 C   语言中的"main"。它改为使用_c_int00 .asmfunc。

    谢谢 Matt、希望很快收到您的反馈。

    皮特

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

    Pete、

    是否在您的项目中包含 C:\ti\c2000\c2000Ware_4_03_00_00\device_support\f2838x\common\source\f2838x_codestartbranch.asm 文件?

    这有.sect "codestart"、该文件在.cmd 之上引用、并将放置在"BEGIN"位置。

    由于您直接在 asm 中编码、您可以将此代码的内容集成在您的 main.asm 中;但我们仍需要将那个段或者至少那个段放置在0x80000处的.asm 中。

    为了澄清一下、您不希望将0x0000写入地址0x80000、我需要查看 TRM 的语言、但 BROM 将在此位置查找除0xFFFFFFFF 以外的任何内容作为闪存引导的闪存入口点; 如果它看到0xFFFFFFFF (已擦除)、那么在该引导模式下、它将选择 USB 引导并跳转到该引导加载程序。  (从技术角度而言、0x0000可以是有效地址、但它在 M0 RAM 中、此时不会是闪存引导)。

    此致!

    马修

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

    你好,Matthew,很抱歉这么晚才回复。 MCU 一直以来都很忙。 是的、它现在从闪存引导、但运行速度非常慢。 当使用 XDS110进行下载、然后运行我的代码时、速度非常快。 关闭芯片、然后在未连接 XDS110的情况下上电、我的程序会非常缓慢地运行。 我今天设置 PLL、看看这是否解决了问题、但除此之外、感谢您的帮助、我非常感谢您的帮助。 :)