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.

[参考译文] TMS320F28375D:闪存内核问题

Guru**** 2417960 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/984130/tms320f28375d-flash-kernel-problems

器件型号:TMS320F28375D

我一直在使用闪存内核(默认文件)对器件进行编程。 但是、当我执行 DFU1时、它会给出以下错误:-
命令成功
错误状态:verify_error
错误地址:0x80000

即使应用程序加载成功也是如此。

但是、当 I DFU2时、它失败、并出现以下错误:-


校验和不匹配... 请按 Ctrl-C 中止。

这来自以下代码:-  


void loadProgram_CHECKSUM (文件*FH)

//按预期发送 ACK
WriteFile (file、(unsigned char*)&ack、1、&dwWritten、NULL);

rcvData =(sendData[1]<< 8)+ sendData[0];

//确保校验和匹配
if (校验和!= rcvData)

printf ("\n 校验和不匹配... 请按 Ctrl-C 中止。");
 while (1){}

while (fileStatus = 1)

unsigned int blocksize;

这种情况始终发生。 这适用于闪烁的应用程序和旧的.hex 文件。 但是、它与我们的较新的十六进制文件一致失败。 我已附加链接器 文件。 我也可以发送.map 文件。

如果需要任何其他信息、请告知我。


CPU1  


存储器

第0页:
/* begin 用于"引导至 SARAM"引导加载程序模式*/

第0页:/*程序内存*/
/*内存(RAM/FLASH)块可移动到 Page1进行数据分配*/
/* begin 用于"引导至闪存"引导加载程序模式*/

开始:origin = 0x080000,length = 0x000002
RAMM0:origin = 0x000122、length = 0x0002DE
RAMD0:origin = 0x00B000、length = 0x000800
RAMLS0:origin = 0x008000、length = 0x000800
RAMLS1:origin = 0x008800,length = 0x000800
RAMLS2:origin = 0x009000,length = 0x000800
RAMLS3:origin = 0x009800,length = 0x000800
RAMLS4:origin = 0x00A000,length = 0x000800
复位:origin = 0x3FFFC0,length = 0x000002

/*闪存扇区*/
FLASHA:origin = 0x080002,length = 0x001FFE /*片上闪存*/
FLASHB:origin = 0x082000、length = 0x002000 //片上闪存*
FLASHC:origin = 0x084000,length = 0x002000 //片上闪存*/
FLASHD:origin = 0x086000、length = 0x002000 //片上闪存*/
FLASHE:origin = 0x088000、length = 0x008000 //片上闪存*/
FLASHF:origin = 0x090000,length = 0x008000 //片上闪存*
FLASHG:origin = 0x098000、length = 0x008000 //片上闪存*/
FLASHH:origin = 0x0A0000,length = 0x008000 //片上闪存*/
FLASHI:origin = 0x0A8000、length = 0x008000 //片上闪存*/
FLASHJ:origin = 0x0B0000,length = 0x008000 //片上闪存*/
FLASHK:origin = 0x0B8000、length = 0x002000 //片上闪存*/
FLASHL:origin = 0x0BA000、length = 0x002000 //片上闪存*/
FLASHM:origin = 0x0BC000、length = 0x002000 //片上闪存*/
FLASHN:origin = 0x0BE000、length = 0x002000 //片上闪存*/

第1页:

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


RAMLS5:origin = 0x00A800,length = 0x000800

RAMGS0:origin = 0x00C000、length = 0x001000
RAMGS1:origin = 0x00D000、length = 0x00B000
RAMGS12131415:对于 CPU2,origin = 0x018000,length = 0x003FF8 //
// RAMGS15_RSVD:origin = 0x01BFF8,length = 0x000008 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超出有效内存的预取)来保留代码且不用于代码*/
/*仅在 F28379D、F28377D、F28375D 器件上。 移除其他设备上的线路。 *

CPU2TOCPU1RAM:origin = 0x03F800,length = 0x000400
CPU1TOCPU2RAM:origin = 0x03FC00,length = 0x000400

部分

/*分配计划领域:*/
.cinit:> FLASHB PAGE = 0,ALIGN (8)
.text:>> FLASHB | FLASHC | FLASHD | FLASHE PAGE = 0,ALIG(8)
codestart:> begin page = 0,align (8)
/*分配未初始化的数据段:*/
.stack:>RAMM1 page = 1.
.switch:> FLASHB PAGE = 0,ALIGN (8)
.reset:> reset,page = 0,type = DSECT //未使用,*/

#if defined (_TI_EABI)
init_array:> FLASHB,PAGE = 0,ALIGN (8)
.bss:> RAMLS5,page = 1.
.bss:输出:> RAMLS3,页= 0 align(8)
.bss:CIO:> RAMLS5,page = 1.
.data :> RAMLS5,page = 1.
.sysmem:> RAMLS5,page = 1.
/*初始化段进入闪存*/
.const:> FLASHF,PAGE = 0,ALIGN (8)
其他
.pinit:> FLASHB,PAGE = 0,ALIGN (8)
.ebss:> RAMLS5,PAGE = 1.
.esysmem:> RAMLS5,page = 1.
.cio:> RAMLS5,page = 1.
/*初始化段进入闪存*/
.econst:>> FLASHF PAGE = 0,ALIGN (8)
#endif

#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>=15009000
#if defined (_TI_EABI)
.TI.ramfunc:{}负载= FLASHD,
运行= RAMLS0、
Load_start (RamfuncsLoadStart)、
load_size (RamfuncsLoadSize)、
Load_End (RamfuncsLoadEnd)、
RUN_START (RamfuncsRunStart)、
run_size (RamfuncsRunSize)、
RUN_END (RamfuncsRunEnd)、
PAGE = 0、ALIGN (8)
其他
.TI.ramfunc:{}负载= FLASHD,
运行= RAMLS0、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0、ALIGN (8)
#endif
其他
ramfuncs:load = FLASHD,
运行= RAMLS0、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0、ALIGN (8)
#endif

#endif

/***用户定义的段***/
FWVERSION_MEM:> RAMGS0,PAGE = 1
CONFIG_AIM_MEM:> RAMGS0,PAGE = 1
CALIBRAY_AIM_MEM:> RAMGS0,PAGE = 1
ACK_MSG_CONFIG_MEM:> RAMGS0,PAGE = 1
ACK_MSG_CALIBRAMME_MEM:> RAMGS0,PAGE = 1

RMS_HALF_MEM:> RAMGS1,PAGE = 1.
Events_FIFO_Buffer_MEM:> RAMGS1,PAGE = 1.
Trends_FIFO_Buffer_MEM:>RAMGS1,PAGE = 1.
buffers_MEM:> RAMGS1,PAGE = 1


/*使用 IPC API 驱动程序时需要以下部分定义*/
组:> CPU1TOCPU2RAM,PAGE = 1

PUTBUFFER
PUTWRITEIDX
GETREADIDX

组:> CPU2TOCPU1RAM,PAGE = 1

GETBUFFER:TYPE = DSECT
GETWRITEIDX:TYPE = DSECT
PUTREADIDX:TYPE = DSECT

/*
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//文件结束。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
*

CPU2


存储器

第0页:/*程序内存*/
/*内存(RAM/FLASH)块可移动到 Page1进行数据分配*/
/* begin 用于"引导至闪存"引导加载程序模式*/

开始:origin = 0x080000,length = 0x000002
RAMM0:origin = 0x000080,length = 0x000380
RAMD0:origin = 0x00B000、length = 0x000800
RAMLS0:origin = 0x008000、length = 0x000800
RAMLS1:origin = 0x008800,length = 0x000800
RAMLS2:origin = 0x009000,length = 0x000800
RAMLS3:origin = 0x009800,length = 0x000800
RAMLS4:origin = 0x00A000,length = 0x000800
RAMGS14:origin = 0x01A000,length = 0x001000
RAMGS15:origin = 0x01B000,length = 0x001000
复位:origin = 0x3FFFC0,length = 0x000002

/*闪存扇区*/
FLASHA:origin = 0x080002,length = 0x001FFE /*片上闪存*/
FLASHB:origin = 0x082000、length = 0x002000 //片上闪存*
FLASHC:origin = 0x084000,length = 0x002000 //片上闪存*/
FLASHD:origin = 0x086000、length = 0x002000 //片上闪存*/
FLASHE:origin = 0x088000、length = 0x008000 //片上闪存*/
FLASHF:origin = 0x090000,length = 0x008000 //片上闪存*
FLASHG:origin = 0x098000、length = 0x008000 //片上闪存*/
FLASHH:origin = 0x0A0000,length = 0x008000 //片上闪存*/
FLASHI:origin = 0x0A8000、length = 0x008000 //片上闪存*/
FLASHJ:origin = 0x0B0000,length = 0x008000 //片上闪存*/
FLASHK:origin = 0x0B8000、length = 0x002000 //片上闪存*/
FLASHL:origin = 0x0BA000、length = 0x002000 //片上闪存*/
FLASHM:origin = 0x0BC000、length = 0x002000 //片上闪存*/
FLASHN:origin = 0x0BE000、length = 0x002000 //片上闪存*/

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

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

RAMLS5:origin = 0x00A800,length = 0x000800

RAMGS0:origin = 0x00C000、length = 0x001000
RAMGS1:origin = 0x00D000、length = 0x00B000
RAMGS12131415:对于 CPU2,origin = 0x018000,length = 0x003FF8 //
// RAMGS15_RSVD:origin = 0x01BFF8,length = 0x000008 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:超出有效内存的预取)来保留代码且不用于代码*/
/*仅在 F28379D、F28377D、F28375D 器件上。 移除其他设备上的线路。 *

CPU2TOCPU1RAM:origin = 0x03F800,length = 0x000400
CPU1TOCPU2RAM:origin = 0x03FC00,length = 0x000400


部分

/*分配计划领域:*/
.cinit:> FLASHB PAGE = 0,ALIGN (8)
.text:>> FLASHB | FLASHC | FLASHD | FLASHE PAGE = 0,ALIG(8)
codestart:> begin page = 0,align (8)
/*分配未初始化的数据段:*/
.stack:>RAMM1 page = 1.
.switch:> FLASHB PAGE = 0,ALIGN (8)
.reset:> reset,page = 0,type = DSECT //未使用,*/

#if defined (_TI_EABI)
init_array:> FLASHB,PAGE = 0,ALIGN (8)
.bss:> RAMLS5,page = 1.
.bss:输出:> RAMLS3,页= 0 align(8)
.bss:CIO:> RAMLS5,page = 1.
.data :> RAMLS5,page = 1.
.sysmem:> RAMLS5,page = 1.
/*初始化段进入闪存*/
.const:> FLASHF,PAGE = 0,ALIGN (8)
其他
.pinit:> FLASHB,PAGE = 0,ALIGN (8)
.ebss:> RAMLS5,PAGE = 1.
.esysmem:> RAMLS5,page = 1.
.cio:> RAMLS5,page = 1.
/*初始化段进入闪存*/
.econst:>> FLASHF PAGE = 0,ALIGN (8)
#endif

#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>=15009000
#if defined (_TI_EABI)
.TI.ramfunc:{}负载= FLASHD,
运行= RAMLS0、
Load_start (RamfuncsLoadStart)、
load_size (RamfuncsLoadSize)、
Load_End (RamfuncsLoadEnd)、
RUN_START (RamfuncsRunStart)、
run_size (RamfuncsRunSize)、
RUN_END (RamfuncsRunEnd)、
PAGE = 0、ALIGN (8)
其他
.TI.ramfunc:{}负载= FLASHD,
运行= RAMLS0、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0、ALIGN (8)
#endif
其他
ramfuncs:load = FLASHD,
运行= RAMLS0、
load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
run_size (_RamfuncsRunSize)、
run_end (_RamfuncsRunEnd)、
PAGE = 0、ALIGN (8)
#endif

#endif

/***用户定义的段***/
COMM_RX_BUFFER_MEM:>CPU2TOCPU1RAM,PAGE = 1.
sdp_context_MEM:> RAMGS12131415,PAGE = 1

/*使用 IPC API 驱动程序时需要以下部分定义*/
组:> CPU2TOCPU1RAM,PAGE = 1

PUTBUFFER
PUTWRITEIDX
GETREADIDX

组:> CPU1TOCPU2RAM,PAGE = 1

GETBUFFER:TYPE = DSECT
GETWRITEIDX:TYPE = DSECT
PUTREADIDX:TYPE = DSECT


/*
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//文件结束。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
*

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

    我已将此问题分配给一位将回复的同事。 谢谢、Sira

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

    您好!  

    以下是需要检查的几项内容:

    较新的十六进制文件的任何部分是否与闪存中的内核重叠?   

    您在十六进制实用程序工具中使用的是与旧版十六进制文件相同的编译后处理步骤还是相同的参数?

    谢谢、  

    Anu

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

    问题出在.hex 文件中的行尾。 出于某种原因、它在上一次的 Linux 产品线结束时运行良好。 但对于我们的新十六进制文件、它不起作用。 因此、我们使用 unix2dos 转换了十六进制文件。 之后工作正常。  如果自述文件中包含这种类型的信息、那就更好了。

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

    您好!  

    感谢您的反馈。 您是否使用相同的命令来创建两个十六进制文件? 这将有助于确定要放入自述文件中的信息。  

    谢谢、

    Anu

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

    是的。 请注意、我们在 Linux 中构建项目、该项目使用 Linux 行尾创建.hex 文件。 但是、我们以前的文件仍然可以正常工作。 实际上、其中一个较新的文件也工作正常(CPU1)、但即使对其进行了正确编程、它也会提供验证错误。  

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

    我将与编译器专家联系、以了解十六进制实用程序工具中是否存在导致差异的变化。  

    谢谢、  

    Anu