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.

[参考译文] F28M35H52C:澄清了 C28内核协处理器的起始地址

Guru**** 2614265 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/694259/f28m35h52c-clarity-on-start-address-of-c28-core-of-concerto

器件型号:F28M35H52C
Thread 中讨论的其他器件:controlSUITE

嗨、大家好。

我正在协处理器上开发 C28内核的自定义引导加载程序、我需要澄清的事情很少。

1. C28内核从其引导 ROM 阶段跳转到哪个地址?  

2.为了测试我的引导加载程序应用程序,我使用了一个简单的 Blinky C28应用程序。 现在,我应该更改 RESET_Vector 所在的地址吗? 或者、我是否应该担心"开始"部分的位置会被称为"codestart"函数?  

我为 C28启用了十六进制实用程序文件、该文件确实为我生成了.hex 文件。 但是,如果我尝试对文件的前两行进行解码,我会得到一个初始起始地址为0x00098000,这是我不理解的吗? 当我编辑了闪烁应用程序链接器脚本以从0x0013A000开始其起始地址时?  

前两行:

020000040009F1
:20800000761F76221A2400101A200001761F0003180000161800FFFD761FFFFECC00001062

第0页闪烁应用程序的存储器说明

存储器

第0页:/*程序内存*/
/*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/
RAML0:origin = 0x008000、length = 0x001000 //片上 RAM 块 L0 */
RAML1:origin = 0x009000,length = 0x001000 //片上 RAM 块 L1 */

FLASHN:origin = 0x100000、length = 0x002000 //片上闪存*/
FLASHM:origin = 0x102000、length = 0x002000 //片上闪存*/
FLASHL:origin = 0x104000、length = 0x002000 //片上闪存*/
FLASHK:origin = 0x106000、length = 0x002000 //片上闪存*/
FLASHJ:origin = 0x108000、length = 0x008000 //片上闪存*/
FLASHI:origin = 0x110000,length = 0x008000 //片上闪存*/
FLASHH:origin = 0x118000,length = 0x008000 //片上闪存*/
FLASHG:origin = 0x120000,length = 0x008000 //片上闪存*/
FLASHF:origin = 0x128000、length = 0x008000 //片上闪存*/
FLASHE:origin = 0x130000,length = 0x008000 //片上闪存*/
FLASHD:origin = 0x138000、length = 0x002000 //片上闪存*/
//csm_PWL_P0:origin = 0x139FF8,length = 0x000008
//ECSL_PWL_P0:origin = 0x139FFC,length = 0x000004
//FLASH_EXT_ONLY _P0:origin = 0x139FFE,length = 0x000002
开始:origin = 0x13A000,length = 0x002000
/*FLASHC:origin = 0x13A000,length = 0x002000 //片上闪存*/
/*FLASHA:origin = 0x13E000,length = 0x001F80 /*片上闪存*/

/*csm_RSVD:origin = 0x13FF80,length = 0x000070*/* FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 *
/*begin:origin = 0x13FFF0,length = 0x000002/* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 *
/*FLASH_EXT_ONLY _P0:origin = 0x13FFF2,length = 0x000002/* FLASHA 的一部分。 闪存只执行 FLASHA 中的位置*/
/*ECSL_PWL_P0:origin = 0x13FFF4,length = 0x000004 // FLASHA 的一部分。 FLASHA 中的 ECSL 密码位置*/
/*csm_PWL_P0:origin = 0x13FFF8,length = 0x000008 // FLASHA 的一部分。 FLASHA 中的 CSM 密码位置*/

FPUTABLES:origin = 0x3FD258,length = 0x0006A0 //引导 ROM 中的 FPU 表*/
IQTABLES:origin = 0x3FD8F8,length = 0x000B50 //引导 ROM 中的 IQMath 表*
IQTABLES2:origin = 0x3FE448,length = 0x00008C //引导 ROM 中的 IQMath 表*
IQTABLES3:origin = 0x3FE4D4,length = 0x0000AA /*引导 ROM 中的 IQMath 表*/

BootROM:origin = 0x3FEDA8,length = 0x001200 //引导 ROM */
PIEMISHNDLR:origin = 0x3FFFBE,length = 0x000002/*部分引导 ROM *
复位:origin = 0x3FFFC0,length = 0x000002 //引导 ROM 的部分*/
向量:origin = 0x3FFFC2,length = 0x00003E //引导 ROM 的部分*/

e2e.ti.com/.../Hex-and-cmd-files.7z

4.最后,我读出 C28存储器不像 ARM 架构那样是字节可寻址的,如果我需要存储和连接字符变量,那么最好的解决方案是什么? 下面的示例  

例如:    

UNION

   uint32 Val;
    结构{
          UINT8 FIRSTB;

          UINT8 SECONDB;

           uint8 THIRDB;

          uint8 FOURTHB;

      
        }字节;
}地址;

如果我尝试向 THIRDB 和 FOURTHB 写入一些值、这对 Val 变量没有任何影响?  

谢谢

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

    Preetham、

    感谢您联系 E2E、回答如下:

    1. C28内核从其引导 ROM 阶段跳转到哪个地址?  

    a1) C28x 将首先自动执行一些系统初始化函数,然后根据 MTOCIPCBOOTMODE 寄存器的内容进行引导;闪存、RAM、SCI、SPI、 I2C、并行 请从  第576页开始查看 www.ti.com/.../详细信息

    2.为了测试我的引导加载程序应用程序,我使用了一个简单的 Blinky C28应用程序。 现在,我应该更改 RESET_Vector 所在的地址吗? 或者、我是否应该担心"开始"部分的位置会被称为"codestart"函数?  

    a2)阅读上述部分后,这将变得更加清楚,但简而言之,您最终将此代码放置在闪存入口点(0x13FFF0)或 RAM 入口点(0x000000 ),具体取决于您选择的选项

    我为 C28启用了十六进制实用程序文件、该文件确实为我生成了.hex 文件。 但是,如果我尝试对文件的前两行进行解码,我会得到一个初始起始地址为0x00098000,这是我不理解的吗? 当我编辑了闪烁应用程序链接器脚本以从0x0013A000开始其起始地址时?  

    a3)我假设您从以下示例开始: C:\ti\controlSUITE\device_support\f28m35x\v220\F28M35x_examples_Dual\blinki\c28、 我注意到该项目正在生成一个.map 文件作为其链接选项的一部分。  您可以查看此文件(仅一个 txt 文件)以显示代码的不同部分将要访问的位置。  此外、虽然加载地址可能是0x13xxxx 请注意运行地址可能不同、即加载到闪存、但在本示例中从 RAM 复制并执行。

    最棒的

    Matthew

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

    您好、Matthew、

    感谢您的及时响应。 我将介绍参考手册、我认为它可以为我提供前三个问题的更多详细信息。  

    但是,您能否建议一些内容,或者让我参考一些可以回答我第四个问题的参考文档?  

    谢谢

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

    很抱歉、我错过了第四季度、请尝试开始以下操作:

    http://processors.wiki.ti.com/index.php/Byte_Accesses_with_the_C28x_CPU

    Matt

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

    在您回答问题3后、我快速浏览了.map 文件并将其与我使用的链接器脚本文件(脚本文件随附在我的第一篇帖子中)进行了比较 并注意到"Code _start"是 C28用户用来定义它从何处开始的第一个符号。 在我的示例中、它位于地址0x0013A000处、与我在链接器脚本中设置的地址相同。

    但是、有些符号在某些 RAM 地址开始、例如从0x00008000运行的"_InitFlash"。 现在,我如何知道部分启动代码是否被复制到 RAM 中并从 RAM 中执行? 因为查看源代码内部,我看不到任何将代码段复制到 RAM 内存的文件? 您能不能给我介绍一下如果地址0x00098000处确实有一些代码、如何进行调试?
    因为我还调试了这个闪烁的应用程序,所以尝试在内存视图中查找地址0x00098000,而这里没有任何内容,那么我生成的.hex 文件是如何捕获这个地址的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Matt、

    一些更新:

    为了生成.hex 文件、我启用了十六进制实用程序工具并使用了一些标志"--memwidth=32 --romwidth=32 --Intel"、但现在我将其更改为
    --memwidth=16 --romwidth=16 --Intel,现在查看我的.hex 文件更有意义。