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.

[参考译文] TM4C1299NCZAD:TM4C1299

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1401367/tm4c1299nczad-tm4c1299

器件型号:TM4C1299NCZAD

工具与软件:

您好!

我正在处理一个具有外部 SDRAM 的项目。  在调试模式下、修改 GEL 文件之后、我可以将数据和代码加载到外部 SDRAM 中。  但现在、我通过更改链接器 文件以包含更多 obj 文件来增加外部 SDRAM 中运行的代码、调试器不再运行。  误差如下。

Cortex_M4_0:GEL 输出:
存储器映射初始化完成
Cortex_M4_0:文件加载程序:验证失败:地址0x61017E81的值不匹配请验证目标存储器和存储器映射。
Cortex_M4_0:GEL:file:C:\ccs_DEPC_repo\master_2g5\de-platform\de-Platform\Debug\de-Platform.out:发生数据验证错误、文件加载失败。

如果我更改 obj 文件顺序、问题地址可能会更改。

我可以就此提供建议吗?

谢谢!

此致、

Lezhong Lin

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

    尊敬的 Lezhong:

     您能提供更多信息吗? 您可以展示链接器命令文件之前和之后的链接器命令文件吗?

     您的 SDRAM 有多大?

     最终二进制文件要加载到 SDRAM 中的大小是多少?

     您说您增加了更多 obj 文件。 如果一次只添加一个 obj 文件会怎样? 在您添加了多少个其他 obj 文件后会导致您看到错误?

     您说将新二进制文件加载到 SDRAM 中是否正在正常工作? 无法正常工作的是从 SDRAM 中运行代码?

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

    谢谢 Charles。

    SDRAM 为32M 字节。  二进制文件约为200K 字节。  我逐一添加了这些器件。  但是、当我添加一个特定对象时、我收到错误消息。

    该错误消息是在将二进制文件加载到 SDRAM 中期间出现的。  我重新附上消息:

    Cortex_M4_0:GEL 输出:
    存储器映射初始化完成
    Cortex_M4_0:文件加载程序:验证失败:地址0x61017FD1处的值不匹配请验证目标内存和内存映射。
    Cortex_M4_0:GEL:file:C:\ccs_DEPC_repo\master_2g5\de-platform\de-Platform\Debug\de-Platform.out:发生数据验证错误、文件加载失败。

    我在此处看不到"附件文件"按钮。  我在此处粘贴了链接器命令文件内容。  ext_code 部分中有很少的 obj 文件。  我添加了前2个文件、它是有效的。  但是、当我添加第三个时、它会显示上述错误。

    #ifdef linker_bootloader_base_high //对于 debug build:在"Properties"中定义->"CCS Build"->"Arm Linker"->"Advanced Options"->"Command File Preprocessing"
    #define bootloader_BASE 0x000F8000 //这是仅适用于在调试编译中结合应用程序代码使用的特殊编译
    #define APP_BASE 0x00000000
    #else
    #define bootloader_BASE 0x00000000 //调试和发布构建
    #define APP_BASE 0x00008000
    #endif /* linker_bootloader_base_high */

    #define bootloader_size 0x00008000 // 32KB
    #define APP_SIZE 0x000f8000 //总计-引导加载程序= 1M - 32K = 992K
    #define RAM_BASE 0x20000000
    #define RAM_SIZE 0x00040000

    /*外部 SDRAM */
    #define SDRAM_START_ADDRESS 0x60000000 //确定何时使用 EPI_ADDR_RAM_BASE_6初始化 EPI
    #define SDRAM_TOTAL_SIZE 0x02000000 // 256M 位= 32M 字节
    #define SDRAM_DATA_SIZE 0x01000000 // 16M 字节
    #define SDRAM_CODE_SIZE SDRAM_TOTAL_SIZE - SDRAM_DATA_SIZE

    /*系统内存映射*/

    小程序

    /*应用程序存储在内部闪存中并从内部闪存执行*/
    FLASH (RX): origin = APP_BASE, length = APP_SIZE
    /*应用程序对数据使用内部 RAM */
    SRAM(rwx): origin = RAM_BASE, length = RAM_SIZE

    /* LLIN 2023年12月01日:通过 EPI 接口的外部 SDRAM */
    /*拆分为2个部分*/
    EPISDRAM_DATA (RWX):origin = SDRAM_START_ADDRESS、length = SDRAM_DATA_SIZE
    EPISDRAM_CODE (RWX):origin = SDRAM_START_ADDRESS + SDRAM_DATA_SIZE、length = SDRAM_CODE_SIZE
    }

    /*存储器中的段分配*/

    部分中)

    .intvecs:> app_base
    .text :>闪存
    .const :> FLASH
    .cinit :>闪存
    . Pinit :>闪存
    .init_array :> FLASH

    .vtable :> RAM_BASE
    // 2022年07月29日 TC:组强制段位于中
    //显示顺序。 链接器将按最大到排列
    //否则为最小值。 当 data < system、order
    ///开关、并且会遇到存储器损坏的情况
    //当前未知原因。
    相关

    .bss
    .data
    .sysmem
    .stack
    }> SRAM

    /*通过 EPI 外部 SDRAM 的外部段*/
    /*有关如何使用外部 SDRAM */、请参阅 drv_epi.h 中的注释

    /*在此部分中在外部 SDRAM 上定义全局变量*/
    EXT_DATA :> EPISDRAM_DATA

    /*在本节中在外部 SDRAM 上定义代码*/
    EXT_CODE:

    . = align (32);
    _ext_code_start =;
    *(外部代码)
    app_json_get_library.obj
    app_json_post_LIBRARY.obj
    APP_VSD_ivs101.obj
    APP_VSD_IVS.obj
    _ext_code_end =。 - 1;
    }> EPISDRAM_CODE
    }

    __STACK_TOP =__STACK +_STACK_SIZE;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我添加了前两个文件、它运行正常。  但当我添加第三个时,它显示了上述错误。

    您说此错误位于地址0x61017FD1上。 如果您看看地址1017FD1的最后7位、它已经超过了16MB。 您可能没有配置 SDRAM 大小来适应该范围。  

    是否已对目标文件进行重新排序? 结果如何?

    对于实验、如果第三个目标文件是非常小的文件、该怎么办? 我只想知道第三个文件的大小是否与它有关。

    您可以在另一块电路板上重复同样的问题吗? 我想排除此问题是否与 SDRAM 有关。   

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

    谢谢 Charles。

    实际上、我有32M 字节的 SDRAM。  我把它分成了2个16M。  从0x60000000到0x60FFFFFF 用于数据。  从0x61000000到0x61FFFFFF 表示代码。  因此0x61017FD1在代码范围内。

    我对目标文件重新排序了。  例如、如果我将*(ext_code)放在第一个 app_json_get_library.obj 之后。  在测试过程中、我删除了所有其他 obj 文件。  即使只有 app_json_get_library.obj 文件也无法正常运行。

    第三个目标文件是20988字节。  它的大小与其他 obj 文件相当。

    是的、我们尝试了2块电路板。  我们在同一地址也有同样的问题。  我还尝试了不同的调试探针、Blackhawk 和 JLink。  它们都不起作用、但报告的问题地址不同。  它似乎与硬件无关。

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

    尊敬的 Lezhong:

     据我所知、在处理器初始化过程中、需要首先设置 SDRAM 模块、并通过 EPI 接口将代码和数据复制到 SDRAM 中。 是这样吗?  

     我想您看到的错误是在运行时发生的、对吧? 换言之、它不是在编译期间发生的。 请多多指教。  

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

    谢谢 Charles、

    在调用_c_int00之前、我在 startup.c 中的 ResetISR 中添加了 EPI 初始化函数

    空洞
    ResetISR (空)

    //必须在_c_int00之前初始化 EPI
    //否则将直接进入 Hardfault
    //初始化栈指针
    __SET_MSP (uint32_t)&__STACK_END);

    //初始化 EPI 和 SDRAM
    drv_epiInit ();

    //
    //跳转至 CCS C 语言初始化例程。 这将启用
    //也可以使用浮点单元、因此无需在此处执行此操作。
    //
    _asm (".global _c_int00\n"
    " b.w _c_int00");
    }

    加载过程似乎在_c_int00内。  因此、错误既不存在于运行时、也不存在于编译中。  这是在调试时通过_c_int00将代码加载到外部 SDRAM 的过程中。

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

    第二个问题是错误地址位于代码范围0x610xxxxx 的中间。  如果它在起始地址0x61000000内、我可以检查 GEL 文件或 EPI 初始化。  但它位于代码范围的中间。  这是一个很大的问题。

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

    尊敬的 Lezhong:

     如果问题发生在_c_int00中、我可能需要向我们的 CCS 专家转发您的问题。 _c_init 将初始化全局变量并运行其他任务。 能否再次说明您能否成功构建 CCS 工程。 如果您说问题既不在编译中、也不在运行时中、我不清楚。 也许我应该提出以下问题。 请提供您对每一项的反馈。  

     -您能成功生成.out 文件吗? 这就是我编译的意思。  

     -您能成功地将.out 文件加载到内部闪存中吗? 这只是加载部分、处理器尚未运行。  

     -处理器从 ResetISR 开始运行后,它将在控制台上产生错误。 是这样吗? 在这个地方、你说_c_int00中似乎会发生某种程度的错误。  

     -我想你要创建某种类型的引导加载程序,以首先从一些外部 NVM 内存读取代码/数据,然后复制代码/数据到 SDRAM。 加载 SDRAM 之后、您将程序计数器更改为 SDRAM 地址、以从中运行代码。 这是正确的理解吗?

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

    谢谢 Charles、

    请在下面找到答案:

     -您能成功生成.out 文件吗? 这就是我编译的意思。  

    是的、我可以生成.out 文件。

     -您能成功地将.out 文件加载到内部闪存中吗? 这只是加载部分、处理器尚未运行。  

    是的、我可以成功地将.out 文件加载到内部闪存中。

     -处理器从 ResetISR 开始运行后,它将在控制台上产生错误。 是这样吗? 在这个地方、你说_c_int00中似乎会发生某种程度的错误。  

    不可以、处理器在产生错误前不能从 ResetISR 开始运行。

    但我们在上一次调试会话中已经加载了代码、因此在上电后正确地初始化了 EPI。  因此在下面的调试会话中 EPI 始终处于就绪状态、并且 SDRAM 代码应该能够被载入外部 SDRAM 中。

    但现在、在验证过程中、SDRAM 会出现故障。  这很奇怪、因为失败的地址不在0x61000000的第一个地址上。

     -我想你要创建某种类型的引导加载程序,以首先从一些外部 NVM 内存读取代码/数据,然后复制代码/数据到 SDRAM。 加载 SDRAM 之后、您将程序计数器更改为 SDRAM 地址、以从中运行代码。 这是正确的理解吗?

    否、我们没有使用您提到的方法来运行 SDRAM、因为该方法会更复杂地进行调试。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="583941" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1401367/tm4c1299nczad-tm4c1299/5366093 #5366093"]

    但我们在上一次调试会话中已经加载了代码、因此在上电后正确地初始化了 EPI。  因此在下面的调试会话中 EPI 始终处于就绪状态、并且 SDRAM 代码应该能够被载入外部 SDRAM 中。

    不可以、我们没有使用您提到的方法来运行 SDRAM、因为这样做调试会更复杂。

    内部闪存仅为1MB。 您的 SDRAM 是32MB。 如何在不使用引导加载程序的情况下加载 SDRAM、首先将 SDRAM 代码从外部 NVM 复制到 SDRAM 中、然后从 SDRAM 运行。 内部闪存如何保存32MB SDRAM 代码和数据? 您能解释一下吗? 是否在先前的调试会话中加载了 SDRAM、不知何故、必须有机制来将32MB 的代码从某处复制到 SDRAM、对吧?

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

    您好、Charles、

    在调试过程中、仿真器根据 GEL 文件加载代码、并且我在 GEL 中添加了外部 SDRAM 存储器范围。  

    首次内部闪存为空时、仿真器无法将代码加载到外部 SDRAM 中。  但在首次调试失败时、EPI 初始化代码会被加载到内部闪存中。  之后、EPI 始终正确初始化。  这样在后续的调试会话中、仿真器可以使用 EPI 来将代码载入 SDRAM 中。

    实际上、我们发现了该问题的根本原因。  我们意外地将一个 EPI 引脚重新配置成另一个引脚。  EPI 此时并未正确初始化。  删除之后、一切都正常。

    非常感谢您的帮助和支持!

    此致、

    Lezhong Lin

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

    尊敬的 Iezhong:

     很高兴你弄清了这个问题。 老实说,我有一个困难的时间来诊断问题的原因。 如您所述、从未考虑过引脚问题、您更改的唯一内容是链接器文件以包含更多 obj 文件。  

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

    是的,查尔斯,我从来没有想过这样。  问题是它不是0x61000000的第一个地址。  这是一个很大的问题。

    无论如何、请关闭此票证。  非常感谢您提供的及时帮助和支持。

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

    雷中市

     这只是我所知的最后一件事。 您要使用的仿真器是什么? 我可能错了、但我认为 CCS 已经具有 M4仿真器了。 或者、GEL 脚本就是仿真器的含义? 首先初始化 EPI 和 SDRAM。 GEL 脚本主要 通过 JTAG 接口将 LDR/STR 指令扫描到处理器的调试逻辑中、最终是在调试模式(而不是运行模式)下对 SDRAM 执行读/写操作的处理器。  

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

    感谢 Charles 提供了有关代码加载过程的信息。  我的意思是仿真器就是调试探针。   

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

    我们在发布版本中提供了 SDRAM 代码加载函数。