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.

[参考译文] TMS320F28335:闪存 API 相关问题

Guru**** 2643885 points

Other Parts Discussed in Thread: TMS320F28335

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1585704/tms320f28335-flash-api-related-issue

器件型号: TMS320F28335

TI 团队大家好、

我正在使用 TMS320F28335 源代码控制器。 我可以使用成功更新固件 TI 闪存 API 、并且该代码在重置后可以正常运行。

但是、当我通过对器件进行编程时 Code Composer Studio (CCS) 消息流 JTAG 、代码在加载后立即运行、但是 在下电上电或复位后不运行

似乎正在加载并执行代码 RAM 而不是 闪存中 。 我希望应用程序始终从闪存运行、无论是通过 JTAG 编程还是通过闪存 API 进行更新。

谢谢

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

    您好:

    您能否发送与您的工程关联的链接器 cmd 文件? 您使用的是闪存构建配置吗?

    此致、

    Skyler

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

    /*
    //##########################################################################
    //
    //文件:F28335.cmd
    //
    //标题:F28335 器件的链接器命令文件
    //
    //##########################################################################
    //$TI 版本:F28335 API 版本 v2.10 $
    //$Release Date:2008年8月18日$
    //##########################################################################
    */

    /*==================================================
    //对于 Code Composer Studio V2.2 和更高版本
    //------------------------------------------------
    //除此内存链接器命令文件外、
    //将头链接器命令文件直接添加到工程中。
    //链接头链接器命令文件是必需的
    //外设结构到内的正确位置
    //存储器映射。
    //
    //头链接器文件位于中 \DSP2833x_Headers\cmd
    //
    //对于 BIOS 应用程序、添加:DSP2833x_Headers_bios.cmd
    //对于非 BIOS 应用程序、添加:DSP2833x_Headers_nonBIOS.cmd
    =================================================== */

    /*==================================================
    //对于 V2.2 之前的 Code Composer Studio
    //------------------------------------------------
    // 1) 使用以下-l 语句之一来包含
    //项目中的头链接器命令文件。 标头链接器
    //需要使用文件将外设结构链接到正确的位置
    //存储器映射中的位置*/

    /*取消注释此行以仅包含非 BIOS 应用程序的文件*/
    /*-l DSP2833x_Headers_nonBIOS.cmd */

    /*取消注释此行以仅包含 BIOS 应用程序的文件*/
    /*-l DSP2833x_Headers_bios.cmd */

    /* 2) 在项目中添加路径 \DSP2833x_headers\cmd 至
    “Project"->"Build Options"“ Options",“,"Linker"“"Linker"选项、选项卡“卡下“下的
    库搜索路径 (-i)。
    /*=================================================== */

    /*定义 F28335 的内存块起始/长度
    第 0 页将用于组织程序段
    PAGE 1 将用于组织数据段

    注意:
    F28335 上的存储器块是统一的(即相同的
    物理存储器)的位。
    相同的存储器区域不应是这样
    已为 PAGE 0 和 PAGE 1 定义。
    这样做将导致程序损坏
    和/或数据。

    L0/L1/L2 和 L3 存储器块被镜像 — 即
    可以在高内存或低内存中访问它们。
    为简单起见、在此仅使用一个实例
    链接器文件中。

    可以组合连续的 SARAM 存储器块
    以创建更大的存储块。
    */


    移动数据

    第 0 页:/*程序存储器*/
    /*存储器 (RAM/FLASH/OTP) 块可移至 Page1 以进行数据分配*/

    ZONE0:origin = 0x004000、length = 0x001000 /* XINTF 区域 0 */
    RAML0:origin = 0x008000、length = 0x001000 /*片上 RAM 块 L0 */
    RAML1:origin = 0x009000、length = 0x001000 /*片上 RAM 块 L1 */
    RAML2:origin = 0x00A000、length = 0x001000 /*片上 RAM 块 L2 */
    RAML3:origin = 0x00B000、length = 0x001000 /*片上 RAM 块 L3 */
    ZONE6:origin = 0x01000000、length = 0x100000 /* XINTF 区域 6 */
    ZONE7A:origin = 0x0200000、length = 0x00FC00 /* XINTF 区域 7 — 程序空间*/
    FLASHH:origin = 0x300000、length = 0x008000 /*片上闪存*/
    FLASHG:origin = 0x308000、length = 0x008000 /*片上闪存*/
    FLASHF:origin = 0x310000、长度= 0x008000 /*片上闪存*/
    FLASHE:origin = 0x318000、长度= 0x008000 /*片上闪存*/
    FLASHD:origin = 0x320002、长度= 0x007FFE /*片上闪存*/
    FLASHC:origin = 0x328000、length = 0x008000 /*片上闪存*/
    FLASHB:origin = 0x330000、length = 0x008000 /*片上闪存*/
    FLASHA:origin = 0x338000、length = 0x007F80 /*片上闪存*/
    CSM_RSVD:origin = 0x33FF80、length = 0x000076 /* FLASHA 的一部分。 当 CSM 正在使用时、使用所有 0x0000 进行编程。 */
    begin:origin = 0x320000、length = 0x000002 /* FLASHA 的一部分。 用于“引导至闪存“引导加载程序模式。 */
    CSM_PWL:origin = 0x33FFF8、length = 0x000008 /* FLASHA 的一部分。 FLASHA 中的 CSM 密码位置*/
    OTP:origin = 0x380400、length = 0x000400 /* On-chip OTP */
    ADC_CAL:origin = 0x380080、length = 0x000009 /*保留存储器中的 ADC_cal 函数*/

    IQTABLES:origin = 0x3FE000、length = 0x000b50 /* Boot ROM 中的 IQ 数学表*/
    IQTABLES2:origin = 0x3FEB50、length = 0x00008c /* Boot ROM 中的 IQ 数学表*/
    FPUTABLES:origin = 0x3FEBDC、length = 0x0006A0 /* Boot ROM 中的 FPU 表*/
    ROM:origin = 0x3FF27C、length = 0x000D44 /* Boot ROM */
    重置:origin = 0x3FFFC0、长度= 0x000002 /*引导 ROM 的一部分*/
    Vectors:origin = 0x3FFFC2、length = 0x00003E /*引导 ROM 的一部分*/

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

    boot_RSVD:origin = 0x000000、length = 0x000050 /* M0 的一部分、引导 ROM 将用于堆栈*/
    RAMM0:origin = 0x000050、length = 0x0003B0 /*片上 RAM 块 M0 */
    RAMM1:origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 */
    RAML4L5L7:origin = 0x00C000、length = 0x004000 /*片上 RAM 块 L1 */
    // RAML4_L5_:origin = 0x00C000、length = 0x002000 /*片上 RAM 块 L1 */
    // RAML5:origin = 0x00D000、length = 0x001000 /*片上 RAM 块 L1 */
    // RAML6:origin = 0x00E000、length = 0x001000 /*片上 RAM 块 L1 */
    // RAML7:origin = 0x00F000、length = 0x001000 /*片上 RAM 块 L1 */
    ZONE7B:origin = 0x20FC00、length = 0x000400 /* XINTF zone 7 - data space */
    // FLASHB:origin = 0x330000、length = 0x008000 /*片上闪存*/
    }

    /*将段分配给存储器块。
    注意:
    DSP28_CodeStartBranch.asm 中的 codestart 用户定义段用于重定向代码
    引导至闪存时执行
    ramfuncs 用户定义的段、用于将要从闪存复制到 RAM 中的函数存储
    */

    很重要


    /*分配程序区域:*/
    /*闪存 API 函数可以分组在一起、如下所示。
    定义的符号_Flash28_API_LoadStart、_Flash28_API_LoadEnd
    和_Flash28_API_RunStart 用于将 API 函数复制出去
    和 SARAM 中*/

    闪存 28_API:

    lFlash28335_API_V210.lib (.econst)
    lFlash28335_API_V210.lib (.text)
    } load = FLASHD、
    RUN = RAML0、
    LOAD_START (_Flash28_API_LoadStart)、
    LOAD_END (_Flash28_API_LoadEnd)、
    RUN_START (_Flash28_API_RunStart)、
    页面= 0
    .cinit:> FLASHD PAGE = 0
    .pinit:> FLASHD、page = 0
    .text:> FLASHD PAGE = 0
    codestart:> begin page = 0
    ramfuncs : load = FLASHD,
    RUN = RAML0、
    LOAD_START (_RamfuncsLoadStart)、
    LOAD_END (_RamfuncsLoadEnd)、
    RUN_START (_RamfuncsRunStart)、
    页面= 0

    csmpasswds:> CSM_PWL PAGE = 0
    CSM_rsvd:> CSM_RSVD 页面= 0

    /*分配未初始化的数据段:*/
    .stack :> RAMM1 PAGE = 1
    .ebss :> RAML4L5L7 page = 1.
    .esysmem :> RAMM1 PAGE = 1.

    /*初始化段进入闪存*/
    /*要使 SDFlash 对这些内容进行编程、它们必须分配至页 0 */
    .econst:> FLASHD PAGE = 0
    .switch:> FLASHD page = 0

    /*分配 IQ 数学区域:*/
    IQMath:>FLASHD PAGE = 0 /*数学代码*/
    IQmathTables:> IQTABLES、PAGE = 0、TYPE = NOLOAD
    IQmathTables2:> IQTABLES2、page = 0、type = noLoad
    FPUmathTables :> FPUTABLES, PAGE = 0, TYPE = NOLOAD

    /*分配可通过 DMA 访问的 RAM 段:*/
    DMARAML4:> RAML4L5L7、PAGE = 1
    DMARAML5:> RAML4L5L7、PAGE = 1
    DMARAML6:> RAML4L5L7、PAGE = 1
    DMARAML7 :> RAML4L5L7, page = 1.

    /*分配 XINTF 区域 7 的 0x400 以存储数据*/
    ZONE7DATA:> ZONE7B、PAGE = 1

    /*.reset 是编译器使用的标准段。 它包含*/
    /*_c_int00 表示 C 代码的起始地址。 /*
    /*在使用引导 ROM 时、此段和 CPU 矢量*/
    /*表不需要。 因此、此处将默认类型设置为*/
    /* DSECT */
    .reset:> reset、page = 0、type = DSECT
    vectors :> vectors page = 0, type = DSECT

    /*分配 ADC_cal 函数(由出厂时预编程到 TI 保留的存储器中)*/
    .adc_cal:load = ADC_CAL、page = 0、type = NoLoad

    }

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

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

    我还将 DSP2833x_Headers_nonbios.cmd 文件与该 example_flash_api.cmd 文件配合使用

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

    尊敬的 Akash:

    编程后查看“Memory Browser“、您能否确认正在对闪存进行编程?

    此致、

    Skyler

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

    是的、闪存从起始地址开始编程为十六进制代码、

    我还遇到了一个问题、当我通过闪存 API 写入十六进制文件时、以及在写入完整的十六进制文件后、当我切换到该固件代码时、原因不起作用。

    该 Hex 文件中丢失了什么。 该十六进制文件也不包含入口点代码以及 CSM 和保留代码

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

    Akash、

    Skyler 正忙于处理另一个项目、因此我将尝试帮助解决您的问题。

    我正在使用  TMS320F28335  源代码控制器。 我可以使用成功更新固件  TI 闪存 API 、并且该代码在重置后可以正常运行。

    如何使用闪存 API 对闪存进行编程? 您是否在使用我们提供的闪存内核/引导加载程序示例?

    但是、当我通过对器件进行编程时  Code Composer Studio (CCS)  消息流  JTAG 、代码在加载后立即运行、但是  在下电上电或复位后不运行 。  似乎正在加载并执行代码  RAM  而不是  闪存中 。 我希望应用程序始终从闪存运行、无论是通过 JTAG 编程还是通过闪存 API 进行更新。

    当代码运行时、您可以停止并检查代码是从 RAM 还是闪存执行。 您还可以在“使用闪存 API“编程后导出闪存内容、并在“通过 JTAG 使用 CCS “编程后将其与闪存内容进行比较、并查看它们是否匹配。 此外、我假设您的器件在所有情况下都处于闪存引导模式、因此它会在复位后引导至闪存。

    谢谢、

    Sira