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:从基本 SysConfig 工程对 TMS320F280034上的闪存进行编程

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1279537/tms320f280034-programming-flash-on-a-tms320f280034-from-a-basic-sysconfig-project

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

我们使用 TMS320F280034PM (64引脚版本)开发新的原型。 作为对新电路板的基本测试、我们为此部件导入了一个示例 SysConfig 项目、只会切换 GPIO。 项目是"gpio_ex2_toggle"、我们在 SysConfig 中更改了 GPIO 引脚分配以驱动我们的板 LED。  

默认项目设置将程序放置在 RAM 中、当我们使用这些设置运行调试会话时、一切都可以正常运行、并且我们电路板上的 LED 正确闪烁。 我们希望确保也可以对闪存进行编程、因此将项目设置更改为使用"cpu1_flash"、而这样现在调用280003x_generic_flash_lnk.cmd 链接器文件。 当我们尝试编译和调试项目时、编译正确执行、但是当调试会话尝试启动时收到错误消息:-

看看此时的控制台输出、我们可以看到有关错误的更多细节:-

CCS 是否需要一些额外的配置设置才能对此器件上的闪存进行编程?

非常感谢。

伊恩

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

    尊敬的 Lain:

    请使用 CCS  版本:12.5.0。  如果这样不能解决您的问题、请告知我们。

    谢谢。此致、
    瓦姆西

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

    尊敬的 Vamsi:

    我目前正在使用  版本:11.2.0.00007、所以将更新到最新版本、并告知您这是否解决了问题。

    非常感谢。

    伊恩

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

    大家好、我刚刚更新到了 CCS 和 SysConfig 的最新版本。 CCS 版本为 12.5.0.00007、SysConfig 为1.18.0。

    目前、这还没有解决问题、我仍然收到内存验证错误、请参阅下文。 我目前正在使用280003x_generic_flash_lnk.cmd 文件-这是一个正确的文件吗?

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

    尊敬的 Lain:

    错误显示您在链接器命令文件中使用了地址0x80000。  该地址对 F280034无效。

    我将与我们的团队联系、看看我们是否有可以使用的特定于 F280034的链接器命令文件。   

    我会在一两天内回复您。

    谢谢。此致、

    瓦姆西

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

    谢谢 Vamsi

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

    尊敬的 Lain:

    您能否使用 在 CCS 安装过程中提供的 F280034_flash_lnk.cmd?   

    路径: \ccs1240\ccs\ccs_base\cc2000\include  

    谢谢。此致、

    瓦姆西

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

    尊敬的 Vamsi:

    我在 CCS 中的那个位置尝试了 F280034_flash_lnk.cmd 文件(不过我的版本是12.5)、但在链接时仍收到错误。 以下是错误指示的内容:-

     

    我看了 CMD 文件以尝试了解可能的错误是什么、至少第一个错误似乎是关于'Begin'位置和第一组闪存(FLASH_BANK0_SEC8)之间的组存储器范围的不连续性。 另外、在文件的"注意"部分下、引用了文件的"存储"部分中未定义的几个存储器区域。 280034器件在组0中似乎没有定义扇区0至7、我在查看数据表中器件的存储器映射时确认了这一点。 此 CMD 文件是否正确、或者我在这里是否会产生误解?

    谢谢。

    伊恩

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

    lain,

    是的、F280034器件中不提供组0的前半部分。

    您是说链接器命令文件中定义了这些存储器吗?

    谢谢。此致、

    瓦姆西

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

    Vamsi、您好。F280034_flash_lnk.cmd 文件定义了两个闪存组、FLASH_BANK0_SEC8至15、FLASH_BANK1_SEC0至7:-

    我认为这是正确的、因为它与 F290034数据表中的存储器映射相匹配。 但是、同一个 F280034_flash_lnk.cmd 文件随后尝试引用文件的"设置"部分中未定义的闪存段。 您可以看到、该函数尝试引用 FLASH_BANK0_SEC1等段、我认为这些段不正确。

    我可能会误解这些链接器文件的工作方式、但我认为"内存"部分只能调用已在"内存"部分中明确定义的存储器区域?

    请帮我检查一下、因为我仍然无法编译到这个部件上的闪存。

    非常感谢、Iain

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

    尊敬的 Lain:

    是的、我查看过它-它是一个错误。  我要提交 JIRA、并通知生成它的团队。

    出于应用目的-可以使用看起来适合您应用的存储器(请将无效扇区替换为链接器命令文件的"SECTIONS"部分中的有效扇区。

    谢谢。此致、
    瓦姆西

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

    谢谢 Vamsi。 我将做出我认为需要做出的更改、并让您知道它是如何进行的。

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

    您好、Vamsi、我按如下方式修改了连接器文件、现在可以对闪存进行编程。 除了更新"开始"部分中调用的存储器部分之外、我还需要修改 BEGIN Address 是 FLASH_BANK0_SEC8的开头(即0x88000)和 FLASH_BANK0_SEC8的开头/长度。 请您检查一下这些内容是否合理? 我现在可以对闪存进行编程、但在下电上电时该程序似乎没有运行、因此可能我放错了起始地址?

    /*
    //###########################################################################
    //
    // 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 = 0x00088000, length = 0x00000002
       /* Flash sectors */
       /* BANK 0 */
       FLASH_BANK0_SEC8  : origin = 0x088002, length = 0x000FFE
       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 = 0x001000
    
       /* 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_SEC10 | FLASH_BANK0_SEC11 | FLASH_BANK0_SEC12,   ALIGN(8)
       .cinit           : > FLASH_BANK0_SEC9,  ALIGN(8)
       .switch          : > FLASH_BANK0_SEC9,  ALIGN(8)
       .reset           : > RESET,                  TYPE = DSECT /* not used, */
    
       .stack           : > RAMM1
    
    #if defined(__TI_EABI__)
       .init_array      : > FLASH_BANK0_SEC9,  ALIGN(8)
       .bss             : > RAMLS5
       .bss:output      : > RAMLS3
       .bss:cio         : > RAMLS0
       .data            : > RAMLS5
       .sysmem          : > RAMLS5
       .const           : > FLASH_BANK0_SEC12,  ALIGN(8)
    #else
       .pinit           : > FLASH_BANK0_SEC9,  ALIGN(8)
       .ebss            : > RAMLS5
       .esysmem         : > RAMLS5
       .cio             : > RAMLS0
       .econst          : > FLASH_BANK0_SEC12,  ALIGN(8)
    #endif
    
        ramgs0 : > RAMGS0
        ramgs1 : > RAMGS0
    
        /*  Allocate IQ math areas: */
       IQmath           : > FLASH_BANK0_SEC9, ALIGN(8)
       IQmathTables     : > FLASH_BANK0_SEC10, ALIGN(8)
    
       .TI.ramfunc      : LOAD = FLASH_BANK0_SEC9,
                          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.
    //###########################################################################
    */
    

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

    您好、Lian:

    您的意思是说没有调试器时应用未在独立模式下执行?   

    如何配置引导模式 GPIO?  如果尚未启用、请尝试闪存引导模式。

    谢谢。此致、

    瓦姆西

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

    你好,Vamsi,很遗憾不是。 现在我可以对闪存进行编程、连接调试器后、可以启动应用运行。 但是、如果我移除调试器并重新启动电源、那么执行不会开始。  BOOT0和 BOOT1引脚都通过10k 电阻器在我们的板上连接到高电平、应该允许单元从闪存引导。

    请您检查我在上面随附的链接器文件中代码段的设置、这些代码段控制代码执行开始的位置(或者可能是复位矢量?) 我还在学习这些链接器文件的工作方式、所以不确定该部分是否正确。

    谢谢、Iain

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

    您好、Lian:

    我查看了 TRM (请参阅下面的 SNAP)-在此器件上,必须使用以下突出显示的值对 BOOTDEFx 进行编程,以找到您要使用的入口点。   

    谢谢。此致、
    瓦姆西

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

    谢谢 Vamsi。  

    好的、我也在280034数据表中找到了该部分、并且已经将 BOOTDEF1、2、3、4寄存器编程为从0x00088000地址开始。 这已经解决了问题、现在我们的定制电路板现在可以以独立模式引导。 非常感谢您的帮助。

    祝你一切顺利、Iain

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

    尊敬的 Iain:

    我一直在同一台设备上处理与此完全相同的问题。 我目前还没有刷写器件、但不确定如何设置 BOOTDEF 寄存器。 您能建议如何做到这一点吗?

    设置这些模式后、这是否意味着 SCI 等其他引导模式无法正常工作?

    谢谢。

    亚历克斯

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

    您好、Alex、我是通过导入"dcsm_security_tool"示例工程来实现这一点的:-

    我打开了 dcsm_security_tool.syscfg 文件、通过该文件、您可以在勾选 DCSM0下的"Configure Boot Setting"框时配置 BOOTDEFx 寄存器。 我设置了所需的 BOOTDEF 参数、然后当您编译和闪存此程序时、一次性寄存器会被设置。 然后、您可以关闭这个项目并重新闪存您自己的项目-它应该在之后工作。 请注意 BOOTDEFx 寄存器、这些寄存器和引导引脚都是一次性可编程的、因此如果您收到错误、则需要更换处理器! 也许有一个更简单的方法可以做到这一点、但这就是我所做的。

    我还没有深入研究此模式对其他引导模式的影响、请让我们了解您如何开始。

    谢谢、Iain

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

    尊敬的 Iain:

    感谢这些清晰的指示、它现在对我有效。

    我还将 BOOTDEF1、2、3、4设置为指向正确的闪存地址。 组装更多电路板后、我可以尝试将 BOOTDEF1仅设置为闪存、而将另一个设置为启用 SCI 引导。 然后、引导模式选择引脚应控制要使用的模式。 现在,所有道路都导致闪耀!

    亚历克斯

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

    请继续跟进。 如果 BOOTDEF1、2、3、4都设置为闪存入口点、则器件上不会有其他引导选项。 在本例中、我希望从闪存引导作为默认设置、但也希望选择从 SCI 引导以启用无线更新。 请参阅下面我使用的配置。

    我只需要使用一个引导引脚(在本例中为 GPIO24)。 我将 BOOTDEF1设置为闪存入口点、这在 GPIO24默认处于高电平时使用。 我使用指定的 SCI GPIO 将 BOOTDEF0 (GPIO24 = LOW)设置为 SCI 引导。

    感谢您指出这一点、尤其是 SysConfig 设置。 它让事情变得很容易。

    我在手册中阅读到、有用于调试目的的 BOOTDEF 仿真等效项、这样就可以在不写入 OTP 寄存器的情况下进行使用。 但我没有尝试它。

    谢谢!

    亚历克斯

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

    感谢 Alex、很高兴听到这个消息。 我目前还没有尝试从闪存以外的任何东西引导、但它在我的 TODO 列表中、借助您的信息、我有一个很好的机会使它工作。 非常感谢。