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.

[参考译文] TMS320F280025C:SCI 编程器-仅更新应用?

Guru**** 2595805 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1113995/tms320f280025c-sci-programmer---only-update-the-application

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

您好!

我尝试实现引导加载程序、该加载程序应支持通过 SCI 传输的 DFU。 我将使用以下示例通过 SCI 传输数据并将应用程序写入闪存:

C2000Ware_4_00_00_00\driverlib\f28002x\examples\flash\flash_kernel_ex3_sci_flash_kernel

据我所知、应用程序会等待 SCI 连接和特定命令、并执行 DFU 和引导应用程序。 如果我不想直接跳转到应用程序

然后、我可以使用 DFU 阻止调用"EntryAddr = sciGetFunction (SCI_BOOT_ALT1);"

 FLASH_kernel_ex3_sci_flash_kernel 的主函数

uint32_t main(void)
{
//
// flush SCIA TX port by waiting while it is busy, driverlib.
//
//    sciaFlush();
//
// Step 1. Initialize System Control:
// Enable Peripheral Clocks
//
    Device_init();
//
// Step 2. Initialize GPIO:
//
    Device_initGPIO();

//
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
//
    DINT;

//
// init interrupt and vectorTable, driverlib.
//
    Interrupt_initModule();
    Interrupt_initVectorTable();


//
// Disable CPU interrupts and clear all CPU interrupt flags:
//
    IER = 0x0000;
    IFR = 0x0000;

   Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, 4);

    initFlashSectors();

    uint32_t EntryAddr;

//
// parameter SCI_BOOT for GPIO28,29
// refer to cpu1bootrom.h for alternate SCI Boot Pin configurations
//
    EntryAddr = sciGetFunction(SCI_BOOT_ALT1);


    return(EntryAddr);
}

现在、TI 提供了 serial_flash_programmer、地址为 C2000Ware_4_00_00_00\utilities\fel_programmers\serial_flash_programmer、它似乎也希望始终首先发送引导加载程序。  

我可以通过某种方式阻止 Flasher 工具首先发送引导加载程序、然后直接发送应用程序吗? 当我不使用命令"-k bootloader_hex.txt"时、我收到 serial_flash_programmer.exe 的运行时错误。 提供了 serial_flash_programmer 的源代码、但我想阻止我自己重新编译它。

应用链接器文件:

-stack 0x380

MEMORY
{
   BEGIN           	: origin = 0x080000, length = 0x000002
   BOOT_RSVD		: origin = 0x00000002, length = 0x00000126
   RAMM0           	: origin = 0x00000128, length = 0x000002D8
   RAMM1            : origin = 0x00000400, length = 0x000003F8     /* on-chip RAM block M1 */
// RAMM1_RSVD       : origin = 0x000007F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

/* RAMLS4           : origin = 0x0000A000, length = 0x00000800
   RAMLS5           : origin = 0x0000A800, length = 0x00000800
   RAMLS6           : origin = 0x0000B000, length = 0x00000800
   RAMLS7           : origin = 0x0000B800, length = 0x00000800*/

   /* Combining all the LS RAMs */
   RAMLS4567        : origin = 0x0000A000, length = 0x00002000
   RAMGS0           : origin = 0x0000C000, length = 0x000007F8
// RAMGS0_RSVD      : origin = 0x0000C7F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */


   BOOTROM          : origin = 0x003F0000, length = 0x00008000
   BOOTROM_EXT      : origin = 0x003F8000, length = 0x00007FC0
   /*RESET            : origin = 0x003FFFC0, length = 0x00000002*/
   RESET            : origin = 0x003FFFC0, length = 0x00000002
   /* Flash sectors */
   /* BANK 0 */
   FLASH_BANK0_SEC0  : origin = 0x080002, length = 0x000FFE	/* on-chip Flash */
   FLASH_BANK0_SEC1  : origin = 0x081000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC2  : origin = 0x082000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC3  : origin = 0x083000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC4  : origin = 0x084000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC5  : origin = 0x085000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC6  : origin = 0x086000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC7  : origin = 0x087000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC8  : origin = 0x088000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC9  : origin = 0x089000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC10 : origin = 0x08A000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC11 : origin = 0x08B000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC12 : origin = 0x08C000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC13 : origin = 0x08D000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC14 : origin = 0x08E000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC15 : origin = 0x08F000, length = 0x000FF0	/* on-chip Flash */
// FLASH_BANK0_SEC15_RSVD     : origin = 0x08FFF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

}


SECTIONS
{
   .reset           : > RESET,                  TYPE = DSECT /* not used, */
   codestart        : > BEGIN, ALIGN(8) /*Necessary, otherwise it will not restart */
   .text            : >> FLASH_BANK0_SEC4,   ALIGN(8)
   .cinit           : > FLASH_BANK0_SEC5,  ALIGN(8)
   .switch          : > FLASH_BANK0_SEC5,  ALIGN(8)


   .stack           : > RAMM1

   .init_array      : > FLASH_BANK0_SEC5,  ALIGN(8)
   .bss             : > RAMLS4567
   .bss:output      : > RAMLS4567
   .bss:cio         : > RAMGS0
   .const           : > FLASH_BANK0_SEC5,  ALIGN(8)
   .data            : > RAMLS4567
   .sysmem          : > RAMLS4567

    ramgs0 : > RAMGS0

   GROUP
   {
       .TI.ramfunc
       { -l FlashAPI_F28002x_FPU32.lib}

   }LOAD = FLASH_BANK0_SEC5,
                  RUN = RAMLS4567,
                  LOAD_START(RamfuncsLoadStart),
                  LOAD_SIZE(RamfuncsLoadSize),
                  LOAD_END(RamfuncsLoadEnd),
                  RUN_START(RamfuncsRunStart),
                  RUN_SIZE(RamfuncsRunSize),
                  RUN_END(RamfuncsRunEnd),
                  ALIGN(8)

   DataBufferSection : > RAMGS0, ALIGN(8)
}
/*
//===========================================================================
// End of file.
//===========================================================================
*/


/*
//===========================================================================
// End of file.
//===========================================================================
*/

引导加载程序链接器文件:

MEMORY
{
   BEGIN           	: origin = 0x000000, length = 0x000002
   BOOT_RSVD        : origin = 0x00000002, length = 0x00000126
   RAMM0            : origin = 0x00000128, length = 0x000002D8
   RAMM1            : origin = 0x00000400, length = 0x000003F8     /* on-chip RAM block M1 */
// RAMM1_RSVD       : origin = 0x000007F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
   
/* RAMLS4           : origin = 0x0000A000, length = 0x00000800
   RAMLS5           : origin = 0x0000A800, length = 0x00000800
   RAMLS6           : origin = 0x0000B000, length = 0x00000800
   RAMLS7           : origin = 0x0000B800, length = 0x00000800 */

   /* Combining all the LS RAMs */
   RAMLS4567        : origin = 0x0000A000, length = 0x00002000
   RAMGS0           : origin = 0x0000C000, length = 0x000007F8
// RAMGS0_RSVD      : origin = 0x0000C7F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
   
   RESET            : origin = 0x003FFFC0, length = 0x00000002

   // FLASHBANK1       : origin = 0x00080000, length = 0x00010000
   /* Flash sectors */
   /* BANK 0 */
   FLASH_BANK0_SEC0  : origin = 0x080002, length = 0x000FFE
   FLASH_BANK0_SEC1  : origin = 0x081000, length = 0x001000
   FLASH_BANK0_SEC2  : origin = 0x082000, length = 0x001000
   FLASH_BANK0_SEC3  : origin = 0x083000, length = 0x001000
   FLASH_BANK0_SEC4  : origin = 0x084000, length = 0x001000
   FLASH_BANK0_SEC5  : origin = 0x085000, length = 0x001000
   FLASH_BANK0_SEC6  : origin = 0x086000, length = 0x001000
   FLASH_BANK0_SEC7  : origin = 0x087000, length = 0x001000
   FLASH_BANK0_SEC8  : origin = 0x088000, length = 0x001000
   FLASH_BANK0_SEC9  : origin = 0x089000, length = 0x001000
   FLASH_BANK0_SEC10 : origin = 0x08A000, length = 0x001000
   FLASH_BANK0_SEC11 : origin = 0x08B000, length = 0x001000
   FLASH_BANK0_SEC12 : origin = 0x08C000, length = 0x001000
   FLASH_BANK0_SEC13 : origin = 0x08D000, length = 0x001000
   FLASH_BANK0_SEC14 : origin = 0x08E000, length = 0x001000
   FLASH_BANK0_SEC15 : origin = 0x08F000, length = 0x000FF8
// FLASH_BANK0_SEC15_RSVD : origin = 0x08FFF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

   BOOTROM          : origin = 0x003F0000, length = 0x00008000
   BOOTROM_EXT      : origin = 0x003F8000, length = 0x00007FC0
}


SECTIONS
{
   .text            : > RAMLS4567 | RAMGS0
   .TI.ramfunc      : > RAMM0
   .cinit           : > RAMM0
   .switch          : > RAMM0
   .reset           : > RESET,                  TYPE = DSECT /* not used, */
   .cio             : > RAMGS0
   codestart        : > BEGIN

   .stack           : > RAMM1
#if defined(__TI_EABI__)
   .bss             : > RAMLS4567
   .bss:output      : > RAMLS4567
   .init_array      : > RAMM0
   .const           : > RAMGS0
   .data            : > RAMLS4567 | RAMGS0
   .sysmem          : > RAMLS4567
#else
   .pinit           : > RAMM0
   .ebss            : > RAMLS4567
   .econst          : > RAMGS0
   .esysmem         : > RAMLS4567
#endif

    ramgs0 : > RAMGS0

    /*  Allocate IQ math areas: */
   IQmath           : > RAMLS4567 | RAMGS0
   IQmathTables     : > RAMLS4567 | RAMGS0
}
/*
//===========================================================================
// End of file.
//===========================================================================
*/

编辑:

我现在可以启动闪存中的引导加载程序、但当我通过 SCI 写入时、我现在会得到 CRC 错误。 因此、由于某些函数未在 RAM 中运行、因此在某种程度上存在问题。 对于此引导加载程序示例、我需要将什么加载到 RAM 中?

闪存引导加载程序链接器文件:

-stack 0x380

MEMORY
{
   BEGIN           	: origin = 0x080000, length = 0x000002
   BOOT_RSVD		: origin = 0x00000002, length = 0x00000126
   RAMM0           	: origin = 0x00000128, length = 0x000002D8
   RAMM1            : origin = 0x00000400, length = 0x000003F8     /* on-chip RAM block M1 */
// RAMM1_RSVD       : origin = 0x000007F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

/* RAMLS4           : origin = 0x0000A000, length = 0x00000800
   RAMLS5           : origin = 0x0000A800, length = 0x00000800
   RAMLS6           : origin = 0x0000B000, length = 0x00000800
   RAMLS7           : origin = 0x0000B800, length = 0x00000800*/

   /* Combining all the LS RAMs */
   RAMLS4567        : origin = 0x0000A000, length = 0x00002000
   RAMGS0           : origin = 0x0000C000, length = 0x000007F8
// RAMGS0_RSVD      : origin = 0x0000C7F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */


   BOOTROM          : origin = 0x003F0000, length = 0x00008000
   BOOTROM_EXT      : origin = 0x003F8000, length = 0x00007FC0
   /*RESET            : origin = 0x003FFFC0, length = 0x00000002*/
   RESET            : origin = 0x003FFFC0, length = 0x00000002
   /* Flash sectors */
   /* BANK 0 */
   FLASH_BANK0_SEC0  : origin = 0x080002, length = 0x000FFE	/* on-chip Flash */
   FLASH_BANK0_SEC1  : origin = 0x081000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC2  : origin = 0x082000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC3  : origin = 0x083000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC4  : origin = 0x084000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC5  : origin = 0x085000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC6  : origin = 0x086000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC7  : origin = 0x087000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC8  : origin = 0x088000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC9  : origin = 0x089000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC10 : origin = 0x08A000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC11 : origin = 0x08B000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC12 : origin = 0x08C000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC13 : origin = 0x08D000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC14 : origin = 0x08E000, length = 0x001000	/* on-chip Flash */
   FLASH_BANK0_SEC15 : origin = 0x08F000, length = 0x000FF0	/* on-chip Flash */
// FLASH_BANK0_SEC15_RSVD     : origin = 0x08FFF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

}

SECTIONS
{
   .reset           : > RESET,                  TYPE = DSECT /* not used, */
   codestart        : > BEGIN, ALIGN(8) /*Necessary, otherwise it will not restart */
   .text            : >> FLASH_BANK0_SEC1 | FLASH_BANK0_SEC2,   ALIGN(8)
   .cinit           : > FLASH_BANK0_SEC3,  ALIGN(8)
   .switch          : > FLASH_BANK0_SEC3,  ALIGN(8)


   .stack           : > RAMM1

   .init_array      : > FLASH_BANK0_SEC3,  ALIGN(8)
   .bss             : > RAMLS4567
   .bss:output      : > RAMLS4567
   .bss:cio         : > RAMGS0
   .const           : > FLASH_BANK0_SEC3,  ALIGN(8)
   .data            : > RAMLS4567
   .sysmem          : > RAMLS4567

    ramgs0 : > RAMGS0

   GROUP
   {
       .TI.ramfunc
       { -l FlashAPI_F28002x_FPU32.lib}

   }LOAD = FLASH_BANK0_SEC3,
                  RUN = RAMLS4567,
                  LOAD_START(RamfuncsLoadStart),
                  LOAD_SIZE(RamfuncsLoadSize),
                  LOAD_END(RamfuncsLoadEnd),
                  RUN_START(RamfuncsRunStart),
                  RUN_SIZE(RamfuncsRunSize),
                  RUN_END(RamfuncsRunEnd),
                  ALIGN(8)

       /*  Allocate IQ math areas: */
   IQmath           : > RAMLS4567 | RAMGS0
   IQmathTables     : > RAMLS4567 | RAMGS0
}

/*
//===========================================================================
// End of file.
//===========================================================================
*/

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

    您好!

    我们将其分配给了我们的闪存内核专家。  她会在一天或两天内回来。

    谢谢、此致、

    Vamsi

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

    我现在可以使用串行闪存工具成功刷写应用。 我现在遇到的问题是、将引导加载程序移植到闪存中进行启动、因为此时它仅位于 RAM 内部。 当 codestart 位于 0x080000 (begin)时、应用程序将只运行、并且引导加载程序可能也需要完全相同的地址。 当引导加载程序已经加载到该应用程序时、我是否可以移动该地址? 我认为 有中断矢量地址、那么应用程序如何访问它?

    我在上面的主线程中添加了两个链接器文件、您能不能帮助我如何修改 begin for both 文件以便能够从引导加载程序加载应用?

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

    塞巴斯蒂安  

    [引用 userid="487695" URL"~/support/microriers/c2000-microset-group/c2000/f/c2000-microset-forum/1113995/tms320f280025c-sci-programmer---only-update-the-application"]我是否可以阻止 Flasher 工具首先发送引导加载程序并直接发送应用程序? 当我不使用命令"-k bootloader_hex.txt"时、我收到 serial_flash_programmer.exe 的运行时错误。 提供了 serial_flash_programmer 的源代码、但我想阻止我自己的

    您可以为此使用 serial_flash_programr_appln.exe。 此程序仅加载映像、并假定器件已运行闪存内核。 您仍然需要传递-k 参数、但这实际上不会拉入内核文件进行写入。  

    [~ userid="487695" URL"/support/microriers/c2000-microriers-group/c2000/f/c2000-microriers-forum/1113995/tms320f280025c-sci-programmer---only-update-the-application"]我现在可以启动闪存中的引导加载程序、但当我通过 SCI 写入时、我现在会收到 CRC 错误。 因此、由于某些函数未在 RAM 中运行、因此在某种程度上存在问题。 对于此引导加载程序示例、我需要将什么加载到 RAM 中?

    当闪存内核在闪存中运行时、您需要确保闪存 API 被复制到 RAM 中。 您可以参考闪存编程示例、以了解如何在运行时将闪存 API 复制到 RAM 中。  

    [引用 userid="487695" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1113995/tms320f280025c-sci-programmer---only-update-the-application/4128650#4128650"]

    我现在可以使用串行闪存工具成功刷写应用。 我现在遇到的问题是、将引导加载程序移植到闪存中进行启动、因为此时它仅位于 RAM 内部。 当 codestart 位于 0x080000 (begin)时、应用程序将只运行、并且引导加载程序可能也需要完全相同的地址。 当引导加载程序已经加载到该应用程序时、我是否可以移动该地址? 我认为 有中断矢量地址、那么应用程序如何访问它?

    我在上面的主线程中添加了两个链接器文件、您能不能帮助我如何修改 begin for both 文件以便能够从引导加载程序加载应用?

    [/报价]

    您可以更改应用程序映射到的扇区、使其不会与闪存内核重叠。 您可以将 code_start 段更改为 begin 以外的扇区。 您的器件是否设置为闪存引导? 如果是、如果您希望应用程序在器件复位时启动、您可能需要修改闪存内核的闪存内核链接器命令文件。  

    Anu