工具/软件:Code Composer Studio
您好!
我使用 Launchxl f28069m 套件。 我有一个用于99个数字的"数字"结构、每个数字结构都获取15个参数(uint16、float 等)。 我需要将所有这些99x15参数值保留在敏感(或非易失性)存储器中。 是否可以使用此套件或是否应该使用外部 EEPROM? 如果套件具有此功能、我认为我需要完整的存储器映射、大端字节序/小端字节序寻址协议文档。
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.
工具/软件:Code Composer Studio
您好!
我使用 Launchxl f28069m 套件。 我有一个用于99个数字的"数字"结构、每个数字结构都获取15个参数(uint16、float 等)。 我需要将所有这些99x15参数值保留在敏感(或非易失性)存储器中。 是否可以使用此套件或是否应该使用外部 EEPROM? 如果套件具有此功能、我认为我需要完整的存储器映射、大端字节序/小端字节序寻址协议文档。
嗯、我认为这可以解决我的问题。 但随后检查了以下主题:
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*/
* */
//*--------------------------------------------------------------------------------------------------------------- */
/*版权所有德州仪器
2010*/
//*--------------------------------------------------------------------------------------------------------------- */
/*修订历史记录: */
//*--------------------------------------------------------------------------------------------------------------- */
/*日期|说明 */
//*--------------------------------------------------------------------------------------------------------------- */
* 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)