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.

[参考译文] CCS/LAUNCHXL-F28069M:片上闪存操作与 RAM 调试不同、RAM 调试模式和闪存模式之间的 cmd 和系统配置原则是什么?

Guru**** 2526880 points
Other Parts Discussed in Thread: LAUNCHXL-F28069M

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/669686/ccs-launchxl-f28069m-on-chip-flash-operation-is-different-to-ram-debug-what-is-the-principle-in-cmd-and-system-configuration-between-ram-debug-mode-and-flash-mode

器件型号:LAUNCHXL-F28069M

工具/软件:Code Composer Studio

您好!

我正在使用 LAUNCHXL-F28069M。

我的代码在 RAM 调试模式下按我的意愿运行。

然后、我将 cmd 从"F2806X_CLA_C_lnk.cmd"修改为如下所示、并希望在闪存模式下运行、但无法像在 RAM 调试模式下那样运行。

我已经测试了"Example_2806xFlash"、它可以与 LAUNCHXL-F28069M 配合使用。

我的 cmd 文件有什么问题? 还是在我的配置中?

我的 cmd 文件:(F2806x_Headers_nonBIOS.cmd 未被修改)

--------------------------------------------------------------------

--define=CLA_C=1
--define=_FLASH

_Cla1Prog_Start =_Cla1ProgRunStart;

存储器

第0页:/*  程序内存*/
          /*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/
  CLAPROGRAM :origin = 0x009000,length = 0x001000    //片上 RAM 块 L3 */
  RAMM0      :origin = 0x000050、length = 0x0003B0    //片上 RAM 块 M0 *
  RAML5L8    :origin = 0x00C000、length = 0x008000
  OTP        :origin = 0x3D7800,length = 0x000400    //片上 OTP */

  FLASHH     :origin = 0x3D8000,length = 0x004000    //片上闪存*/
  FLASHG     :origin = 0x3DC000、length = 0x004000    //片上闪存*/
  FLASHF     :origin = 0x3E0000,length = 0x004000    //片上闪存*/
  FLASHE     :origin = 0x3E4000、length = 0x004000    //片上闪存*/
  FLASHD     :origin = 0x3E8000、length = 0x004000    //片上闪存*/
  FLASHC     :origin = 0x3EC000,length = 0x004000    //片上闪存*/
  FLASHA     :origin = 0x3F4000,length = 0x003F7E    //片上闪存*/
  CSM_RSVD   :origin = 0x3F7F7E,length = 0x000076    // FLASHA 的一部分。  当 CSM 正在使用时、使用所有0x0000进行编程。 *
  begin      :origin = 0x3F7FF4,length = 0x000004    /* FLASHA 的一部分。  用于"引导至闪存"引导加载程序模式。 *
  CSM_PWL_P0 :origin = 0x3F7FF8,length = 0x000008    // FLASHA 的一部分。  FLASHA 中的 CSM 密码位置*/

  FPUTABLES  :origin = 0x3FD860,length = 0x0006A0    //引导 ROM 中的 FPU 表*/
  IQTABLES   :origin = 0x3FDF00,length = 0x000B50    //引导 ROM 中的 IQMath 表*
  IQTABLES2  :origin = 0x3FEA50,length = 0x00008C    //引导 ROM 中的 IQMath 表*
  IQTABLES3  :origin = 0x3FEADC,length = 0x0000AA    /*引导 ROM 中的 IQMath 表*/

  ROM        :origin = 0x3FF3B0,length = 0x000C10    //引导 ROM */
  复位      :origin = 0x3FFFC0,length = 0x000002    //引导 ROM 的部分 */
  向量    :origin = 0x3FFFC2,length = 0x00003E    //引导 ROM 的部分 */

第1页:/*  数据存储器*/
          /*内存(RAM/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/
          /*寄存器保留在第1页                                                 中*/

  BOOT_RSVD  :origin = 0x000000,length = 0x000050    // M0的一部分,引导 ROM 将此用于栈*/
  RAMM1      :origin = 0x000400、length = 0x000400    //片上 RAM 块 M1 *

  CLA1_MSGRAMLOW :origin = 0x001480,length = 0x000080
  CLA1_MSGRAMHIGH:origin = 0x001500,length = 0x000080

  CLARAM0    :origin = 0x008800,length = 0x000400   //片上 RAM 块 L1 */
  CLARAM1    :origin = 0x008C00,length = 0x000400   //片上 RAM 块 L2 */
  CLARAM2    :origin = 0x008000、length = 0x000800   //片上 RAM 块 L0 */

  RAML4      :origin = 0x00A000、length = 0x002000    //片上 RAM 块 L4 */
  USB_RAM    :origin = 0x040000、length = 0x000800    // USB RAM       *
  FLASHB     :origin = 0x3F0000,length = 0x004000    //片上闪存*/


/*将段分配给内存块。
  注:
        DSP28_CodeStartBranch.asm 中用于重定向代码的 codestart 用户定义段
                  闪存时执行
        ramfuncs 用户定义的段来存储将从闪存复制到 RAM 中的函数
*


部分


  /*分配计划领域:*/
  codestart          :> begin,     page = 0
#IF 定义(RAM)
  .cinit             :> RAMM0,     page = 0
  .pinit             :> RAMM0,     page = 0
  .text              :> RAML5L8,   page = 0
  ramfuncs           :>RAML5L8,   page = 0
  .econst            :> RAML5L8,   PAGE = 0
  switch            :>RAMM0,     page = 0
   IQMath            :> RAML5L8,   page = 0           /*数学代码*/
  Cla1Prog           :{_Cla1ProgRunStart=.;}> CLAPROGRAM,
                                      PAGE = 0
  CLA1mathTables     :> CLARAM1,   page = 1.
#elif defined (_flash)
  .cinit             :> FLASHA,    page = 0
  .pinit             :> FLASHA,    page = 0
  .text              :> FLASHA,    page = 0

  ramfuncs           :load = FLASHD,
                        运行= RAML5L8、
                        load_start (_RamfuncsLoadStart)、
                        run_start (_RamfuncsRunStart)、
                   load_size (_RamfuncsLoadSize)、
                        PAGE = 0
  /*将初始化段放入闪存中*/
  /*要使 SDFlash 对这些内容进行编程、必须将它们分配到第0页*/
  econst            :> FLASHA,    PAGE = 0
  .switch            :> FLASHA,    PAGE = 0
  IQMath             :> FLASHA,    page = 0           /*数学代码*/

  Cla1Prog           :load = FLASHD,
                        运行= CLAPROGRAM、
                        Load_start (_Cla1ProgLoadStart)、
                        load_size (_Cla1ProgLoadSize)、
                        run_start (_Cla1ProgRunStart)、
                        PAGE = 0

  CLA1mathTables     :load = FLASHB,
                        运行= CLARAM2、
                        Load_start (_CLA1mathTablesLoadStart)、
                        load_size (_CLA1mathTablesLoadSize)、
                        run_start (_CLA1mathTablesRunStart)、
                        PAGE = 1.
其他
#ERROR 将"RAM"或"_flash"添加到 C2000链接器->高级选项->命令文件预处理->-define
ENDIF//RAM

  csmpasswds         :>csm_PWL_P0,page = 0
  csm_rsvd           :>csm_RSVD,  page = 0

  /*分配未初始化的数据段:*/
  .stack             :>RAML4,     page = 1.
  .ebss              :> RAML4,     PAGE = 1
  .esysmem           :>RAML4,     page = 1.

  /*分配 IQ 数学区域:*/
  IQmathTables       :>IQTABLES,  PAGE = 0,TYPE = NOLOAD

  /*分配 FPU 数学区域:*/
  FPUmathTables      :> FPUTABLES, PAGE = 0,TYPE = NOLOAD

  Cla1ToCpuMsgRAM :> CLA1_MSGRAMLOW,  page = 1.
  CpuToCla1MsgRAM :>CLA1_MSGRAMHIGH, PAGE = 1.
  Cla1DataRam0      :> CLARAM0,       PAGE = 1
  Cla1DataRam1      :> CLARAM1,       PAGE = 1
  Cla1DataRam2      :> CLARAM2,       PAGE = 1.

  /*分配 CLA "C"区域*/
#ifdef CLA_C
  /* CLA C 编译器段*/
  //
  //必须被分配给 CLA 具有写入访问权限的内存
  //
  暂存区     :> CLARAM1,      PAGE = 1
  .bss_cla         :> CLARAM2,      page = 1.
  .const_CLA      :> CLARAM2、      PAGE = 1.
#endif //cla_C


 /*如果调用 IQNexp()或 IQexp(),请取消注释以下部分
     库中的函数、以便利用
     引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
     1个等待状态)。 如果此部分未注释、则为 IQmathTables2
     将被加载到其他存储器(SARAM、闪存等)中并将采用
     上行空间、但0等待状态是可能的。
  *
  /*
  IQmathTables2   :> IQTABLES2,PAGE = 0,TYPE = NOLOAD
  {

             IQMath.lib (IQmathTablesRam)

  }
  *
   /*如果调用 IQNasin ()或 IQasin (),请取消注释以下部分
      库中的函数、以便利用
      引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
      1个等待状态)。 如果此部分未注释、则为 IQmathTables2
      将被加载到其他存储器(SARAM、闪存等)中并将采用
      上行空间、但0等待状态是可能的。
   *
   /*
   IQmathTables3   :> IQTABLES3,PAGE = 0,TYPE = NOLOAD
   {

              IQMath.lib (IQmathTablesRam)

   }
   *

  /*.reset 是编译器使用的标准段。  它包含*/
  /* C 代码_c_int00起始地址。   /*
  /*当使用引导 ROM 时,此部分和 CPU 矢量*/
  /*不需要表。  因此、默认类型设置为 */
  /* DSECT */
  .reset             :> reset,     page = 0,type = DSECT
  VECTORS            :> VECTORS,   PAGE = 0,TYPE = DSECT



--------------------------------------------------------------------

main.c 文件:


--------------------------------------------------------------------

#include "DSP28x_Project.h"    //器件头文件和示例 include 文件
#include "Init.h"

//这些由链接器定义
ifdef 闪存
   extern UINT16 RamfuncsLoadStart;
   extern UINT16 RamfuncsRunStart;
   extern UINT16 RamfuncsLoadSize;
#endif

void main (void)

   Dint;

   InitSysCtrl();

ifdef 闪存
   memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(uint32)&RamfuncsLoadSize);
   InitFlash();
#endif

   InitGpio();

   Dint;

   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
   InitPieVectTable();

   InitCpuTimer();
   InitCLA();
   InitADC();
   InitEPwm();
   InitECAN();
   InitSCI();
   InitSPI();
   InitI2C();

   EINT;  //启用全局中断 INTM
   ERTM;  //启用全局实时中断 DBGM

//   Cla1ForceTask8andWait();

   while (1){

   }


--------------------------------------------------------------------

谢谢、

LAUNCHXL-F28069M

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好、Chen
    问题是什么? 无法构建项目? 或者它没有加载到存储器中? 或者在运行时失败?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Disona:

    可以构建项目并加载到闪存中。
    但是、它无法正常工作。 例如、在 RAM 模式下、PWM 生成、但在闪存模式下、不会生成信号。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯。 您是否使用 JTAG 加载项目? 您能否在"InitEPwm()"之后设置断点并确保正确输入 EPWM 寄存器?
    您的"main.c"中是否包含"flash" deifini"? 我可以看到"cmd"中有"-define=_flash"、 但主函数中没有"#define flash"。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Disona:

    感谢您的回复。
    板载 XDS100V2用于加载项目。 #define 闪存在"init.h"中完成。
    当我在 CCS 中加载项目并进行调试时、它的运行是正确的。 但是,在断电和重新上电后,它不起作用。

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

    也许您应该三次调用"memcpy()"? 因为我可以看到、您有"Cla1Prog"和"CLA1mathTables"部分、必须从闪存复制到 RAM、但您只针对"ramfuncs"部分调用"memcpy()"。

    还是在"InitCLA()"中完成?

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

    我已经检查了映射文件。 我的项目和 Example_2806xFlash 之间的情况不同、如下所示。
    例如,其 example_28069Flash.c 文件(example_28069Flash.obj)是 ramfuncs 输入段的一部分。
    但在我的项目中、main.c 文件(main.obj)不包含在 ramfuncs 中。
    原因是什么?

    例如:
    ----------------------------------------------------
    输出 属性/
    分区页面来源 长度 输入段
    ---- -------- ------ --------
    ramfuncs 0 003e8000 00000063 运行 ADDR = 00008000
    003e8000 00000044 示例_28069Flash.obj (ramfuncs:retain)
    003e8044 0000001b F2806x_sysctrl.obj (ramfuncs)
    003e805f 00000004 F2806x_usDelay.obj (ramfuncs)
    ----------------------------------------------------

    在我的项目中:
    ----------------------------------------------------
    ramfuncs 0 003e80c0 0000001f 运行 ADDR = 0000c000
    003e80c0 0000001b F2806x_sysctrl.obj (ramfuncs)
    003e80db 00000004 F2806x_usDelay.obj (ramfuncs)
    ----------------------------------------------------
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您会看到、由于中断被放置在示例中的 ramfuncs 部分中:
    #pragma CODE_SECTION (epwm1_timer_ISR、"ramfuncs");
    #pragma CODE_SECTION (epwm2_timer_ISR、"ramfuncs");

    如果"main.c"中有一些必须在 RAM 中复制的函数、您也会在映射文件中看到"retain"。 还可以。
    问题在其他方面也是严重的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Chen、

    您能否对此进行更新-您是否仍然看到在闪存配置中未生成 PWM 信号的问题?
    我已经查看了您的链接器命令文件、看起来不错。 我看到您将 RAML3用于正确的 CLA 程序代码。

    一个可能有助于查看项目并与之进行比较的示例:
    示例_2806xClaAdcFirFlash

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

    问题确实位于链接器命令文件中。

    我重新编码我的 cmd 文件、它工作正常。

    新的 cmd 代码为:

    ________________________________________________________________

    _Cla1Prog_Start=_Cla1ProgRunStart;

    存储器

    第0页:/*程序内存*/
    CLAPROGRAM:origin = 0x009000,length = 0x001000//片上 RAM 块 L3 */
    /*RAML0 :origin = 0x008000、length = 0x000800 *//*片上 RAM 块 L0 */
    /*RAML1. :origin = 0x008800,length = 0x000400 */*片上 RAM 块 L1 */
    /*RAMM0 :origin = 0x000050、length = 0x0003B0*//*片上 RAM 块 M0 */
    /*RAML5L8. :origin = 0x00C000、length = 0x008000*/
    RAML8. :origin = 0x012000、length = 0x002000 /*片上 RAM 块 L8 */
    OTP :origin = 0x3D7800,length = 0x000400//片上 OTP */

    FLASHH :origin = 0x3D8000,length = 0x004000 /*片上闪存*/
    FLASHG :origin = 0x3DC000、length = 0x004000 /*片上闪存*/
    FLASHF :origin = 0x3E0000、length = 0x004000 /*片上闪存*/
    FLASHE :origin = 0x3E4000,length = 0x004000 /*片上闪存*/
    FLASHD :origin = 0x3E8000、length = 0x004000 /*片上闪存*/
    FLASHC :origin = 0x3EC000、length = 0x004000 /*片上闪存*/
    FLASHA :origin = 0x3F4000,length = 0x003F80 /*片上闪存*/

    csm_RSVD:origin = 0x3F7F80,length = 0x000076 /* FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 *
    开始 :origin = 0x3F7FF6,length = 0x000002 /* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 *
    CSM_PWL_P0:origin = 0x3F7FF8,length = 0x000008 /* FLASHA 的一部分。 FLASHA 中的 CSM 密码位置*/

    FPUTABLES:origin = 0x3FD860,length = 0x0006A0//引导 ROM 中的 FPU 表*/
    IQTABLES:origin = 0x3FDF00,length = 0x000B50 /*引导 ROM 中的 IQMath 表*/
    IQTABLES2:origin = 0x3FEA50,length = 0x00008C /*引导 ROM 中的 IQMath 表*/
    IQTABLES3:origin = 0x3FEADC,length = 0x0000AA/*引导 ROM 中的 IQMath 表*/

    ROM :origin = 0x3FF3B0,length = 0x000C10 /*引导 ROM */
    复位 :origin = 0x3FFFC0,length = 0x000002 /*引导 ROM 的一部分*/
    矢量 :origin = 0x3FFFC2,length = 0x00003E /*引导 ROM 的一部分*/

    第1页:/*数据存储器*/
    BOOT_RSVD:origin = 0x000000,length = 0x000050 // M0的一部分,引导 ROM 将此用于堆栈*/
    RAMM0 :origin = 0x000050、length = 0x0003B0 /*片上 RAM 块 M0 */
    RAMM1 :origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 */
    /*RAML2. :origin = 0x008C00,length = 0x000400 */*片上 RAM 块 L2 */
    RAML3. :origin = 0x009000、length = 0x001000//片上 RAM 块 L3 */
    RAML4. :origin = 0x00A000、length = 0x002000 /*片上 RAM 块 L4 */
    RAML5. :origin = 0x00C000、length = 0x002000 /*片上 RAM 块 L5 */
    RAML6. :origin = 0x00E000、length = 0x002000 /*片上 RAM 块 L6 */
    RAML7. :origin = 0x010000,length = 0x002000 /*片上 RAM 块 L7 */

    CLA1_MSGRAMLOW:origin = 0x001480,length = 0x000080
    CLA1_MSGRAMHIGH:origin = 0x001500,length = 0x000080

    CLARAM0:origin = 0x008800,length = 0x000400//片上 RAM 块 L1 */
    CLARAM1:origin = 0x008C00,length = 0x000400//片上 RAM 块 L2 */
    CLARAM2:origin = 0x008000、length = 0x000800//片上 RAM 块 L0 */

    USB_RAM :origin = 0x040000、length = 0x000800 /* USB RAM */
    FLASHB :origin = 0x3F0000、length = 0x004000 /*片上闪存*/


    部分

    /*分配计划领域:*/
    .cinit:> FLASHA, PAGE = 0
    .pinit:> FLASHA,page = 0
    .text:> FLASHA,page = 0

    codestart:> begin,page = 0
    ramfuncs:load = FLASHD,
    运行= RAML8、
    load_start (_RamfuncsLoadStart)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    load_size (_RamfuncsLoadSize)、
    PAGE = 0

    /*分配 CLA 区域*/
    Cla1Prog:load = FLASHE,
    运行= CLAPROGRAM、
    Load_start (_Cla1ProgLoadStart)、
    load_size (_Cla1ProgLoadSize)、
    run_start (_Cla1ProgRunStart)、
    PAGE = 0

    CLA1mathTables:load = FLASHB,
    运行= CLARAM2、
    Load_start (_CLA1mathTablesLoadStart)、
    load_size (_CLA1mathTablesLoadSize)、
    run_start (_CLA1mathTablesRunStart)、
    PAGE = 1.

    Cla1ToCpuMsgRAM:> CLA1_MSGRAMLOW,page = 1.
    CpuToCla1MsgRAM:>CLA1_MSGRAMHIGH,PAGE = 1.
    Cla1DataRam0:> CLARAM0,PAGE = 1
    Cla1DataRam1:> CLARAM1,PAGE = 1
    Cla1DataRam2:> CLARAM2,PAGE = 1.

    /*分配 CLA‘C’区域*/
    暂存区:> CLARAM1,PAGE = 1
    .bss_cla:> CLARAM2,page = 1.
    .const_CLA:> CLARAM2、PAGE = 1.

    /*闪存中的初始化段*/
    /*要使 SDFlash 对这些内容进行编程、必须将它们分配到第0页*/
    econst:>FLASHA,PAGE = 0
    .switch:> FLASHA,PAGE = 0

    csmpasswds:>csm_PWL_P0,page = 0
    csm_rsvd:>csm_RSVD,page = 0

    /*分配未初始化的数据段*/
    .stack:>RAMM0,page = 1.
    .ebss:> RAML4,PAGE = 1
    .esysmem:>RAML5,page = 1.

    /*分配 IQ 数学区域*/
    IQMath:>FLASHA,PAGE = 0
    IQmathTables:>IQTABLES,PAGE = 0,TYPE = NOLOAD

    /*分配 FPU 数学区域*/
    FPUmathTables:>FPUTABLES,PAGE = 0,TYPE = NOLOAD

    /*.reset 是编译器使用的标准段。 *
    /*它包含 C 代码_c_int00的起始地址。 *
    /*使用引导 ROM 时,不需要此部分和 CPU 矢量表。 *
    /*因此,默认类型设置为 DSECT。 *
    .reset:> reset,page = 0,type = DSECT
    VECTORS:> VECTORS,PAGE = 0,TYPE = DSECT



    ________________________________________________________________