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:可保留存储器

Guru**** 2609695 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/682774/ccs-launchxl-f28069m-retentive-memory

器件型号:LAUNCHXL-F28069M

工具/软件:Code Composer Studio

您好!

我使用 Launchxl f28069m 套件。 我有一个用于99个数字的"数字"结构、每个数字结构都获取15个参数(uint16、float 等)。 我需要将所有这些99x15参数值保留在敏感(或非易失性)存储器中。 是否可以使用此套件或是否应该使用外部 EEPROM? 如果套件具有此功能、我认为我需要完整的存储器映射、大端字节序/小端字节序寻址协议文档。

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

    您应该能够将这些参数存储在器件的 Flash 存储器中、在擦除闪存之前保留这些值。

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

    嗯、我认为这可以解决我的问题。 但随后检查了以下主题:

    e2e.ti.com/.../419551

    "一般而言、闪存用于存储代码、并非用于频繁存储数据。 要更改闪存中的单个字、您需要擦除整个闪存扇区。"

    Alter 先生似乎是对的。 我将经常更改结构参数值。 我不应该擦除整个闪存扇区。

    您将用户定义的参数存储在类似类型的设计中的什么位置?

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

    我对存储器映射没有任何经验、但此代码完美地承载了我的结构地址。

    #pragma SET_DATA_SECTION (".econst")//.econst 或任何其他
    结构程序
    {
    uint16 aParameter;
    uint16 bParameter;
    uint16 cParameter;
    float32 dParameter;
    uint16 eParameter;
    uint16 fParameter;
    float32 gParameter;
    uint16 hParameter;
    uint16 iParameter;
    uint16 jParameter;
    uint16 kParameter;
    uint16 lParameter;
    float32 mParameter;
    uint16 nParameter;
    uint16 oParameter;
    };
    结构程序编号[99];
    #pragma SET_DATA_SECTION ()
    

    但是、我不知道作为非易失性用户定义的参数应在何处携带。 我有2个 cmd 文件。

    F2806x_flash_SymmetricPWM.CMD 如下:  

    ============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ 用于
    从闪存运行的*//*特定于用户的链接器命令文件*/
    /*==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //
    //*文件:F2806x_flash_SymmetricPWM.CMD
    // */
    /*说明:用户自定义段的链接器命令文件、专用于从
    闪存运行*//*。*/
    * */
    /*目标:TMS320F2806x*/
    * */
    *版本:1.0*/
    * */
    //*--------------------------------------------------------------------------------------------------------------- */
    /*版权所有德州仪器Copyright2010*/
    //*--------------------------------------------------------------------------------------------------------------- */
    /*修订历史记录: */
    //*--------------------------------------------------------------------------------------------------------------- */
    /*日期|说明 */
    //*--------------------------------------------------------------------------------------------------------------- */
    * 01/11/11|版本1.0*/
    //*--------------------------------------------------------------------------------------------------------------- //
    
    *定义 F2806x 的存储器块开始/长度
    PAGE 0将用于组织程序段
    PAGE 1将用于组织数据段
    
    注意:
    F2806x 上的存储器块是一致的(即相同的
    物理存储器)。
    不应该是相同的存储器区域
    同时为 PAGE 0和 PAGE 1定义。
    这样做将导致程序损坏
    和/或数据。
    
    L0存储器块被镜像-即
    它可以在高内存或低内存中访问。
    为简单起见、其中仅使用了一个实例
    链接器文件。
    
    可以是连续 SARAM 存储器块或闪存扇区
    如果需要、则进行组合以创建更大的存储器块。
    */
    
    MEMORY
    {
    PAGE 0:
    /*程序存储器*/*
    内存(RAM/FLASH/OTP)块可移动到 Page1进行数据分配*/
    
    BOOT_RSVD:origin = 0x000000,length = 0x000050 M0的//部分,引导 ROM 将此用于堆栈*/
    程序:origin = 0x008000,length = 0x000C00
    
    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
    :origin = 0x3F7FF8、length = 0x000008 /* FLASHA 的一部分。 FLASHA */
    
    FPUTABLES 中的 CSM 密码位置: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/FLASH/OTP)块可移动到 PAGE0进行程序分配*/
    */*寄存器保持在页1 */
    
    RAMM0上 :origin = 0x000050、length = 0x0003B0 /*片上 RAM 块 M0 */
    RAMM1 :origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 */
    DataRAM:origin = 0x008C00,length = 0x001400
    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 */
    RAML8 :origin = 0x012000、length = 0x002000 /*片上 RAM 块 L8 */
    FLASHB :origin = 0x3F4000,length = 0x002000
    }
    
    SECTIONS
    {//
    分配程序区域:*/
    .cinit:> FLASHA、 PAGE = 0.Pinit
    :> FLASHA、 PAGE = 0.text
    :> FLASHA、 PAGE = 0
    
    codestart :>开始 PAGE = 0
    ramfuncs :load = FLASHA,
    运行=程序、
    load_start (_RamfuncsLoadStart)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    PAGE = 0
    
    csmpasswds :>CSM_PWL PAGE = 0
    csm_rsvd :>csm_RSVD page = 0
    
    /*分配未初始化的数据段:*/
    .stack :> RAMM0, PAGE = 1.ebss
    :> DataRAM,page = 1
    .esysmem :> DataRAM, PAGE = 1
    
    /*初始化段进入闪存*/
    //*要使 SDFlash 对这些段进行编程、必须将它们分配到 PAGE 0 */
    .econst :> FLASHA PAGE = 0.switch
    :> FLASHA PAGE = 0
    
    /*分配 IQ 数学区域:*/
    IQmath :> FLASHA PAGE = 0 /*数学代码*/
    IQmathTables :>IQTABLES page = 0,type = NoLoad /* ROM 中的数学表*/
    
    /*如果调用 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)
    
    }
    *
    
    复位 :>重置, PAGE = 0、TYPE = DSECT
    向量 :>引导程序 PAGE = 0、TYPE = DSECT
    }
    
    SECTIONS
    {
    net_termins:> DataRAM,page = 1
    }
    

    F2806x_Headers_nonBIOS.cmd 如下:

    /*
    // TI 文件$Revision:/main/2 $
    //签入$Date:2011年1月4日10:00:20 $
    //##############################################################################################
    //
    ////文件:F2806x_Headers_nonBIOS.cmd
    //
    //标题:F2806x 外设寄存器链接器命令文件
    //
    //说明:
    //
    此文件用于非 BIOS 应用程序。
    //
    // 用于放置外设结构
    //的链接器命令文件 在 F2806x 头文件中使用、并将其放入正确的存储器
    // 映射的位置。
    //
    // 该版本的文件包含 PieVectorTable 结构。
    // 对于 BIOS 应用、请使用 F2806x_Headers_BIOS.cmd 文件
    // 它不包含 PieVectorTable 结构。
    //
    //##########################################################################################################################
    //$TI 发行版:2806x C/C++头文件和外设示例 V1.00 $
    //$发行 日期:2011年1月11日$
    //############################################################################
    */
    
    MEMORY
    {
    PAGE 0://程序存储器*/
    
    PAGE 1://数据存储器*/
    
    DEV_EMU :origin = 0x000880,length = 0x000105 /*器件仿真寄存器*/
    SYS_PWR_CTL:origin = 0x000985,length = 0x000003 /*系统功率控制寄存器*/
    flash_regs:origin = 0x000A80,length = 0x000060 /*闪存寄存器*/
    CSM :origin = 0x000AE0、length = 0x000020 /*代码安全模块寄存器*/
    
    ADC_Result:origin = 0x000B00,length = 0x000020 /* ADC 结果寄存器镜像*/
    
    CPU_TIMER0:origin = 0x000C00,length = 0x000008 /* CPU Timer0寄存器*/
    CPU_Timer1:origin = 0x000C08,length = 0x000008 /* CPU Timer1寄存器*/
    CPU_TIMER2:origin = 0x000C10,length = 0x000008 /* CPU Timer2寄存器*/
    
    PIE_CTRL:origin = 0x000CE0,length = 0x000020 /* PIE 控制寄存器*/
    PIE_VECT:origin = 0x000D00,length = 0x000100 /* PIE 矢量表*/
    
    DMA:origin = 0x001000、length = 0x000200// DMA 寄存器*/
    
    CLA1 :origin = 0x001400、length = 0x000080 /* CLA 寄存器*/
    
    McBSPA :origin = 0x005000,length = 0x000040// McBSP-A 寄存器*/
    
    ECANA :origin = 0x006000、length = 0x000040 /* eCAN-A 控制和状态寄存器*/
    ECANA_LAM:origin = 0x006040,length = 0x000040 /* eCAN-A 本地接受屏蔽*/
    ECANA_MOTS:origin = 0x006080,length = 0x000040 /* eCAN-A 消息对象时间戳*/
    ECANA_MOTO:origin = 0x0060C0、length = 0x000040 /* eCAN-A 对象超时寄存器*/
    ECANA_MBOX:origin = 0x006100、length = 0x000100 /* eCAN-A 邮箱*/
    
    COMP1 :origin = 0x006400,length = 0x000020 /*比较器+ DAC 1寄存器*/
    COMP2 :origin = 0x006420、length = 0x000020 /*比较器+ DAC 2寄存器*/
    COMP3 :origin = 0x006440、length = 0x000020 /*比较器+ DAC 3寄存器*/
    
    EPWM1 :origin = 0x006800,length = 0x000040 /*增强型 PWM 1寄存器*/
    EPWM2 :origin = 0x006840、length = 0x000040 /*增强型 PWM 2寄存器*/
    EPWM3 :origin = 0x006880、length = 0x000040 /*增强型 PWM 3寄存器*/
    EPWM4 :origin = 0x0068C0,length = 0x000040 /*增强型 PWM 4寄存器*/
    EPWM5 :origin = 0x006900,length = 0x000040 /*增强型 PWM 5寄存器*/
    EPWM6 :origin = 0x006940,length = 0x000040 /*增强型 PWM 6寄存器*/
    EPWM7 :origin = 0x006980,length = 0x000040 /*增强型 PWM 7寄存器*/
    EPWM8 :origin = 0x0069C0,length = 0x000040 /*增强型 PWM 8寄存器*/
    
    ECAP1 :origin = 0x006A00,length = 0x000020 /*增强型捕捉1寄存器*/
    ECAP2 :origin = 0x006A20、length = 0x000020 /*增强型捕捉2寄存器*/
    ECAP3 :origin = 0x006A40、length = 0x000020 /*增强型捕捉3寄存器*/
    
    EQEP1 :origin = 0x006B00,length = 0x000040 /*增强型 QEP 1寄存器*/
    EQEP2 :origin = 0x006B40、length = 0x000040//增强型 QEP 2寄存器*/
    
    GPIOCTRL:origin = 0x006F80、length = 0x000040 /* GPIO 控制寄存器*/
    GPIODAT :origin = 0x006FC0,length = 0x000020 /* GPIO 数据寄存器*/
    GPIOINT :origin = 0x006FE0,length = 0x000020 /* GPIO 中断/LPM 寄存器*/
    
    系统 :origin = 0x007010,length = 0x000030 /*系统控制寄存器*/
    
    SPIA :origin = 0x007040、length = 0x000010 /* SPI-A 寄存器*/
    SPIB :origin = 0x007740,length = 0x000010 /* SPI-B 寄存器*/
    
    SCIA :origin = 0x007050、length = 0x000010 /* SCI-A 寄存器*/
    SCIB:origin = 0x007750、length = 0x000010 /* SCI-B 寄存器*/
    
    NMIINTRUPT:origin = 0x007060,length = 0x000010 /* NMI 监视器中断寄存器*/
    XINTRUPT:origin = 0x007070,length = 0x000010 /*外部中断寄存器*/
    
    ADC :origin = 0x007100、length = 0x000080 /* ADC 寄存器*/
    
    I2CA :origin = 0x007900,length = 0x000040 /* I2C-A 寄存器*/
    
    PARTID :origin = 0x3D7E80,length = 0x000001 /*器件 ID 寄存器位置*/
    
    csm_PWL :origin = 0x3F7FF8、length = 0x000008 /* FLASHA 的一部分。 CSM 密码位置。 */
    }
    
    
    段
    {
    /*** PIE Vect 表和引导 ROM 变量结构***/
    联合运行= PIE_VECT,页= 1
    {
    PieVectTableFile
    组
    {
    EMUKeyVar
    EMUBModeVar
    FlashCallbackVar
    FlashScalingVar
    }
    }/***
    
    外设帧0寄存器结构***/
    DevEmuRegsFile:>DEV_EMU, PAGE = 1
    SysPwrCtrlRegsFile:> SYS_PWR_CTL、PAGE = 1
    FlashRegsFile :> flash_regs,page = 1
    CsmRegsFile :> CSM, PAGE = 1
    AdcResultFile :>ADC_Result,page = 1
    CpuTimer0RegsFile:>CPU_TIMER0,page = 1
    CpuTimer1RegsFile:>CPU_Timer1,page = 1
    CpuTimer2RegsFile:>CPU_TIMER2,page = 1
    PieCtrlRegsFile:>PIE_CTRL,page = 1
    ClaesFile :> CLA1, PAGE = 1
    DMaRegsFile :> DMA,PAGE = 1/***
    
    外设帧1寄存器结构***/
    ECanaRegsFile :> ECANA、 页面= 1
    ECanaLAMRegsFile:> ECANA_LAM,页面= 1
    ECANaMboxesFile:> ECANA_MBTO,页面= 1
    ECANaMOTSRegsFile:> ECANA_MOTS,页面= 1
    ECANaMOTOREGsFile:> ECANA_MOOX,页面= 1
    ECap1RegsFile :> ECAP1, PAGE = 1
    ECap2RegsFile :> ECAP2, PAGE = 1
    ECap3RegsFile :> ECAP3, PAGE = 1
    EQep1RegsFile :> EQEP1、 PAGE = 1
    EQep2RegsFile :> EQEP2, PAGE = 1
    GpioCtrlRegsFile:> GPIOCTRL,PAGE = 1
    GpioDataRegsFile:> GPIODAT, PAGE = 1
    GpioIntRegsFile:> GPIOINT, PAGE = 1/***
    
    外设帧2寄存器结构***/
    SysCtrlRegsFile:>系统, PAGE = 1
    SpiaRegsFile :> SPIA, PAGE = 1
    SpibRegsFile :> SPIB, PAGE = 1
    SciaRegsFile :> SCIA、 PAGE = 1
    ScibRegsFile :> SCIB,PAGE = 1
    NmiIntertRegsFile:>NMIINTRUPT,PAGE = 1
    XIntraptRegsFile:>XINTRUPT,PAGE = 1
    AdcRegsFile :> ADC, PAGE = 1
    I2caRegsFile :> I2CA, PAGE = 1/***
    
    外设帧3寄存器结构***/
    Comp1RegsFile :> COMP1,PAGE = 1
    COMP2RegsFile :> COMP2,PAGE = 1
    COMP3RegsFile :> COMP3,PAGE = 1
    EPwm1RegsFile :> EPWM1,页= 1
    EPwm2RegsFile :> EPWM2,页= 1
    EPwm3RegsFile :> EPWM3,页= 1
    EPwm4RegsFile :> EPWM4,PAGE = 1
    EPwm5RegsFile :> EPWM5,页= 1
    EPwm6RegsFile :> EPWM6,页= 1
    EPwm7RegsFile :> EPWM7,PAGE = 1
    EPwm8RegsFile :> EPWM8,PAGE = 1
    McbspaRegsFile:> McBSPA,PAGE = 1/***
    
    代码安全模块寄存器结构***/
    CsmPwlFile :>csm_pwl,page = 1/***
    
    Device Part ID 寄存器结构***/
    PartIdRegsFile:>PARTID,page = 1
    
    }
    
    /*/================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    
    //文件结束。
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *
    

    我不知道为什么我有2个、我不知道这两个都是必要的、但我合并了一些示例。

    现在、根据我的理解、我可以将结构体承载到 .stack、.ebss 等区域、但我不需要 RAM、我需要类似 .econst 的东西、即 闪存的 PAGE = 0编程区域、不允许我更改参数的值。 (所有参数变为"0")

    我需要一个适合我的非易失性和可更改参数的区域。 (将为 PAGE = 1、但将保留、而不是 RAM)

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

    我认为您基本上需要 EEPROM。 请参阅:

    www.ti.com/.../sprab69.pdf