Thread 中讨论的其他器件:controlSUITE
你好
我正在处理需要从闪存独立加载的项目、我必须将数据保存到闪存。 基于 SPRA958L、我实现了在启动时将程序代码、.econst 和.switch 符号复制到 RAM 的功能。 我使用 SPRAB60在一个闪存扇区中实现 EEPROM 仿真、并使用2806x_BootROM_API_TABLE_Symbols_fpu32.lib
如果我使用 CCS 对器件进行编程、则可以正常工作。 我的代码按应有的方式运行、我能够写入闪存。 如果我复位器件并让它从闪存启动、代码也会工作、但我无法写入闪存。我已经知道、API 的 Flash_Program 函数被调用、但返回错误代码30、这意味着程序失败。
我想知道为什么它在从 CCS 加载而不是从闪存加载时起作用。 我已在下面附加了我的链接器 cmd 文件。 从闪存引导时、初始化是否有什么不同?
谢谢、致以诚挚的问候
Andri
MEMORY { PAGE 0:/* Program Memory */ /*内存(RAM/FLASH/OTP)块可被移动到第1页进行数据分配*/ RAMM0 :origin = 0x000050、length = 0x0003B0 /*片上 RAM 块 M0 */ RAML0 :origin = 0x008000、length = 0x000800 /*片上 RAM 块 L0 */ RAML3 :origin = 0x009000、length = 0x001000//片上 RAM 块 L3 */ OTP :origin = 0x3D7800,length = 0x000400 /*片上 OTP */ 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 */ 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/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/ /*寄存器保留在第1页上 // boot_RSVD:origin = 0x000000,length = 0x000050 // M0的一部分,引导 ROM 将此用于栈*/ RAMM1 :origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 */ RAML1 :origin = 0x008800,length = 0x000400 /*片上 RAM 块 L1 */ RAML2 :origin = 0x008C00,length = 0x000400 /*片上 RAM 块 L2 */ 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 */ USB_RAM :origin = 0x040000、length = 0x000800 /* USB RAM*/ FLASHH :origin = 0x3D8000,length = 0x004000 /*片上闪存*/ FLASHB :origin = 0x3F0000、length = 0x004000 /*片上闪存*/ }/* 将段分配给内存块。 注: DSP28_CodeStartBranch.asm 中用于重定向代码的 codestart 用户定义段 闪存时执行 ramfuncs 用户定义的段、用于存储将从闪存复制到 RAM 中的函数* /段 { .cinit :> FLASHA、 PAGE = 0.Pinit :> FLASHA、 PAGE = 0.text :> FLASHA、 PAGE = 0 codestart :>开始, PAGE = 0 ramfuncs :LOAD = FLASHD, 运行= RAML3、 load_start (_RamfuncsLoadStart)、 load_end (_RamfuncsLoadEnd)、 run_start (_RamfuncsRunStart)、 load_size (_RamfuncsLoadSize)、 PAGE = 0 csmpasswds :>csm_PWL_P0、page = 0 csm_rsvd :>csm_RSVD,page = 0 /*分配未初始化的数据段:*/ .stack :> RAMM1, PAGE = 1.ebss :> RAML4, PAGE = 1 .esysmem :> RAML2, PAGE = 1 /*初始化段要进入闪存*/ /*要使 SDFlash 对这些段进行编程、必须将它们分配到 PAGE 0 */ .econst :LOAD = FLASHB、 运行= RAML6、 Load_start (_EconstLoadStart)、 RUN_START (_EconstRunStart)、 load_size (_EconstLoadSize)、 PAGE = 1.switch :load = FLASHA, 运行= RAMM0、 Load_start (_SwitchLoadStart)、 RUN_START (_SwitchRunStart)、 load_size (_SwitchLoadSize)、 PAGE = 0 /*为寄存器映射分配存储器:*/ .register :> RAML1, PAGE = 1 /*分配 IQ 数学区域:*/ IQmath :> FLASHA、 PAGE = 0 /*数学代码*/ IQmathTables :> IQTABLES,page = 0,type = NoLoad //分配 FPU 数学区域:*/ FPUmathTables :> FPUTABLES,page = 0,type = NoLoad //如果调用 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 :>重置, PAGE = 0、TYPE = DSECT 向量 :>引导程序,页= 0,类型= DSECT }