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.

[参考译文] TMS320F280034:TMS320F280034在不使用调试器的情况下以独立运行方式从闪存启动

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1200046/tms320f280034-tms320f280034-booting-from-flash-in-a-standalone-operation-without-a-debugger

器件型号:TMS320F280034
主题中讨论的其他器件:UNIFLASHC2000WARESysConfigTMS320F280039C

您好!

有时、我很难让 F280034以独立模式运行。 我先介绍 LAUNCHXL_F280039电路板。 代码将在此运行、从闪存引导时不会出现问题。 我曾尝试使用 F280034改用定制电路板。 我更新了比较器文件、因为它从0034开始、从0x88000开始、在0039开始、从0x80000:

/*
//###########################################################################
//
// FILE:	F280034_flash_lnk.cmd
//
// TITLE:	Linker Command File For F280034 Device
//
//###########################################################################
*/
MEMORY
{
 
   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" */


   RAMLS0           : origin = 0x00008000, length = 0x00000800
   RAMLS1           : origin = 0x00008800, length = 0x00000800
   RAMLS2           : origin = 0x00009000, length = 0x00000800
   RAMLS3           : origin = 0x00009800, length = 0x00000800
   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 */
   //RAMLS            : origin = 0x00008000, length = 0x00004000
   
   RAMGS0           : origin = 0x0000C000, length = 0x00001000
   RAMGS1           : origin = 0x0000D000, length = 0x00001000
   RAMGS2           : origin = 0x0000E000, length = 0x00001000
   RAMGS3           : origin = 0x0000F000, length = 0x00000FF8
// RAMGS3_RSVD       : origin = 0x000FFF8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

   BOOTROM          : origin = 0x003F8000, length = 0x00007FC0
   SECURE_ROM       : origin = 0x003F2000, length = 0x00006000

   RESET            : origin = 0x003FFFC0, length = 0x00000002
/*
#ifdef __TI_COMPILER_VERSION__
   #if __TI_COMPILER_VERSION__ >= 20012000
   #endif
#endif

 */
  BEGIN           	: origin = 0x00088000, length = 0x00000002
   /* Flash sectors */
   /* BANK 0 */
   FLASH_BANK0_SEC0  : origin = 0x088002, length = 0x000FFE
   FLASH_BANK0_SEC1  : origin = 0x089000, length = 0x001000
   FLASH_BANK0_SEC2  : origin = 0x08a000, length = 0x001000
   FLASH_BANK0_SEC3  : origin = 0x08b000, length = 0x001000
   FLASH_BANK0_SEC4  : origin = 0x08c000, length = 0x001000
   FLASH_BANK0_SEC5  : origin = 0x08d000, length = 0x001000
   FLASH_BANK0_SEC6  : origin = 0x08e000, length = 0x001000
   FLASH_BANK0_SEC7  : origin = 0x08f000, length = 0x000FF0
   FLASH_BANK0_SEC7_DO_NOT_USE : origin = 0x08FFF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

   /* BANK 1 */
   FLASH_BANK1_SEC0  : origin = 0x090000, length = 0x001000
   FLASH_BANK1_SEC1  : origin = 0x091000, length = 0x001000
   FLASH_BANK1_SEC2  : origin = 0x092000, length = 0x001000
   FLASH_BANK1_SEC3  : origin = 0x093000, length = 0x001000
   FLASH_BANK1_SEC4  : origin = 0x094000, length = 0x001000
   FLASH_BANK1_SEC5  : origin = 0x095000, length = 0x001000
   FLASH_BANK1_SEC6  : origin = 0x096000, length = 0x001000
   FLASH_BANK1_SEC7  : origin = 0x097000, length = 0x000FF0
   FLASH_BANK1_SEC7_DO_NOT_USE : origin = 0x097FF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
/*
#ifdef __TI_COMPILER_VERSION__
  #if __TI_COMPILER_VERSION__ >= 20012000
}  crc(_ccs_flash_checksum, algorithm=C28_CHECKSUM_16)
  #endif
#endif
*/
}


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

   .stack           : > RAMM1

#if defined(__TI_EABI__)
   .init_array      : > FLASH_BANK0_SEC1,  ALIGN(8)
   .bss             : > RAMLS5
   .bss:output      : > RAMLS3
   .bss:cio         : > RAMLS0
   .data            : > RAMLS5
   .sysmem          : > RAMLS5
   .const           : > FLASH_BANK0_SEC4,  ALIGN(8)
#else
   .pinit           : > FLASH_BANK0_SEC1,  ALIGN(8)
   .ebss            : > RAMLS5
   .esysmem         : > RAMLS5
   .cio             : > RAMLS0
   .econst          : > FLASH_BANK0_SEC4,  ALIGN(8)
#endif

    ramgs0 : > RAMGS0
    ramgs1 : > RAMGS0

    /*  Allocate IQ math areas: */
   IQmath           : > FLASH_BANK0_SEC1, ALIGN(8)
   IQmathTables     : > FLASH_BANK0_SEC2, ALIGN(8)

   .TI.ramfunc      : LOAD = FLASH_BANK0_SEC1,
                      RUN = RAMLS0,
                      LOAD_START(RamfuncsLoadStart),
                      LOAD_SIZE(RamfuncsLoadSize),
                      LOAD_END(RamfuncsLoadEnd),
                      RUN_START(RamfuncsRunStart),
                      RUN_SIZE(RamfuncsRunSize),
                      RUN_END(RamfuncsRunEnd),
                      ALIGN(8)

   /* crc/checksum section configured as COPY section to avoid including in executable */
   .TI.memcrc          : type = COPY

}
/*
//###########################################################################
// End of file.
//###########################################################################
*/

之后我做的是调整 GEL 文件。 随 CCS 提供的文件未针对起始地址0x88000进行调整、并且我无法使用 X110调试器进行闪存。 在投诉地址0x80000不可用或类似的东西。 我更换了

    ...
    GEL_MapAddStr(0x00080000,0, 0x10000, "R|AS2",0);                     /*   FLASH BANK0 (128 KBytes)                                */
    ...
    GEL_MapAddStr(0x00080000,1, 0x10000, "R|AS2",0);                     /*   FLASH BANK0 (64 KBytes)                                */
    GEL_MapAddStr(0x00090000,1, 0x10000, "R|AS2",0);                     /*   FLASH BANK1 (64 KBytes)                                */
    GEL_MapAddStr(0x01080000,1, 0x2000, "R|AS2",0);                      /*   FLASH BANK0 ECC (16 KBytes)                             */
    GEL_MapAddStr(0x01082000,1, 0x2000, "R|AS2",0);                      /*   FLASH BANK0 ECC (16 KBytes)                             */
    ...

替换为这一个:

    ...
    GEL_MapAddStr(0x00088000,0, 0x10000, "R|AS2",0);                     /*   FLASH BANK0 (128 KBytes)                                */
    ...
    GEL_MapAddStr(0x00088000,1, 0x8000, "R|AS2",0);                      /*   FLASH BANK0 (64 KBytes)                                */
    GEL_MapAddStr(0x00090000,1, 0x8000, "R|AS2",0);                      /*   FLASH BANK1 (64 KBytes)                                */
    GEL_MapAddStr(0x01081000,1, 0x1000, "R|AS2",0);                      /*   FLASH BANK0 ECC (16 KBytes)                             */
    GEL_MapAddStr(0x01082000,1, 0x1000, "R|AS2",0);                      /*   FLASH BANK0 ECC (16 KBytes)                             */
    ...
    

刷写后、代码使用调试器正常运行。 第一行中的"codestart"部分

WD_DISABLE  .set  1    ;set to 1 to disable WD, else set to 0

因此在到达我的代码后、应立即禁用看门狗。 但当我断开调试器并进行硬件复位时、微控制器开始复位。 GPIO24和 GPIO32这两个引脚都设置为高电平、我并不期待硬件问题、电路板已经过验证、硬件也按预期工作(我仍然尝试了2个电路板、只是为了确保在某个地方没有硬件问题)。 因此 MCU 应该从闪存引导。 但在 XRS 引脚上、我可以看到大约每20ms 50us 的周期性脉冲、如下图所示。 这看起来像是看门狗复位、但我无法完全确定。 该引脚在另一侧为"漏极开路"、因此另一侧的元件不应对该 MCU 的行为产生任何影响。

从那时起,我尝试了许多不同的东西。 我已在调试器设置中勾选"自动 ECC 生成"、并且我可以在 ECC 存储器中看到一些数据。 ECC 看起来就在那里。然后、我发现、如果以这种方式配置 BootROM、它可能会跳转到闪存的入口地址(就像我在本例中那样)。 但是、可能默认的选项0是地址0x80000 (检查下图)、因此我认为必须在 OTP 中写入、我希望入口点为0x88000。

所以我想写0x78008 --> 0x5AFFFF20、这样它的启动只依赖于 GPIO32。 以及在0x7800C --> 0x00000C23中。 第一个选项是从地址0x88000的闪存引导、第二个选项是从 SPI 闪存引导。

我无法写入 OTP。 我曾尝试在代码中添加这一点、但无法使用 FAPI 代码使其正确编译。 然后、我尝试将其添加到链接器文件中、但未刷写。 我可以在"out"文件中看到该地址处的数据(实际上在 hex2000生成的 S19文件中进行检查)、但如果我使用 XDS110刷写该映像、然后使用"存储器浏览器"进行检查、我在此地址只能看到0xFF。 然后、我在 Uniflash 尝试了相同的方法、同样失败了。 然后、我已在 CCS 和 Uniflash 中尝试手动写入这些寄存器、如下所示。

我从 CCS 和 Uniflash 都得到的错误是:

[错误] C28xx_CPU1:闪存编程期间出错(闪存算法返回错误代码0x00000000、FMSTAT (某些器件上的 STATCMD) 0x00000000)。 操作已取消。
[ERROR] C28xx_CPU1:请确保您正在编程的存储器位置尚未进行编程。
[错误] C28xx_CPU1:在安全操作期间遇到错误。 操作已取消。

因为这是第一个定制板、我想 OTP 可能是在无意之前写入的并且已经锁定(即使它在所有这些寄存器中的值为0xFF)。 然后、我采用了同类型的另一个定制板、并且不刷写任何软件、只需读取存储器以确保它是新的、然后直接写入这些 OTP 寄存器、它也以同样的方式失败。

我的想法快用完了。 有人知道问题可能出在哪里吗? 我是否完全需要刷写0034的 OTP 以使其跳至0x88000、或者这是此 MCU 上的默认入口点? 为什么在 XRS 引脚上看到此复位? 这是什么呢? 我的假设是、我的代码根本没有执行、它会在到达之前被重置。

谢谢你

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

    尊敬的 Peter:

    感谢您对您尝试的步骤的详细和清晰的解释。 您似乎遵循了正确的步骤。

    要写入 OTP、您可以将指向0x78008和7800C 的初始化全局变量引导至。 然后通过 CCS 加载该程序。 CCS 中的闪存插件将负责对 OTP 值进行编程。 加载后无需运行程序、只需加载即可。

    或者、您可以使用 C2000ware \c2000\C2000Ware_4_03_00_00\driverlib\f28003x\examples\DCSM 处的 exmaple 工程

    打开 SysConfig 工具并对 OTP 值进行必要的更改、编译和加载程序。

    此致

    Baskaran

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

    尊敬的 Baskaran:

    感谢您的答复。 我还尝试了 DCSM 项目、按上述方式配置了所有内容、但遇到的问题完全相同:

    C28xx_CPU1: GEL Output: 
    
    RAM initialization done
    
    C28xx_CPU1: GEL Output: 
    Memory Map Initialization Complete
    C28xx_CPU1: GEL Output: ... DCSM Initialization Start ... 
    C28xx_CPU1: GEL Output: ... DCSM Initialization Done ...
    C28xx_CPU1: GEL Output: ... DCSM Initialization Start ... 
    C28xx_CPU1: GEL Output: ... DCSM Initialization Done ...
    C28xx_CPU1: GEL Output: ... DCSM Initialization Start ... 
    C28xx_CPU1: GEL Output: ... DCSM Initialization Done ...
    C28xx_CPU1: Error during Flash programming (Flash algorithm returned error code 0x00000000, FMSTAT (STATCMD on some devices) 0x00000000). Operation cancelled.
    C28xx_CPU1: File Loader: Memory write failed: Unknown error
    C28xx_CPU1: GEL: File: C:\temp\dcsm_security_tool\CPU1_FLASH\dcsm_security_tool.out: Load failed.
    C28xx_CPU1: Error during Flash programming (Flash algorithm returned error code 0x00000000, FMSTAT (STATCMD on some devices) 0x00000000). Operation cancelled.
    C28xx_CPU1: Please make sure the memory location you are programming have not already been programmed.

    我在下面附上了完整的项目。

    e2e.ti.com/.../5381.dcsm_5F00_security_5F00_tool.zip

    您知道此问题的含义吗? 我认为 CSS 闪存插件未能成功刷写此映像并写入 F280034 MCU 上的 OTP。是否能够在这种类型的 MCU 上的 OTP 中进行闪存?

    此致、

    Joao Peter.

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

    是的,我已经厌倦了以前,能够编程.  

    我将回传我们的闪存专家、看看对 OTP 进行编程是否存在任何问题。

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

    尊敬的 Peter:

    我们将在本周结束前进行审核并与您联系。

    谢谢。此致、

    Vamsi

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

    我想我也有同样的问题。 我们具有包含 TMS320f280034 (48引脚)的定制电路板和包含具有 TMS320f280039C (100引脚)的文档处理站的 controlCARD。  
    如果我们要对定制板进行编程、我们会得到与上述相同的错误。 Z1和 Z2 OTP 会发生这种情况

    C28xx_CPU1:闪存编程期间出错(闪存算法返回错误代码0x00000000、FMSTAT (某些器件上的 STATCMD) 0x00000000)。 操作已取消。

     可以对 TMS320f280039C 进行正确编程。 我们还尝试 第二次刷写 TMS320f280039C、显示的错误与 TMS320f280034的错误不匹配。  

    C28xx_CPU1:闪存编程期间出现错误。 地址0x00078008、FMSTAT (某些器件上的 STATCMD) 0x00000030

    即我们要编写的 OTP  

    Z1OTP 1 0x5AFFFFFF

    Z1OTP 2 0x5AFFFFEF

    Z1OTP 3 0xFFFFFF23

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

    尊敬的 Peter:

    关于您的语句"我尝试在代码中添加这一点、但无法使其与 FAPI 代码正确编译。 然后、我尝试将其添加到链接器文件中、但未刷写。":

    1) 1)尝试使用闪存 API 对字段进行编程时、您遇到了什么编译错误?   

    2) 2)将其添加到链接器文件中意味着什么?  请提供更多详细信息。

    3) 3)您的映射文件是否显示某些数据已映射到预期的 OTP 位置?

    谢谢。此致、

    Vamsi

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

    尊敬的 KMay:

    请为您的查询打开新帖子。

    谢谢。此致、

    Vamsi

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

    尊敬的 Vamsi:

    感谢您的答复。 关于您的问题:

    1) 1)我没有花费太多的时间尝试让项目由闪存 API 运行(因此我不记得问题是什么)、因为其他两个选项已经失败-使用 CCS/uniflash (如我的第一篇文章中所示) 以及(通过链接器文件)将变量放置在这些具有指定值的位置。 对于第二种选择、我已在上一篇文章中上传了完整项目以及映射文件和输出文件作为参考。 如果您认为有机会通过闪存 API 可以正常工作、我可以尝试使其正常工作。 我将在明天修改示例项目"flashapi_ex1_programming"、并且我将写回

    2) 2)我意味着我添加了一个全局变量、该变量位于值为0x78006的链接器文件中、正如我之前帖子中附加的项目中所做的那样:

    在.asm 文件中:

    ...
         .sect "dcsm_otp_z1_gpreg"
          .retain
          .long 0x5AFFFF20     ;Z1OTP_GPREG1 = Z1_BOOTPIN
          .long 0x5AFFFFff     ;Z1OTP_GPREG2
          .long 0xFFFF0623     ;Z1OTP_GPREG3 = Z1OTP_BOOTDEF_LOW
          .long 0xFFFFFFFF     ;Z1OTP_GPREG4 = Z1OTP_BOOTDEF_HIGH
    ...

    在链接器文件中:

    MEMORY {
    ...
          DCSM_OTP_Z1_GPREG     : origin = 0x78008, length = 0x00008
    ...
    SECTIONS {
    ...
       dcsm_otp_z1_gpreg        : > DCSM_OTP_Z1_GPREG		    PAGE = 0
    ...
        

    3)是的、映射文件显示使用了此空间:

            name            origin    length      used     unused   attr    fill
    ----------------------  --------  ---------  --------  --------  ----  --------
    ...
      DCSM_OTP_Z1_LINKPOINT 00078000   00000006  00000000  00000006  RWIX
      DCSM_OTP_Z1_JLM_ENABL 00078006   00000002  00000002  00000000  RWIX
      DCSM_OTP_Z1_GPREG     00078008   00000008  00000008  00000000  RWIX
      DCSM_OTP_Z1_PSWDLOCK  00078010   00000002  00000002  00000000  RWIX
    ...

    因此、这些值似乎已在映射文件中正确设置、且应由 XDS110在 OTP 中的这些确切地址上进行刷写、但刷写过程失败。

    您是否愿意回答以下问题:

    1) 1) F280034是否完全需要在 OTP 中进行写入、以便从闪存中的第一个位置引导? 正如我在第一篇文章中所写的、该 MCU 和 F280033不是从0x80000开始、而是从0x88000开始。 但数据表指出它们应该能够从 flsah 引导、并且我希望对于这些 MCU、BootROM 应该跳转至0x88000、而不是0x80000。 但我在数据表或参考手册中找不到任何证明。 如果是这种情况、那么我根本不需要在 OTP 中进行写入、对吧? 但遗憾的是、没有调试器、MCU 无法引导、因此我假设它不能从0x88000引导

    2) 2)刷写时、此错误消息意味着什么?

    [错误] C28xx_CPU1:闪存编程期间出错(闪存算法返回错误代码0x00000000、FMSTAT (某些器件上的 STATCMD) 0x00000000)。 操作已取消。

    3) 3)看门狗是否生成了我在 XRS 引脚上获得的脉冲? 这是否意味着 BootROM 不会正确跳转到我的代码、因为我在代码中首先要做的是禁用看门狗?

    我在参考手册中检查过、如果 FMSTAT 为0、那么它不会标记任何错误、对吧?

    谢谢你。

    此致、

    Joao Peter.

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

    您好!

    我遇到的一个编译器错误(实际上是一个类似器错误)的示例是、当使用 CCS 中的280034链接器文件时、并且在编译期间、我得到以下错误:

    "../28003x_generic_flash_lnk.cmd"、第45行:错误#10468-D:内存范围组"Memory_Group_1"包含间隙。 "FLASH_BANK0_sec7_do_not_use"在地址0x88000处结束、"FLASH_BANK1_SEC0"在地址0x90000处开始。 组不能包含缝隙。
    错误#10010:链接过程中遇到错误;

    该链接器是来自 CCS 的链接器、仅作为参考附加(假设闪存扇区与数据表不匹配、 但是、当前问题与间隙有关、之后、如果我移除该 CRC 生成、调试器会给我一个错误、即0x80000不是有效的闪存空间):

    /*
    //###########################################################################
    //
    // FILE:	F280034_flash_lnk.cmd
    //
    // TITLE:	Linker Command File For F280034 Device
    //
    //###########################################################################
    */
    MEMORY
    {
    
       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" */
    
    
       RAMLS0           : origin = 0x00008000, length = 0x00000800
       RAMLS1           : origin = 0x00008800, length = 0x00000800
       RAMLS2           : origin = 0x00009000, length = 0x00000800
       RAMLS3           : origin = 0x00009800, length = 0x00000800
       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 */
       //RAMLS            : origin = 0x00008000, length = 0x00004000
    
       RAMGS0           : origin = 0x0000C000, length = 0x00001000
       RAMGS1           : origin = 0x0000D000, length = 0x00001000
       RAMGS2           : origin = 0x0000E000, length = 0x00001000
       RAMGS3           : origin = 0x0000F000, length = 0x00000FF8
    // RAMGS3_RSVD       : origin = 0x000FFF8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
       BOOTROM          : origin = 0x003F8000, length = 0x00007FC0
       SECURE_ROM       : origin = 0x003F2000, length = 0x00006000
    
       RESET            : origin = 0x003FFFC0, length = 0x00000002
    
    #ifdef __TI_COMPILER_VERSION__
       #if __TI_COMPILER_VERSION__ >= 20012000
    GROUP {      /* GROUP memory ranges for crc/checksum of entire flash */
       #endif
    #endif
       BEGIN           	: origin = 0x00080000, length = 0x00000002
       /* 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 = 0x000FF0
       FLASH_BANK0_SEC7_DO_NOT_USE : origin = 0x087FF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
       /* BANK 1 */
       FLASH_BANK1_SEC0  : origin = 0x090000, length = 0x001000
       FLASH_BANK1_SEC1  : origin = 0x091000, length = 0x001000
       FLASH_BANK1_SEC2  : origin = 0x092000, length = 0x001000
       FLASH_BANK1_SEC3  : origin = 0x093000, length = 0x001000
       FLASH_BANK1_SEC4  : origin = 0x094000, length = 0x001000
       FLASH_BANK1_SEC5  : origin = 0x095000, length = 0x001000
       FLASH_BANK1_SEC6  : origin = 0x096000, length = 0x001000
       FLASH_BANK1_SEC7  : origin = 0x097000, length = 0x000FF0
       FLASH_BANK1_SEC7_DO_NOT_USE : origin = 0x097FF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
    #ifdef __TI_COMPILER_VERSION__
      #if __TI_COMPILER_VERSION__ >= 20012000
    }  crc(_ccs_flash_checksum, algorithm=C28_CHECKSUM_16)
      #endif
    #endif
    
    }
    
    
    SECTIONS
    {
       codestart        : > BEGIN, ALIGN(8)
       .text            : >> FLASH_BANK0_SEC2 | FLASH_BANK0_SEC3 | FLASH_BANK0_SEC4,   ALIGN(8)
       .cinit           : > FLASH_BANK0_SEC1,  ALIGN(8)
       .switch          : > FLASH_BANK0_SEC1,  ALIGN(8)
       .reset           : > RESET,                  TYPE = DSECT /* not used, */
    
       .stack           : > RAMM1
    
    #if defined(__TI_EABI__)
       .init_array      : > FLASH_BANK0_SEC1,  ALIGN(8)
       .bss             : > RAMLS5
       .bss:output      : > RAMLS3
       .bss:cio         : > RAMLS0
       .data            : > RAMLS5
       .sysmem          : > RAMLS5
       .const           : > FLASH_BANK0_SEC4,  ALIGN(8)
    #else
       .pinit           : > FLASH_BANK0_SEC1,  ALIGN(8)
       .ebss            : > RAMLS5
       .esysmem         : > RAMLS5
       .cio             : > RAMLS0
       .econst          : > FLASH_BANK0_SEC4,  ALIGN(8)
    #endif
    
        ramgs0 : > RAMGS0
        ramgs1 : > RAMGS0
    
        /*  Allocate IQ math areas: */
       IQmath           : > FLASH_BANK0_SEC1, ALIGN(8)
       IQmathTables     : > FLASH_BANK0_SEC2, ALIGN(8)
    
       .TI.ramfunc      : LOAD = FLASH_BANK0_SEC1,
                          RUN = RAMLS0,
                          LOAD_START(RamfuncsLoadStart),
                          LOAD_SIZE(RamfuncsLoadSize),
                          LOAD_END(RamfuncsLoadEnd),
                          RUN_START(RamfuncsRunStart),
                          RUN_SIZE(RamfuncsRunSize),
                          RUN_END(RamfuncsRunEnd),
                          ALIGN(8)
    
       /* crc/checksum section configured as COPY section to avoid including in executable */
       .TI.memcrc          : type = COPY
    
    }
    /*
    //###########################################################################
    // End of file.
    //###########################################################################
    */
    

    这是一条信息、只是因为你问的。 如果我删除了 CRC 代数、调整闪存空间、然后在尝试使用调试器刷写时从第一篇文章中收到错误:

    [错误] C28xx_CPU1:闪存编程期间出错(闪存算法返回错误代码0x00000000、FMSTAT (某些器件上的 STATCMD) 0x00000000)。 操作已取消。
    [ERROR] C28xx_CPU1:请确保您正在编程的存储器位置尚未进行编程。
    [错误] C28xx_CPU1:在安全操作期间遇到错误。 操作已取消。

    此致、

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

    尊敬的 Peter:

    感谢您提供的信息。  我将在下周回到办公室后再做评论,并与您联系。

    此致、
    Vamsi

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

    您好 Vamsi、

    谢谢你,我会等你的答复。 正如我在上面的文章中所承诺的、我现在也检查了使用闪存 API 时会发生什么。 我采用了名为"flashapi_ex1_programming"的示例工程、我调整了链接器、GEL 文件等、并更新了主函数、以包含以下初始化代码:

    #define FLASH0CTRL_BASE           0x0005F800U
    #define FLASH0ECC_BASE            0x0005FB00U
    #define DCSM_Z1OTP_BASE           0x00078000U
    
    Flash_initModule(FLASH0CTRL_BASE, FLASH0ECC_BASE, 5);
    
    Fapi_initializeAPI(FLASH0CTRL_BASE, DEVICE_SYSCLK_FREQ/1000000U);
    Fapi_setActiveFlashBank(Fapi_FlashBank0);		//Fapi_ = 0 in the enum in Types.h
    
    Buffer[0] = 0x5AFF;
    Buffer[1] = 0xFF20;
    Buffer[2] = 0x5AFF;
    Buffer[3] = 0xFFFF;
    Buffer[4] = 0xFFFF;
    Buffer[5] = 0x0623;
    Buffer[6] = 0xFFFF;
    Buffer[7] = 0xFFFF;
    
    Fapi_issueProgrammingCommand((uint32 *)DCSM_Z1OTP_BASE + 8,Buffer, 8, 0, 0, Fapi_AutoEccGeneration);

    与示例中一样、这个代码从 RAM 中执行、这样、不会与闪存空间发生冲突(也许这只对闪存空间有必要、而不是 OTP、但是它没有坏处)。

    现在、该代码中最后一个函数返回的错误为"无效地址"。 可能我设置的内容不正确、但我不确定我在"Fapi_initializeAPI"中提供的地址是什么、可能你没有将 OTP 记为闪存的一部分(这是我的预期)。 但枚举引脚仅 bank0、bank1和 bank2、没有可用的 OTP 选项。 那么我应该在"Fapi_setActiveFlashBank"中提供什么地址、或许我应该删除这个功能。

    很遗憾、闪存 API 目前无法正常工作、但我还想重点讨论使用调试器时的问题、而不是闪存 API。

    谢谢你。

    此致、

    Joao Peter.

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

    尊敬的 Peter:

    好的、在查看更新时会考虑这一点。

    谢谢。此致、

    Vamsi

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

    尊敬的 Vamsi:

    您对此主题有任何更新吗?

    谢谢你

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

    尊敬的 Peter:

    我今天将回顾这一点。   

    谢谢。此致、

    Vamsi

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

    尊敬的 Joao Peter:

    感谢您提供的信息。

    1)根据您与 Baskaran (引导专家)的互动,他确认您确实需要对 OTP 进行编程,以使应用程序从0x88000引导。

    2) 2)错误表示未发出 PROGRAM 命令-如果发出该命令、则会给出 fmstat 非零的故障状态。  由于地址无效等原因、未发出编程命令

    3) 3)它可以是看门狗、因为您的应用由于 OTP 程序故障而未在引导。

    请注意:我们的团队正在尝试购买一些 F280034器件来尝试这一点。

    谢谢。此致、

    Vamsi

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

    尊敬的 Joao Peter:

    感谢您使用闪存 API 进行实验并提供您获得的结果。   

    让我来回顾一下并返回给您。

    您已确认可以在 F280039中对相同的 OTP 位置进行编程、但在 F280034中无法对相同的 OTP 位置进行编程-对吗?

    谢谢。此致、
    Vamsi

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

    尊敬的 Vamsi:

    谢谢你。

    1) 1)我找不到 Baskaran 确认默认情况下 F280034将引导至0x80000的位置、并且我需要写入 OTP 才能启动软件。 因为这样文档就不正确了。 Bootrom 只是闪存、闪存从0x88000开始、因此、如果默认跳转到0x80000、则不只是闪存。 在任一情况下、您能否再次检查并确认它跳至 F280034至0x80000是否正确、并且写入 OTP 以便可以从闪存引导是固有的? 我知道情况是这样的、这一点很重要。 请再次检查、如果更新勘误表可能会很好。

    3)好的、由于 KMay 的另一个问题与此问题完全相同、我希望您很快就能找到一些 F280034器件。 需要1-2天还是更长时间?

    编辑:有趣的是,巴斯卡兰确认他能够在 F280034的 OTP 中闪存,检查他上面的帖子。 这是奇怪的,要么他不理解我的问题,或者他真的成功了。 也许您可以与他联系、他应该已经拥有您可以借用的 F280034进行测试

    谢谢你。

    此致

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

    我尚未尝试在 F280039中进行闪存、因为它工作正常且引导正常。 由于我们目前仅有1个、因此我现在不想尝试。 如果我们仍然遇到这个问题、我可以在您尝试对 F280034进行一些试用。 但 OTP 不起作用是没有原因的、因为您的同事已经确认它在 F280039上运行、KMay 也在另一个线程中证实了这一点

    此致、

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

    尊敬的 Joao Peter:

    巴斯卡兰说,你做了正确的步骤-然而,我已经把他弄丢了,以确认你是否需要编程 OTP。  如果它需要在 BootROM 章节中进行更新、他将负责更新。   

    是的、我同意您不应浪费您的设备。  我们的团队正在尝试获取样片-这些样片应该能在几天后(而不是几周)获得。

    谢谢。此致、
    Vamsi

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

    尊敬的 Vamsi:

    感谢您的快速回复、我将等待您关于 OTP 问题的更新以及闪存中 BootROM 的跳转地址确认。

    此致、

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

    尊敬的 Joao:

    关于您的闪存 API 使用问题: Fapi_FlashBank0对于存储体0的 OTP 来说足够了。

    当然、我们会在几天后与您联系。

    谢谢。此致、
    Vamsi

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

    尊敬的 Joao:

    您能否附上所使用的 F280034器件的快照?

    谢谢。此致、
    Vamsi

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

    尊敬的 Vamsi:

    快照是什么意思? 物理组件的照片? 或存储器快照? 或别的什么东西?

    此致

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

    尊敬的 Joao:

    请发送物理组件的照片。

    谢谢。此致、
    Vamsi

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

    尊敬的 Joao:

    我想我发现了这个问题。  我将为您提供新的工具文件、您可以使用该文件来避免这一问题。  请预计一两天内有更新。

    谢谢。此致、

    Vamsi

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

    请发送器件快照、以备不时之需。

    谢谢。此致、
    Vamsi

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

    尊敬的 Vamsi:

    这听起来很棒、谢谢。 我等不及要解决这个问题:)。

    编辑:明天早上,我会给你发送一张快照,因为这里几乎是午夜。

    此致、

    Joao Peter.

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

    尊敬的 Joao:

    当然、明天就可以了。

    请在明天回来的时候给我发送一个朋友请求,这样我就可以脱机发送给您尝试。

    谢谢。此致、
    Vamsi

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

    尊敬的 Joao Peter:

    我将解决方案发送给了您离线。

    请让我知道情况如何。

    谢谢。此致、
    Vamsi

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

    尊敬的 Joao Peter:

    我看到您对另一个帖子的回复、认为所提供的解决方案适合您。   

    感谢您的确认。

    我们将与 CCS/Uniflash 团队合作、在下一个修订版中发布此更新。

    我现在可以关闭此帖子吗?   

    此致、
    Vamsi

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

    尊敬的 Vamsi:

    这是承诺的 hte 组件图像。

    是的、问题已解决。 为了给可能遇到此问题的其他人编写代码、我仅尝试了由链接器文件寻址的指定位置中的变量、 即它们出现在映射文件中、当然也出现在输出文件中、然后我使用调试器通过 CCS 刷写输出文件、并且 OTP 存储器被更新。 我还想通过 CCS 进行尝试、比我要在这里写回的时间长、但自从您现在编写代码以来、我可以确认此更新已修复此问题。 感谢您的支持。 请关闭此主题。

    此致

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

    尊敬的 Joao Peter:

    非常感谢你提请我们注意这个问题。   

    祝你度过美好的一天!

    此致、
    Vamsi