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.

[参考译文] TMS320F28P650DK:cmd 文件配置

Guru**** 2526700 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1557631/tms320f28p650dk-cmd-file-configuration

器件型号:TMS320F28P650DK


工具/软件:

问题:有两个 DSP 项目:项目 A (APP) 和项目 B (BOOT)。 这两个工程都具有用于操作外部闪存芯片的 SPI 协议。 所有通信代码都相同、但 CMD 文件不同、运行工程的电路板也相同。 项目 A 可以在外部闪存芯片上执行读取和写入操作;项目 B 无法在外部闪存芯片上执行读取和写入操作。 通过使用逻辑分析仪分析 SPI MOSI、MISO 和 CLK 波形、可以发现这两个工程的 MOSI 和 CLK 波形相同。 A 项目的信号线 MISO 有数据;B 项目的信号线 MISO 也有数据。 请分析错误的原因。

自分析:我认为问题在于配置的非代码逻辑方面、如链接脚本(CMD 文件)、内存映射、寄存器初始化、GPIO 配置或中断配置、 Etc.Engineering B 是我配置的固件升级代码。 我自己修改了 CMD 文件。

项目 A (APP) 现象:

阵列缓冲器用于写入外部闪存芯片阵列。 数组 BufferA 读取外部闪存芯片阵列。 从图中可以看出、Buffer = BufferA;在逻辑分析仪中、MOSI、MISO 和 CLK 有数据。

项目 B (BOOT) 现象:

数组缓冲 B 用于写入外部闪存芯片阵列。 数组 BufferA 读取外部闪存芯片阵列。 从图中可以看出、BufferB 不等于 BufferA。 在逻辑分析仪中、MOSI.CLK 有数据、MISO 没有数据。

工程 B(引导)CMD 文件

移动数据

begin : origin = 0x080000, length = 0x000002 //根据需要更新 codestart 位置

BOOT_RSVD:origin = 0x000002、length = 0x0001AF /* M0 的一部分、引导 ROM 将对堆栈使用该值*/
RAMM0:原点= 0x0001b1、长度= 0x00024F
RAMM1:原点= 0x000400、长度= 0x000400

RAMD0:原点= 0x00C000、长度= 0x002000
RAMD1:origin = 0x00E000、length = 0x002000
RAMD2:origin = 0x01A000、length = 0x002000 //可以映射到 CPU1 或 CPU2。 配置为 CPU2 时、使用地址 0x8000。 用户应根据内核选择进行注释/取消注释
RAMD3:origin = 0x01C000、length = 0x002000 //可以映射到 CPU1 或 CPU2。 当配置为 CPU2 时、使用地址 0xA000。 用户应根据内核选择进行注释/取消注释
RAMD4:origin = 0x01E000、length = 0x002000 //可以映射到 CPU1 或 CPU2。 当配置为 CPU2 时、使用地址 0xC000。 用户应根据内核选择进行注释/取消注释
RAMD5:origin = 0x020000、length = 0x002000 //可以映射到 CPU1 或 CPU2。 配置为 CPU2 时、使用地址 0xE000。 用户应根据内核选择进行注释/取消注释

RAMLS0:origin = 0x008000、length = 0x000800
RAMLS1:原点= 0x008800、长度= 0x000800
RAMLS2:原点= 0x009000、长度= 0x000800
RAMLS3:原点= 0x009800、长度= 0x000800
RAMLS4:原点= 0x00A000、长度= 0x000800
RAMLS5:原点= 0x00A800、长度= 0x000800
RAMLS6:原点= 0x00B000、长度= 0x000800
RAMLS7:原点= 0x00B800、长度= 0x000800
RAMLS8:origin = 0x022000、length = 0x002000 //配置为 CLA 程序时使用地址 0x4000
RAMLS9:origin = 0x024000、length = 0x002000 //配置为 CLA 程序时使用地址 0x6000

// RAMLS8_CLA:origin = 0x004000、length = 0x002000 //仅在配置为 CLA 程序存储器时使用
// RAMLS9_CLA:origin = 0x006000、length = 0x002000 //仅在配置为 CLA 程序存储器时使用

RAMGS0:原点= 0x010000、长度= 0x002000
RAMGS1:原点= 0x012000、长度= 0x002000
RAMGS2:原点= 0x014000、长度= 0x002000
RAMGS3:原点= 0x016000、长度= 0x002000
RAMGS4:原点= 0x018000、长度= 0x002000

/*闪存组(每个扇区 128 个)*/
FLASH_BANK0:origin = 0x080002、length = 0x1FFFE //可以映射到 CPU1 或 CPU2。 用户应根据内核选择进行注释/取消注释
FLASH_BANK1:origin = 0x0A0000、length = 0x20000 //可以映射到 CPU1 或 CPU2。 用户应根据内核选择进行注释/取消注释
Flash_Bank2:origin = 0x0C0000、length = 0x20000 //可以映射到 CPU1 或 CPU2。 用户应根据内核选择进行注释/取消注释
FLASH_BANK3:origin = 0x0E0002、length = 0x1FFFE //可映射到 CPU1 或 CPU2。 用户应根据内核选择进行注释/取消注释
FLASH_BANK4:origin = 0x100000、length = 0x20000 //可以映射到 CPU1 或 CPU2。 用户应根据内核选择进行注释/取消注释

CPU1TOCPU2RAM:原点= 0x03A000、长度= 0x000400
CPU2TOCPU1RAM:origin = 0x03B000、长度= 0x000400

CLATCPURAM:origin = 0x001480、length = 0x000080
CPUTOCLRAM:origin = 0x001500、length = 0x000080
CLATDMARAM:origin = 0x001680、length = 0x000080
DMATOCLRAM:原点= 0x001700、长度= 0x000080

CANA_MSG_RAM:origin = 0x049000、length = 0x000800
CANB_MSG_RAM:原点= 0x04B000、长度= 0x000800
Reset:origin = 0x3FFFC0、length = 0x000002
}


很重要

codestart:> begin
.text:>> FLASH_BANK0、ALIGN (8)
.cinit:> FLASH_BANK0、ALIGN (8)
.switch:> FLASH_BANK0、align(8)
.reset:> reset、type = DSECT /*未使用、*/

.stack :> RAMM1
#if defined (__TI_EABI__)
.bss :> RAMD5
.bss:output :> RAMLS3
.init_array:> RAMM0
.const:> FLASH_BANK0、ALIGN (8)
.data :> RAMLS8
.sysmem :> RAMLS4.
#else
.pinit :> RAMM0
.ebss:>> RAMLS5 | RAMLS6
.econst:> RAMLS5
.esysmem :> RAMLS5.
#endif

ramgs0:> RAMGS0、type=NOINIT
ramgs1:> RAMGS1、type=NOINIT
ramgs2:> RAMGS2、type=NOINIT

MSGRAM_CPU1_TO_CPU2 > CPU1TOCPU2RAM、type=NOINIT
MSGRAM_CPU2_TO_CPU1 > CPU2TOCPU1RAM、type=NOINIT

DataBufferSection :> RAMGS0、ALIGN(8)

#if defined (__TI_EABI__)
业务线经理

.TI.ramfunc:
{-l FAPI_F28P65x_EABI_v3.00.01.lib}
} LOAD = FLASH_BANK0、
RUN = RAMGS0、
LOAD_START (RamfuncsLoadStart)、
load_size (RamfuncsLoadSize)、
LOAD_END (RamfuncsLoadEnd)、
RUN_START (RamfuncsRunStart)、
RUN_SIZE (RamfuncsRunSize)、
RUN_END (RamfuncsRunEnd)、
对齐 (8)
#else
业务线经理

.TI.ramfunc:
{-l FAPI_F28P65x_EABI_v3.00.01.lib}
} LOAD = FLASH_BANK0、
RUN = RAMGS0、
LOAD_START (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
LOAD_END (_RamfuncsLoadEnd)、
RUN_START (_RamfuncsRunStart)、
RUN_SIZE (_RamfuncsRunSize)、
RUN_END (_RamfuncsRunEnd)、
对齐 (8)
#endif

}

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

CMD 文件(我自己配置了绿色字体的器件)是否有问题?

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

    项目 B(引导)处于调试模式。 程序尚未开始运行、但一些全局变量已经包含数据。 这些数据来自上次运行。 为什么会出现这种情况?

    • 工程 B 的配置已自行更改

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

    您好:

    感谢您的咨询,我将转发给我们的 CMD 专家。 请预计第二天他们离开办公室时、响应会出现延迟。

    此致、

    Allison

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

    您好、

    使用 SDK 中已存在的链接器 cmd 文件时是否遇到任何错误? 我看到有几个部分映射到 SDK 中现有链接器 cmd 文件中的闪存部分、但这些部分映射到上面连接的链接器 cmd 文件(如 init_array)中的 RAM 位置。  

    我建议您使用 SDK 中的现有链接器 cmd 文件并尝试使用示例、然后我们可以确定问题是否是由于 cmd 文件的更改而导致的。

    您可以查看 位置-C2000Ware\device_support\f28p65x\common\cmd 处的 28p65x_generic_flash_lnk_cpu1.cmd 文件。

    排除命令问题后、我可以循环一些 SPI 专家进行进一步调试。

    此外、您是否能够在 RAM 配置中运行该程序?

    谢谢

    Aswin

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

    感谢您的答复。 我会试一试。