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.

[参考译文] TMS320F28386S:仿真 SCI_Boot

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1186819/tms320f28386s-emulating-sci_boot

器件型号:TMS320F28386S
主题中讨论的其他器件:HALCOGEN

我需要仿真 SCI_Boot、因为我们的硬件配置不正确、电路板不会重新制造。

我让我的伪 SCI_BOOT 运行、它接受了串行闪存编程器的23300+个字节。 初始目标为0、并从该位置正确构建。 但是、我不确定写入此起始位置是否安全、但我无法从链接器 cmd 文件中确定。 此外、如果我正确解释、堆栈位于 RAMM0_1、因此将被覆盖。

因此、我看到了3种备选方案:

1) 1)调整链接器命令文件、以便跳过24K 的空间、这似乎会将存储器占用到 GS1中。 这可能不足以支持应用程序。 下面是我们常规应用的内存分配映射。

2) 2)修改我的伪 SCI 引导程序以使用偏移量加载到我们的外部 RAM、地址为0x8000000、16Mx16、IS45S16160J-7TLA2。 我不确定前2个块、因为第一个块发往地址0、下一个发往地址0x1B4、它位于从0x1B1Hey 开始的 RAMM0中

3) 3)关闭并确定如何将闪存内核永久放入闪存中。 如果我这么做、要 从我们的主应用程序运行它、我会加载一个具有该闪存地址的函数指针吗? 是否需要更改堆栈和任何其他地址?

我的选择是第三、因为似乎有足够的闪存可用。 但是、repo flash_kernel_C28x_dual_ex1_c28x1本质上是基于 RAM 的、将其转换为基于闪存时遇到问题。 感谢您的观察和建议。

这是我们当前的链接器文件:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#if 1
MEMORY
{
·· BOOT_RSVD······· : origin = 0x000002, length = 0x0001AE···· /* Part of M0, BOOT rom will use this for stack */
·· RAMM0_1········· : origin = 0x0001B0, length = 0x000648
·· // RAMM1_RSVD······ : origin = 0x0007F8, length = 0x000008········ /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
·· CLA_MSGRAMLOW··· : origin = 0x001480, length = 0x000080
·· CLA_MSGRAMHIGH·· : origin = 0x001500, length = 0x000080
·· RAMD0_1········· : origin = 0x00C000, length = 0x001000
·· RAMLS0·········· : origin = 0x008000, length = 0x000800
·· RAMLS1_5········ : origin = 0x008800, length = 0x002800
·· RAMLS6·········· : origin = 0x00B000, length = 0x000800
·· RAMLS7·········· : origin = 0x00B800, length = 0x000800
·· RAMGS0_1········ : origin = 0x00D000, length = 0x002000
·· RAMGS2_4········ : origin = 0x00F000, length = 0x003000
·· RAMGS5_6········ : origin = 0x012000, length = 0x002000
·· RAMGS7·········· : origin = 0x014000, length = 0x001000
·· RAMGS8_9········ : origin = 0x015000, length = 0x002000
·· RAMGS10_15······ : origin = 0x017000, length = 0x005FF8
·· // RAMGS15_RSVD···· : origin = 0x01CFF8, length = 0x000008········ /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

这是当前的内存分配。

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

    尊敬的 John:

    列出的起始位置0是否与存储器0的起始位置相同?  以下是有关替代选项的一些注意事项:

    1) 1)如果 您要将其余 RAM 存储器的段移动到24k 以上、则可以将链接器 cmd 文件调整24k。 我会检查器件上可用的 RAM 量。 当您的应用程序运行时、它将来自 RAM 是正确的?

    2) 2)如果偏移量用于加载到外部 RAM、那么前两个块是否意味着尽管存在分支、它将始终在地址0和0x1B1处进行编程?

    3) 3)闪存内核可作为 EEPROM 放置在闪存中。  HALCoGen 工具(http://www.ti.com/tool/HALCOGEN)中包含了器件“TMS570LS31x_21x”(\ti\Hercules \HALCoGen\v04.07.07.01\examples\TMS570LS31x_21x\example_TI_fee_Write_Read)的示例。 注意:您必须使用 F2838闪存 API (https://www.ti.com/lit/ug/spnu632/spnu632.pdf)、而不是使用 F021闪存 API 2.0 (Hercules API)–但其概念与之相似。  Hercules 器件内核为 ARM (字节可寻址)、C28x 存储器为16位可寻址。 我已将下面的用户指南作为 pdf 提供。

    e2e.ti.com/.../2541.TI_5F00_FEE_5F00_User_5F00_Guide.pdf

    谢谢、

    查尔斯

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

    感谢您发布 Charles。

    1) 1)看起来它具有44KB 的 RAM。

    2) 2)我的问题是前两个块是否需要转到其原始地址? 第一个块大小为2、其目的为0。 内容:

    0x0041   0x0044

    我不知道它是什么、但它可能很重要、因为下一个块直到地址0x1B4才写入、我认为地址0x1B4可能是堆栈区域。 我知道地址0002是保留的、但没有找到任何确定的0000。

    那么、这两个块是否需要保持放置、或者它们是否也可以移动?

    3) 3)这种选择看起来很理想、但我应该明天做一些工作、这看起来像一座需要攀登的高山。 因此、我可能需要一个冰雹 Mary、而不是一个理想的解决方案。

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

    我一直在用石头打我的头,而不是想。 有一种更简单的方法来实现这一点。

    我修改了 FLASH_kernel_C28x_dual_ex1_c28x1以使用我的 SCIA 引脚、并将其构建为独立的 RAM 应用程序。

    然后、我修改了串行闪存编程器以跳过内核下载、该内核下载应加载 FLASH_kernel_C28x_DUAL_ex1_c28x1。

    到目前为止、我已加载 CPU1应用程序。 我重置电路板、新代码开始将其指示灯消息打印到 SCIB。