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.

[参考译文] TMDSCNCD28335:在 CCS 上打开--ramfunc 选项时、刷写的固件不再工作

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1520773/tmdscncd28335-when-turning-on---ramfunc-option-on-ccs-the-flashed-firmware-not-working-anymore

器件型号:TMDSCNCD28335
主题: C2000WARE 中讨论的其他器件

工具/软件:

我在 TI  TMDSCNCD28335原型板上开发了用于 SCI 通信的固件。 如果我使用了 RAM 链接器文件并使用 CCS 进行调试、则没有问题。 如果我在编译时在不打开 CCS 上的--ramfunc 选项的情况下使用了闪存链接器文件、那么固件似乎 也起作用、因为我可以在电路板和我的 PC 之间建立 UART 通信。 但是,每当我打开--ramfunc 选项时,固件就停止工作。 即使关闭--ramfunc 选项、但将 ramfunc 属性添加到固件中的任何函数、固件也停止工作。 导致此问题的原因是什么?

这是我的链接器文件的代码。 提前感谢您的帮助。

--mapfile_contents=all

移动数据

第0页:/*程序存储器*/
/*存储器(RAM/FLASH/OTP)块可移至 Page1以进行数据分配*/

ZONE0:origin = 0x004000、length = 0x001000 /* XINTF 区域0 */
RAML0:origin = 0x008000、length = 0x001000 /*片上 RAM 块 L0 */
RAML1:origin = 0x009000、length = 0x001000 /*片上 RAM 块 L1 */
RAML2:origin = 0x00A000、length = 0x001000 /*片上 RAM 块 L2 */
RAML3:origin = 0x00B000、length = 0x001000 /*片上 RAM 块 L3 */
ZONE6:origin = 0x01000000、length = 0x100000 /* XINTF 区域6 */
ZONE7A:origin = 0x0200000、length = 0x00FC00 /* XINTF 区域7 -程序空间*/
FLASHH:origin = 0x300000、length = 0x008000 /*片上闪存*/
FLASHG:origin = 0x308000、length = 0x008000 /*片上闪存*/
FLASHF:origin = 0x310000、长度= 0x008000 /*片上闪存*/
FLASHE:origin = 0x318000、长度= 0x008000 /*片上闪存*/
FLASHD:origin = 0x320000、长度= 0x008000 /*片上闪存*/
FLASHC:origin = 0x328000、length = 0x008000 /*片上闪存*/
FLASHA:origin = 0x338000、length = 0x007F80 /*片上闪存*/
CSM_RSVD:origin = 0x33FF80、length = 0x000076 /* FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 */
begin:origin = 0x33FFF6、length = 0x000002 /* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 */
CSM_PWL:origin = 0x33FFF8、length = 0x000008 /* FLASHA 的一部分。 FLASHA 中的 CSM 密码位置*/
OTP:origin = 0x380400、length = 0x000400 /* On-chip OTP */
ADC_CAL:origin = 0x380080、length = 0x000009 /*保留存储器中的 ADC_cal 函数*/

IQTABLES:origin = 0x3FE000、length = 0x000b50 /* Boot ROM 中的 IQ 数学表*/
IQTABLES2:origin = 0x3FEB50、length = 0x00008c /* Boot ROM 中的 IQ 数学表*/
FPUTABLES:origin = 0x3FEBDC、length = 0x0006A0 /* Boot ROM 中的 FPU 表*/
ROM:origin = 0x3FF27C、length = 0x000D44 /* Boot ROM */
重置:origin = 0x3FFFC0、长度= 0x000002 /*引导 ROM 的一部分*/
Vectors:origin = 0x3FFFC2、length = 0x00003E /*引导 ROM 的一部分*/

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

boot_RSVD:origin = 0x000000、length = 0x000050 /* M0的一部分、引导 ROM 将用于堆栈*/
RAMM0:origin = 0x000050、length = 0x0003B0 /*片上 RAM 块 M0 */
RAMM1:origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 */
RAML4:origin = 0x00C000、length = 0x001000 /*片上 RAM 块 L1 */
RAML5:origin = 0x00D000、length = 0x001000 /*片上 RAM 块 L1 */
RAML6:origin = 0x00E000、length = 0x001000 /*片上 RAM 块 L1 */
RAML7:origin = 0x00F000、length = 0x001000 /*片上 RAM 块 L1 */
ZONE7B:origin = 0x20FC00、length = 0x000400 /* XINTF zone 7 - data space */
FLASHB:origin = 0x330000、length = 0x008000 /*片上闪存*/
}

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

很重要


/*分配程序区域:*/
.cinit:> FLASHA PAGE = 0 //C 启动时全局变量
.pinit:> FLASHA、page = 0 //启动时要调用的构造函数表
.text:> FLASHA PAGE = 0 //对于程序代码

codestart:> begin page = 0

#ifdef _TI_COMPILER_VERSION__
#if __TI_COMPILER_VERSION_>= 15009000
.TI.ramfunc:{}load = FLASHD、//FLASHD、
RUN = RAML0、
LOAD_START (_RamfuncsLoadStart)、
LOAD_END (_RamfuncsLoadEnd)、
RUN_START (_RamfuncsRunStart)、table (BINIT)、
页面= 0
#else
ramfuncs : load = FLASHD,
RUN = RAML0、
LOAD_START (_RamfuncsLoadStart)、
LOAD_END (_RamfuncsLoadEnd)、
RUN_START (_RamfuncsRunStart)、
页面= 0
#endif
#endif

.binit:> RAML1、第0页

csmpasswds:> CSM_PWL PAGE = 0
CSM_rsvd:> CSM_RSVD 页面= 0 //CSM_rsvd:符号

/*分配未初始化的数据段:*/
.stack :> RAML3 PAGE = 0 //> RAMM1 PAGE = 1 //用于函数调用栈
.ebss :> RAML4 PAGE = 1 //对于未初始化的变量
.esysmem :> RAML6 PAGE = 1 //对于动态内存分配池、请使用--heap size
.CIO:> RAML5、PAGE = 1

/*初始化段进入闪存*/
/*要使 SDFlash 对这些内容进行编程、它们必须分配至页0 */
.econst:> FLASHA page = 0 //显式初始化或包含字符串文字的全局常量变量。
//字符串文字放置在.econst:.string 子段中以启用更大的字段
//链接时放置控制
.switch:> FLASHA page = 0 //大型 switch 语句的跳转表

/*分配 IQ 数学区域:*/
IQMath:> FLASHC page = 0 /*数学代码*/
IQmathTables:> IQTABLES、PAGE = 0、TYPE = NOLOAD

/*如果调用 IQNexp()或 IQexp()、则取消注释以下部分
IQmath.lib 库中的函数、以便利用
引导 ROM 中的相关 IQ 数学表(这可以节省空间和引导 ROM
为1等待状态)。 如果未取消注释此部分、则为 IQmathTables2
将加载到其他存储器(SARAM、闪存等)并存储数据
可增加空间、但等待状态为0。
*/
/*
IQmathTables2:> IQTABLES2、page = 0、type = noLoad


IQmath.lib (IQmathTablesRam)

}
*/

FPUmathTables :> FPUTABLES, PAGE = 0, TYPE = NOLOAD

/*分配可通过 DMA 访问的 RAM 段:*/
DMARAML4:> RAML4、PAGE = 1
DMARAML5:> RAML5、PAGE = 1
DMARAML6:> RAML6、PAGE = 1
DMARAML7 :> RAML7, page = 1.

/*分配 XINTF 区域7的0x400以存储数据*/
ZONE7DATA:> ZONE7B、PAGE = 1

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

/*分配 ADC_cal 函数(由出厂时预编程到 TI 保留的存储器中)*/
.adc_cal:load = ADC_CAL、page = 0、type = NoLoad

}

/*
//==============================================================================
//文件结尾。
//==============================================================================
*/

此致、

Weiliang

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

    尊敬的 Weiliang:

    您能帮我理解一下、这是我们的闪存链接器命令文件的修改版本吗? 您能否尝试使用我们的 C2000WARE SDK 中提供的默认版本? 我也想知道您是否有多个 F28335x 板、其中可以尝试查看此问题是否可以在另一个板上重现? 如果可能、则可能是软件问题、但无法解决、则原型板上的器件可能存在问题

    此致、

    彼得