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.

[参考译文] TMS320F28P659DK-Q1:固件升级方案

Guru**** 2611705 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1555338/tms320f28p659dk-q1-firmware-upgradation-scheme

器件型号:TMS320F28P659DK-Q1


工具/软件:

您好、

我正在实施固件升级 TMS320F28P659DK8PTP 引导加载程序完成所有编程。

  1. 目前、我能够从引导 Bank0 中的 Bootloader 应用程序 并切换到 应用程序存储在 Bank1 和 Bank2 中 (因为应用程序大小大于 256KB)。 在本例中、是 .cmd 文件将代码从 BANK1 开始放置

  2. 固件通过时进行寻址 标准 CAN 、我使用 Flash API 将其写入 银行 3 和银行 4 。 对于此插槽、 .cmd 文件从 Bank3 开始放置代码

因此、我拥有:

  • 时隙 A →Bank1 和 Bank2

  • 时隙 B →银行 3 和银行 4

我的怀疑是

假设在引导加载程序中、使用 EEPROM 标志确定当前活动的时隙、比方说是这样 时隙 B
然后我会收到新固件并将其写入 时隙 A 、然后将执行切换到插槽 A
我的问题是: 当代码从插槽 A 开始执行时、它如何.cmd为插槽 A 选择合适的文件?  

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

    您好:

     在应用程序编译时、您(用户)将决定为插槽 A 或插槽 B 选择合适的.cmd。 这可以通过在 CCS 中针对两个不同的应用版本拥有两个单独的构建配置来实现、根据当前活动的时隙在插槽 A/B 链接器命令文件之间切换。

    请告诉我这种解释是否合理。

    此致、

    马特

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

    MEMORY
    {
       BEGIN            : origin = 0x0A0000, length = 0x000002  // <-- Updated codestart to BANK2
    
       BOOT_RSVD        : origin = 0x000002, length = 0x0001AF
       RAMM0            : origin = 0x0001B1, length = 0x00024F
       RAMM1            : origin = 0x000400, length = 0x000400
    
       RAMD0            : origin = 0x00C000, length = 0x002000
       RAMD1            : origin = 0x00E000, length = 0x002000
       RAMD2            : origin = 0x01A000, length = 0x002000
       RAMD3            : origin = 0x01C000, length = 0x002000
       RAMD4            : origin = 0x01E000, length = 0x002000
       RAMD5            : origin = 0x020000, 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
       RAMLS6           : origin = 0x00B000, length = 0x000800
       RAMLS7           : origin = 0x00B800, length = 0x000800
       RAMLS8           : origin = 0x022000, length = 0x002000
       RAMLS9           : origin = 0x024000, length = 0x002000
    
       RAMGS0           : origin = 0x010000, length = 0x002000
       RAMGS1           : origin = 0x012000, length = 0x002000
       RAMGS2           : origin = 0x014000, length = 0x002000
       RAMGS3           : origin = 0x016000, length = 0x002000
       RAMGS4           : origin = 0x018000, length = 0x002000
    
       /* Flash Banks */
      // FLASH_BANK0     : origin = 0x080000, length = 0x20000
       FLASH_BANK1     : origin = 0x0A0002, length = 0x1FFFE
       FLASH_BANK2     : origin = 0x0C0000, length = 0x20000
       FLASH_BANK3     : origin = 0x0E0000, length = 0x20000  // <-- Uncommented
    
       CPU1TOCPU2RAM    : origin = 0x03A000, length = 0x000400
       CPU2TOCPU1RAM    : origin = 0x03B000, length = 0x000400
    
       CLATOCPURAM      : origin = 0x001480, length = 0x000080
       CPUTOCLARAM      : origin = 0x001500, length = 0x000080
       CLATODMARAM      : origin = 0x001680, length = 0x000080
       DMATOCLARAM      : origin = 0x001700, length = 0x000080
    
       CANA_MSG_RAM     : origin = 0x049000, length = 0x000800
       CANB_MSG_RAM     : origin = 0x04B000, length = 0x000800
       //RESET            : origin = 0x3FFFC0, length = 0x000002
    }
    
    SECTIONS
    {
      appstart       : > BEGIN, ALIGN(8)   // NEW
    
    
    
       .text           : >> FLASH_BANK1 | FLASH_BANK2, ALIGN(8)
       .cinit          : >> FLASH_BANK1 | FLASH_BANK2, ALIGN(8)
       .const          : >> FLASH_BANK1 | FLASH_BANK2, ALIGN(8)
       .switch         : >> FLASH_BANK1 | FLASH_BANK2, ALIGN(8)
       .reset : > FLASH_BANK1, ALIGN(8)   /* Redirect reset section to app region */
    
    
       .ramfuncs : LOAD = FLASH_BANK1,
                   RUN = RAMLS0,
                   LOAD_START(_RamfuncsLoadStart),
                   LOAD_SIZE(_RamfuncsLoadSize),
                   LOAD_END(_RamfuncsLoadEnd),
                   RUN_START(_RamfuncsRunStart),
                   RUN_END(_RamfuncsRunEnd),
                   PAGE = 0
    
       .stack           : > RAMM1
    
    #if defined(__TI_EABI__)
       .bss             : >>  RAMD0 | RAMD1 | RAMD2 | RAMD3
       .freertosStaticStack : > RAMD1, type=NOINIT
       .bss:output      : > RAMLS3
       .init_array      : > FLASH_BANK1, ALIGN(8)
       .const           : > FLASH_BANK1, ALIGN(8)
       .data            : > RAMLS5
       .sysmem          : > RAMGS0
    #else
       .pinit           : > FLASH_BANK1, ALIGN(8)
       .ebss            : >> RAMLS5 | RAMLS6
       .econst          : > FLASH_BANK1, ALIGN(8)
       .esysmem         : > RAMLS5
    #endif
    
       ramgs0 : > RAMGS0, type=NOINIT
       ramgs1 : > RAMGS1, type=NOINIT
       ramgs2 : > RAMGS2, type=NOINIT
    
       MSGRAM_CPU1_TO_CPU2 > CPU1TOCPU2RAM, type=NOINIT
       MSGRAM_CPU2_TO_CPU1 > CPU2TOCPU1RAM, type=NOINIT
    
    #if defined(__TI_EABI__)
       .TI.ramfunc : {} LOAD = FLASH_BANK1,
                        RUN = RAMLS0,
                        LOAD_START(RamfuncsLoadStart),
                        LOAD_SIZE(RamfuncsLoadSize),
                        LOAD_END(RamfuncsLoadEnd),
                        RUN_START(RamfuncsRunStart),
                        RUN_SIZE(RamfuncsRunSize),
                        RUN_END(RamfuncsRunEnd),
                        ALIGN(8)
    #else
       .TI.ramfunc : {} LOAD = FLASH_BANK1,
                        RUN = RAMLS0,
                        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 中干净地执行固件升级...

    因此、如果当前插槽为 A、而新固件位于插槽 B 中、则新固件应包含 bank3 和 bank4 的.cmd 文件??
    入口点应该是 3??

    和  

    如果当前插槽为 B、且新固件位于插槽 A 中、则新固件应包含 bank1 和 bank2 的.cmd 文件??
    入口点应该是银行 1??

    开发人员应始终跟踪当前固件运行的插槽??

    我已经成功地写了代码 (. cmd 与 bank1 & bank2) 在 bank1 和 bank2 跳到我使用了以下函数的应用程序。

    这是正确的使用方式吗?

    请让我知道如何跳转到新的 fimrware 在构建新的 fimrware 时需要执行哪些配置、还应该如何从引导加载程序跳转到该应用程序??

    void jumpToApp(uint32_t 地址)

    DINT;
    EALLOW;
    sysctl_disableWatchdog ();
    EDIS;

    SYSTEM_LOG_UART (LOG、_FUNC__、“WD DISABLED \r\n“);

    IER = 0x0000;
    IFR = 0x0000;


    SYSTEM_LOG_UART (LOG、__func__、“stack pointer reset \r\n“);

    // asm(“ MOV SP、#0x07FF“);//可选:栈指针复位(需要时进行调整)

    SYSTEM_LOG_UART (LOG、__func__、“跳转到 application\r\n“);

    //(void (*)(void)) Bank_3)();//直接跳转
    (((void (*)(void)))address)();

    SysCtl_setWatchdogPrescaler (SysCtl_WD_PRESCALE_64);
    SysCtl_setWatchdogMode (SYSCTL_WD_MODE_RESET);//超时复位


    SysCtl_enableWatchdog ();

    while (1);
    }


    注意: — 我添加了应用程序的.cmd


    另请告诉我写的地址(对于插槽 A)应用程序是 0xa0000 还是 0xa0002 ?
    在哪些地址我 shpuld 做擦除,写入, jumptoapp ??

    如果我已刷写引导加载程序和应用程序 uisng CCS...在 CCS .out 中正在写入闪存(在这里使用了)、则相同的 jumptoapp 也可以工作  

    hex2000 -boot -sci8 -a -o firmware_upgrade.bin firmware_upgrad.out

    上述内容旨在生成.bin 文件、而只有我们使用 FAPI API API 写入闪存





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

    您好:

    该专家目前已离职。 请预计回复将延迟到本周稍后返回。  
    此致、

    Allison

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

    您好:

    那么、如果当前插槽是 A、并且新固件位于插槽 B、则新固件应该包含 bank3 和 bank4 的.cmd 文件??
    入口点应该是 3??

    和  

    如果当前插槽为 B、且新固件位于插槽 A 中、则新固件应包含 bank1 和 bank2 的.cmd 文件??
    入口点应为 bank1 ?

    是的、您的理解是正确的。 您需要根据新固件将编程到哪个槽位(即闪存组)来调整入口点/.cmd。

    开发人员应始终跟踪当前固件运行的插槽??

    是的、正确。

    注意: — 我添加了应用程序的.cmd
    [/报价]

    需要注意的一点是:通过查看复位矢量的存储器映射、您会发现地址 0x003F_FFC0 位于引导 ROM 中、用户无法对其进行编程。 始终从该位置获取复位。  在链接器 cmd 文件中、.reset 应映射到 RESET 段(复位向量)、但不使用它 (DSECT)。  

    .reset              : > RESET,     PAGE = 0, TYPE = DSECT /* not used, */

    另外、请告知我所写的地址(对于插槽 A)应用程序是 0xa0000 还是 0xa0002??

    0xA0000 通常为 codestartbranch(即 codestart)保留、后者会重新初始化栈指针并通过 c_int00 例程运行。 请确保此位置已分支到、它是应用程序的入口点。  

    0xA0002 可用于写入插槽 A 应用程序的应用程序代码。

    [引述 userid=“647997" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1555338/tms320f28p659dk-q1-firmware-upgradation-scheme/6015141

    如果我已刷写引导加载程序和应用程序 uisng CCS...在 CCS .out 中正在写入闪存(在这里使用了)、则相同的 jumptoapp 也可以工作  

    hex2000 -boot -sci8 -a -o firmware_upgrade.bin firmware_upgrad.out

    [/报价]

    请使用 CCS 中的片上闪存工具来验证应用程序的编程是否正确。 此 E2E 常见问题解答介绍了如何访问工具(步骤 1)并验证应用(步骤 15)。

    还请验证您是否跳转到下一个应用版本的 codestart(例如,对于 0xA0000 的插槽 A)。

    此致、

    马特

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

    您好、Matt
    感谢您的答复...

    “0xA0002 可用于写入插槽 A 应用程序的应用程序代码“

    这意味着当我写入闪存时、起始地址应该是 0xA0002????


    我之前对 CCS 所做的事情
    1.创建一个自定义引导加载程序,它将被刷写到 bank0 — 仅为 bank0 设置片上片上片上片上片上片上片上
    2.已创建的应用程序将被刷写到 BANK1 — 仅用于 bank1 的片上闪存

    希望片上闪存配置意味着擦除和编程启用...

    在刷 新电路板时刷新 LED 后、
    引导加载程序启动,然后跳转到应用程序 — 我得到了日志


    我需要做的事情——这就是我一直坚持的地方(应用程序通过 CAN 实现、而不是通过 CCS 实现)
    1.我需要通过 CAN 从主机处理器获取二进制文件、然后写入闪存并引导该应用程序。 仅使用相同的.cmd。
    2.在引导加载程序方面、我收到数据并按 1kB 的方式写入闪存(CRC 检查是否正确传输)
    3.在写闪存之前,我正在做

    接收的数据 —  chunk_len_prc(主要为 1KB、仅最后一个块小于 1KB)

    uint16_t wordCount =(Chunk_len_PRC + 1)/2;   

    对于 (i = 0;i < wordCount;i++)

    uint8_t low =(2* i < chunk_len_prc)? rx_chunk_buffer[2 * i]: 0xFF;
    uint8_t high =(2*i + 1 < chunk_len_prc)? rx_chunk_buffer[2 * i + 1]: 0xFF;
    wordBuffer[i]=((uint16_t) high << 8)| low;
    }

    //写入闪存


    uint16_t wordsPerCall = 32;// 64 字节
    uint16_t writed = 0;

    while(写入< wordCount){
    uint16_t remaining = wordCount — 已写入;
    Uint16_t batchSize =(剩余>= wordsPerCall)? wordsPerCall:剩余;
    target_address、&wordBuffer[writed]、batchSize) Example_Program;

    //将地址和字指针向前移动
    target_address += batchSize;//每个字= 2 个字节
    已写入+= batchSize;
    SYSTEM_LOG_UART (log、_FUNC__、“1111111inside、而目标地址= 0x%08“ PRIx32 “\r\n",“,TARGET_ADDRESS、TARGET_ADDRESS);
    SYSTEM_LOG_UART (log、_FUNC__、“2222222222 remaining =%u、batchSize =%u writed =%u \r\n“、remaining、batchSize、written);

    }


    这就是我的生活方式

    传输完成后、我调用相同的 jumptoapp (0xa0000);


    我所说的二进制文件是一个.txt 文件

    hex2000 -boot -b -o firmware_upgrade.txt firmware_upgrad.out

    这是正确的还是我们应该 自行传输 firmware_upgrad.out?



    我尝试了以下 jumptoapp 和 dumpflash

    void dumpFlash(uint32_t addr、uint16_t 字)

    Volatile uint16_t * p =(volatile uint16_t *) addr;
    uint16_t i;

    system_log_uart (log、_func__、“从 0x%08lX 转储闪存:\r\n“、addr);

    对于 (i = 0;i < words;i++)

    如果 (i % 8 == 0)//每行 8 个字

    system_log_uart (log、__func__、“\r\n0x%08lX:“、(uint32_t)(addr + i*2));
    }

    SYSTEM_LOG_UART (LOG、__func__、“%04X “、p[i]);
    }
    SYSTEM_LOG_UART (LOG、__func__、“\r\n")“);
    }

    void jumpToApp(uint32_t 地址)

    DINT;
    EALLOW;
    sysctl_disableWatchdog ();
    EDIS;

    SYSTEM_LOG_UART (LOG、_FUNC__、“WD DISABLED\r\n“);

    IER = 0x0000;
    IFR = 0x0000;

    SYSTEM_LOG_UART(LOG、__func__、“跳转到 0x%08lX\r\n“的应用程序,地址);

    DumpFlash (0x000A0000、64);

    //直接跳转至 codestart
    (((void (*)(void)))address)();

    //如果我们再返回、请停止
    system_log_uart (log、__func__、“error:application returned!\r\n“);
    while (1);
    }

    输出
    日志 (jumpToApp):禁用 WD
    日志 (jumpToApp):跳转到应用程序 0x000a0000
    日志 (dumpFlash):从 0x000a0000 转储闪存:
    日志 (dumpFlash):
    0x000a0000:log (dumpFlash):08AA log (dumpFlash):0000 log (dumpFlash):0000
    0x000a0010:log (dumpFlash):0000 log (dumpFlash):000a log (dumpFlash):0000
    0x000a0020:log (dumpFlash):003c log (dumpFlash):000a log (dumpFlash):6600
    0x000a0030:log (dumpFlash):41C8 log (dumpFlash):0000 log (dumpFlash):41E0
    0x000a0040:log (dumpFlash):000a log (dumpFlash):0000 log (dumpFlash):0048
    0x000a0050:log (dumpFlash):000a log (dumpFlash):0010 log (dumpFlash):0450
    0x000a0060:log (dumpFlash):000a log (dumpFlash):4C2D log (dumpFlash):000a
    0x000a0070:log (dumpFlash):0000 log (dumpFlash):0036 log (dumpFlash):0000






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

    您好:

    表示当我写入闪存时、起始地址应为 0xA0002???

    是的、它应从您的链接器命令文件中定义的 0xA0002 开头。  

    这是正确的还是我们应该 自行传输 firmware_upgrade.out?

    是的、这也是正确的。 我们建议传输 二进制/十六进制文件。  

    AllBankUsing512bitAutoECC Example_Program (target_address、&wordBuffer[writed]、batchSize);

    由于一次对 512 位进行编程、因此请确保您的链接器命令文件中的闪存段使用 align (32) 与 512 位边界对齐。

    此致、

    马特

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

    尊敬的 Matt:

    我已经使用了提供的 .cmd 文件 。 我们之前讨论过、对齐设置为 32 然后我就收到了 .bin 文件 在执行 CRC 校验并刷写到 MCU 之后、通过 CAN 从 Linux 计算机启动。

    在我的测试中:

    • 才真正启用了该功能 .bin 地址 0xA0000 ,闪存转储显示了正确存储的确切的 hexdump 数据-->但没有跳转到应用程序(提供的代码)。 在获得.bin 文件的确切闪存转储后、为什么它不引导?

    • 不过、它在编程为时被禁用 0xA0002 、则只显示闪存转储 0xFFFF

    相关 片上工具 为了验证编程是否正确、您能否分享任何参考链接或文档?

    您还能否确认这是否是开发自定义引导加载程序的正确方法?


    MEMORY
    {
       BEGIN            : origin = 0x0A0000, length = 0x000002  // <-- Updated codestart to BANK2
    
       BOOT_RSVD        : origin = 0x000002, length = 0x0001AF
       RAMM0            : origin = 0x0001B1, length = 0x00024F
       RAMM1            : origin = 0x000400, length = 0x000400
    
       RAMD0            : origin = 0x00C000, length = 0x002000
       RAMD1            : origin = 0x00E000, length = 0x002000
       RAMD2            : origin = 0x01A000, length = 0x002000
       RAMD3            : origin = 0x01C000, length = 0x002000
       RAMD4            : origin = 0x01E000, length = 0x002000
       RAMD5            : origin = 0x020000, 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
       RAMLS6           : origin = 0x00B000, length = 0x000800
       RAMLS7           : origin = 0x00B800, length = 0x000800
       RAMLS8           : origin = 0x022000, length = 0x002000
       RAMLS9           : origin = 0x024000, length = 0x002000
    
       RAMGS0           : origin = 0x010000, length = 0x002000
       RAMGS1           : origin = 0x012000, length = 0x002000
       RAMGS2           : origin = 0x014000, length = 0x002000
       RAMGS3           : origin = 0x016000, length = 0x002000
       RAMGS4           : origin = 0x018000, length = 0x002000
    
       /* Flash Banks */
      // FLASH_BANK0     : origin = 0x080000, length = 0x20000
       FLASH_BANK1     : origin = 0x0A0002, length = 0x1FFFE
       FLASH_BANK2     : origin = 0x0C0000, length = 0x20000
       FLASH_BANK3     : origin = 0x0E0000, length = 0x20000  // <-- Uncommented
    
       CPU1TOCPU2RAM    : origin = 0x03A000, length = 0x000400
       CPU2TOCPU1RAM    : origin = 0x03B000, length = 0x000400
    
       CLATOCPURAM      : origin = 0x001480, length = 0x000080
       CPUTOCLARAM      : origin = 0x001500, length = 0x000080
       CLATODMARAM      : origin = 0x001680, length = 0x000080
       DMATOCLARAM      : origin = 0x001700, length = 0x000080
    
       CANA_MSG_RAM     : origin = 0x049000, length = 0x000800
       CANB_MSG_RAM     : origin = 0x04B000, length = 0x000800
       RESET            : origin = 0x3FFFC0, length = 0x000002
    }
    
    SECTIONS
    {
      appstart       : > BEGIN, ALIGN(8)   // NEW
    
    
    
       .text           : >> FLASH_BANK1 | FLASH_BANK2, ALIGN(32)
       .cinit          : >> FLASH_BANK1 | FLASH_BANK2, ALIGN(32)
       .const          : >> FLASH_BANK1 | FLASH_BANK2, ALIGN(32)
       .switch         : >> FLASH_BANK1 | FLASH_BANK2, ALIGN(32)
       .reset              : > RESET,     PAGE = 0, TYPE = DSECT /* not used, */
    
    
       .ramfuncs : LOAD = FLASH_BANK1,
                   RUN = RAMLS0,
                   LOAD_START(_RamfuncsLoadStart),
                   LOAD_SIZE(_RamfuncsLoadSize),
                   LOAD_END(_RamfuncsLoadEnd),
                   RUN_START(_RamfuncsRunStart),
                   RUN_END(_RamfuncsRunEnd),
                   PAGE = 0
    
       .stack           : > RAMM1
    
    #if defined(__TI_EABI__)
       .bss             : >>  RAMD0 | RAMD1 | RAMD2 | RAMD3
       .freertosStaticStack : > RAMD1, type=NOINIT
       .bss:output      : > RAMLS3
       .init_array      : > FLASH_BANK1, ALIGN(32)
       .const           : > FLASH_BANK1, ALIGN(32)
       .data            : > RAMLS5
       .sysmem          : > RAMGS0
    #else
       .pinit           : > FLASH_BANK1, ALIGN(32)
       .ebss            : >> RAMLS5 | RAMLS6
       .econst          : > FLASH_BANK1, ALIGN(32)
       .esysmem         : > RAMLS5
    #endif
    
       ramgs0 : > RAMGS0, type=NOINIT
       ramgs1 : > RAMGS1, type=NOINIT
       ramgs2 : > RAMGS2, type=NOINIT
    
       MSGRAM_CPU1_TO_CPU2 > CPU1TOCPU2RAM, type=NOINIT
       MSGRAM_CPU2_TO_CPU1 > CPU2TOCPU1RAM, type=NOINIT
    
    #if defined(__TI_EABI__)
       .TI.ramfunc : {} LOAD = FLASH_BANK1,
                        RUN = RAMLS0,
                        LOAD_START(RamfuncsLoadStart),
                        LOAD_SIZE(RamfuncsLoadSize),
                        LOAD_END(RamfuncsLoadEnd),
                        RUN_START(RamfuncsRunStart),
                        RUN_SIZE(RamfuncsRunSize),
                        RUN_END(RamfuncsRunEnd),
                        ALIGN(8)
    #else
       .TI.ramfunc : {} LOAD = FLASH_BANK1,
                        RUN = RAMLS0,
                        LOAD_START(_RamfuncsLoadStart),
                        LOAD_SIZE(_RamfuncsLoadSize),
                        LOAD_END(_RamfuncsLoadEnd),
                        RUN_START(_RamfuncsRunStart),
                        RUN_SIZE(_RamfuncsRunSize),
                        RUN_END(_RamfuncsRunEnd),
                        ALIGN(8)
    #endif
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    


    void dumpFlash(uint32_t addr, uint16_t words)
    {
        volatile uint16_t *p = (volatile uint16_t *)addr;
        uint16_t i;
    
        SYSTEM_LOG_UART(LOG, __func__, "Dumping flash from 0x%08lx:\r\n", addr);
    
        for (i = 0; i < words; i++)
        {
            if (i % 8 == 0)   // 8 words per line
            {
                SYSTEM_LOG_UART(LOG, __func__, "\r\n0x%08lx : ", (uint32_t)(addr + i*2));
            }
    
            SYSTEM_LOG_UART(LOG, __func__, "%04X ", p[i]);
        }
        SYSTEM_LOG_UART(LOG, __func__, "\r\n");
    }
    
    void jumpToApp(uint32_t address)
    {
        DINT;
        EALLOW;
        SysCtl_disableWatchdog();
        EDIS;
    
        SYSTEM_LOG_UART(LOG, __func__, "WD disabled\r\n");
    
        IER = 0x0000;
        IFR = 0x0000;
    
        SYSTEM_LOG_UART(LOG, __func__, "Jumping to application at 0x%08lx\r\n", address);
    
        dumpFlash(address, 64);
    
        // Direct jump to codestart
        ((void (*)(void))address)();
    
        // If we ever return, halt
        SYSTEM_LOG_UART(LOG, __func__, "ERROR: Application returned!\r\n");
        while (1);
    }


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

    您好:

    [引述 userid=“647997" url="“ url="~“~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1555338/tms320f28p659dk-q1-firmware-upgradation-scheme/6031899
    • 才真正启用了该功能 .bin 地址 0xA0000 ,闪存转储显示了正确存储的确切的 hexdump 数据-->但没有跳转到应用程序(提供的代码)。 在获得.bin 文件的确切闪存转储后、为什么它不引导?

    • 不过、它在编程为时被禁用 0xA0002 、则只显示闪存转储 0xFFFF

    [/报价]

    为了澄清:0xA0000 - 0xA0001 被保留用于 codestart、0xA0002-0xA0007 被保留。 存储体的其余部分可用于该应用。

    请开始从 0xA0000 对二进制文件进行编程 (codestart 为 0xA0000)。 闪存边界需要对齐到 512 位才能使 512 位编程正常工作、这就是从 0xA0002 开始失败的原因。  

    有关 片上工具 为了验证编程是否正确、您能否分享任何参考链接或文档?

    有关如何在 CCS 中访问片上闪存工具并验证闪存的更多详细信息、请参阅此常见问题解答。

    此致、

    马特

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

    您好:

    您是否对闪存编程有任何其他问题? 否则、我们可以关闭线程。

    此致、

    马特

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

    尊敬的 Matt:

    我已 通过 CCS 和自定义引导加载程序(使用 FAPI API)进行刷写时将内容转储在闪存中。  
    注意: — 检查不同组中的不同固件

    1.通过自定义引导加载程序刷写应用程序

        1.从 CCS 构建.out 文件

        2. hex2000 -o AIO_CLI_4_real.bin -b -i AIO_CLI_4.out



        这是正确的吗? 如果没有、请提供用于生成.bin 文件的正确通信、我可以使用 FAPI 向电路板写入数据

    这是应用程序代码的转储


    2.通过 CCS 将引导加载程序刷写到 bank0

    只需构建代码并在 CCS 中刷写

    这是引导加载程序的转储




    如前所述、我将通过 CCS 在 bank0 中编写引导加载程序、并使用它在 bank1 中编写应用。
    但刷写后不会跳转到应用程序。


    使用引导加载程序的跳转函数

    void jumpToApp(uint32_t 地址)

    //禁用中断和看门狗
    DINT;
    EALLOW;
    sysctl_disableWatchdog ();
    EDIS;

    IER = 0x0000;
    IFR = 0x0000;

    ((void (*)(void)))address)();//直接跳转到 codestart

    //永远不应返回


    while (1);
    }


    由于我正在从闪存中获取与.bin文件 hexdump 完全匹配的完整转储、因此我怀疑用于hex2000应用程序代码的转换可能不正确。 可以帮助我验证一下吗? 另外、跳转到应用程序才能正常工作的第一个字节应该是什么? codestart设置是否会导致任何问题?

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

    尊敬的 Matt:

    您能否回复此查询?

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

    您好、Sreelakshmy:

    您的引导加载程序期望传入的.bin 数据采用什么格式? 它是否期望它只是要编程到闪存中的原始数据? 或者、它是否需要采用-sci8 -boot 格式来格式化、用于生成您之前在线程中提到的.txt 文件? 我假设您只是希望将原始二进制数据编程到闪存中。 在这种情况下、 请参阅 此论坛 帖子、了解有关从.out 文件正确生成.bin 文件的详细说明。

    此致、

    Skyler

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

    您好、Skyler & Matt

    使用了原始数据...上面提到的票解决了这个问题...非常感谢您的支持