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.

[参考译文] TMS570LC4357:有关 F021 API Fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy()

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1077786/tms570lc4357-query-regarding-usage-of-f021-api-fapi_domarginreadbybyte

部件号:TMS570LC4357
“线程:测试”中讨论的其它部件

您好,

使用 F021 API 执行以下序列时遇到问题:

1.读取 Bank0中的地址。

2.使用步骤1中使用的地址擦除扇区。

3.写入  步骤1中读取的地址(并在步骤2中擦除)。

4.阅读在步骤3中写入的数据。

上述所有操作都在同一个 Bank0地址上执行。 在上述序列中,要求进行擦除和写入操作的 F021 API (步骤2和3)不返回错误,但数据不会从闪存中擦除/写入闪存。  如果我跳过步骤1,则擦除和写入操作将贯穿并在写入(步骤4)后执行读取操作,也会返回正确的数据。 在执行擦除/写入操作之前读取地址是否会导致 问题?

我 正在使用 Fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByBy() API (采用 Fapi_NormalRead 边界模式)从闪存中读取数据。   在调用读取函数之前,是否需要调用 Fapi_setActiveFlashBank()和 Fapi_enableMainBankSector() API? 此外,在    Fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy

感谢您在这方面的帮助。

谢谢,此致,

Vimal

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

    您好,Vimal,

    当您打开读取边距模式时,它将影响所有闪存库。 由于您正在从 bank0中运行代码,所以 bank0在提取代码时也会受到边界模式的限制。  在 LC43x 设备上始终启用 ECC, 如果闪存位单元处于边缘状态,且在边界模式下本应读取错误的闪存位单元将由 ECC 进行修正,如果在读取边界测试期间两个或更多位处于边缘状态,则可以看到不可纠正的错误。 步骤1中是否出现 ECC 错误? 您是否已从 SRAM 中运行代码(与闪存操作相关)?

    对于读取边距,您不必启用银行扇区,即启用该扇区进行程序和擦除。

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

    您好,

    感谢您的回复。 该代码正在从 SRAM 执行,而不是从 Bank0执行。 对此表示歉意。

    使用的 Bank0地址为0x00180000U。 步骤1中没有 ECC 错误。 对于写入操作,使用了 Fapi_AutoEccGeneration 参数。

    我在第1列气缸组中尝试了相同的地址序列(未使用),但也出现了相同的问题。  用于擦除/写入的闪存 API 不会返回任何错误,但闪存内容保持不变。 仅当在删除/写入同一地址之前对地址执行读取时,才会出现该问题。 如果在写入操作后读取,则不会出现此问题。 以下 是两个序列来证明此问题(“传递的数据”是指示性的):

    序列 1:
    擦除0x00180000U => 无错误
    写入0x00180000U => 数据 通过:0x1234,无错误
    读取0x00180000U =>无错误,返回0x1234

    序列2:
    读取0x00180000U =>无错误,返回0xffffff
    擦除0x00180000U =>无错误
    写入0x00180000U =>数据 通过:0x1234, 无错误
    读取0x00180000U =>无错误,返回0xffffff

    序列2对银行0和银行1都失败,但在银行7 (费用)的地址(0xF0201000U)上按预期工作。

    此外,如果在步骤4后将数据写入到另一个 Bank0地址或对其执行擦除操作,则该操作将成功执行,如下所示:

    顺序3:
    读取0x00180000U =>无错误,返回0xffffff
    擦除0x00180000U =>无错误
    写入0x00180000U =>数据 通过:0x1234, 无错误
    读取0x00180000U =>无错误,返回 0xffffff

    擦除0x001BFF00U =>无错误
    写入0x001BFF00U => 数据通过:0xABCD, 无错误
    读取 0x001BFF00U =>无错误,返回 0xABCD

    在    执行 Fapi_doMarginReadByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByByBy()之前,不会调用 Fapi_setActiveFlashBank

    我面临的另一个问题是 ,在 Bank0上执行擦除银行操作会在后续闪存操作中导致 UndefEntry 异常。 对从 RAM 执行代码进行更改的链接器文件如下所示:

    内存

    矢量(X):原点=0x00000000长度=0x00000020
    FLASH0 (RX):Origal=0x00000020 Length=0x001FFFE0
    FLASH1 (RX):原点=0x00200000长度=0x00200000
    堆栈(RW):原点=0x08000000长度=0x00001500
    RAM (rwx):Origin =0x08001500 length=0x0007EB00
    }

    章节

    .intvecs:{}>矢量
    .TI.ramfunc align(32):{-l F021_API_CortexR4_be_L2FMC_V3D16.lib(.text)}
    load=FLASH0,run=RAM,
    load_start (ramfunctsLoadStart),
    load_size (ramfunctsLoadSize),
    load_end (ramfunctsLoadEnd),
    run_start (运行启动),
    run_size (ramfunctsRunSize),
    run_end (运行环境)
    文本对齐(32):{}> FLASH0 | FLASH1
    const align(32):{}> FLASH0 | FLASH1
    电影对齐(32):{}>电影 H0|电影 H1
    Pinit align(32):{}> FLASH0 | FLASH1
    .bss:{}>内存
    数据:{}>内存
    sysmem:{}>内存
    }

    调用 Flash API 的函数的前缀为:

    #pragma code_section (<xxx>,".TI.ramfunc");

    已使用以下语句将这些函数从闪存复制到代码中的 RAM:

    Memcpy (&RamfunctsRunStart,&RamfunctsLoadStart,(size_t)&RamfunctsLoadSize);

    此外,MPU 已配置为将 SRAM 区域定义为 MPU_NORMAL _OIWTNOWA_NONSHARED (MPU_PRIV_RW_USER_NA_EXEC 许可)类型 。

    是否需要其他更改?

    谢谢,此致,

    Vimal

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

    您好,

    希望您能就此问题提供任何意见。

    谢谢,此致,

    Vimal

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

    您好,QJ Wang,

    这是一个关键问题。 如果您能分享任何有助于解决问题的信息,我们将不胜感激。

    谢谢,此致,

    Vimal

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

    您好,Vimal,

    Cortex-R5F Hercules MCU 上的所有可缓存位置均为读取分配。 这意味着数据高速缓存行在发生高速缓存丢失时被分配, 从而将32字节的数据从主内存传输到高速缓存内存中。 因此,对这些内存位置的后续访问将导致高速缓存命中,数据将直接从高速缓存内存中读取。

    通过 F021闪存 API 编程闪存时不会将数据写入高速缓存,因此高速缓存不会更新。 因此,您的第二个读取的值与第一个读取的值相同。

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

    您可以将主闪存配置为 Normal_OINC_Noshare

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

    您好,QJ Wang,

    感谢您的回复。 昨天我通过禁用高速缓存解决了该问题。 我将尝试您的解决方案并 进行相应的更新。 此外,请分享一些用于将代码从闪存移至 RAM 的示例代码。 如上所述,我在删除 Bank0和某些(但并非所有) Bank0扇区时遇到问题。

    谢谢,此致,

    Vimal

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

    您好,Vimal,

    请使用 bootloader 作为示例。

    https://git.ti.com/cgit/hercules_examples/hercules_examples/tree/Bootloaders?h=master

    链接器 CMD:

    章节

    .intvecs:{}>矢量

    闪存 API:

      ..\sources\Fapi_UserDefinedFunctions.obj (.text,.data)
      .\sources\BL_flash.obj (.text,.data)
      --library=“c:\ti\Hercules \F021 Flash API\02.01.01\F021_API_CortexR4_be.lib”(.text,.data)
    } palign =8 load = FLASH0,run = SRAM,load_start (apiLoadStart),run_start (apiRunStart),size (apiLoadSize)

    text:{}> FLASH0/*已初始化的可执行代码和常量*/
    const:{}> FLASH0

    cinit:{}> FLASH0/*已初始化全局和静态变量*/
    Pinit:{}> FLASH0
    数据:{}> SRAM
    .bss:{}> SRAM /*未初始化的全局和静态变量*/
    sysmem:{}> SRAM

    /*用户码开始(4)*/
    /*用户代码结束*/
    }

    在 sys_main.c 中

    外部未签名的 apiint LoadStart;
    外部无符号的 apiint LoadSize;
    外部无符号 apiint RunStart;

    主要()

       ...

      Memcpy (&apiRunStart,&apiLoadStart,(UINT32) apiLoadSize);

       (笑声)

    }

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

    您好,QJ Wang,

    感谢您的回复。 我似乎没有访问引导加载程序代码的权限。 当我尝试访问 bl_link.cmd 文件时,它显示“您无权访问此资源”。 请提出建议。

    谢谢,此致,

    Vimal

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

    您好,QJ Wang,

    我已经对 链接程序命令文件进行了建议的更改 ,但当我尝试以下操作时,在步骤3中仍会出现一个“未定义”异常:

    1.从 Bank0,Sector0读取数据并将数据写入 SRAM。

    2.擦除 Bank0,Sector0。

    3.将步骤1中读取的数据从 SRAM 写入 Bank0,Sector0。

    我的理解是,在执行步骤2中删除的代码时可能会出现此问题。 请告诉我这是否正确,以及可以采取哪些措施来确保上述方案成功。

    请注意,函数调用序列如下:

    main()函数 A()函数 B_xx()函数 Fapi_xxx()

    所有函数 B_xx()函数都被放入一个文件中,并配置为从 RAM 运行(类似于 BL_FLASH。c)。 以上三个步骤是 函数 A()的一部分。 我尝试从闪存和 RAM 执行 funcA(),但没有成功。 我还在执行步骤1之前禁用了中断,并在步骤3之后启用了中断。  我能够删除和编程第0列银行中未使用的部门。

    感谢您在这方面的投入。

    谢谢,此致,

    Vimal

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

    Vimal,

    如果您的代码位于闪存 sector0中,并且您要擦除扇区0,则必须将所有代码从 sector0复制到 SRAM,并从 SRAM 中执行代码。

    位于扇区0开头的异常矢量表将被擦除,因此当您有任何外部中断或任何中止(数据中止和 pAbort)时,您将收到错误。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="506337" url="~ë/support/dominice-based 微控制器-组/基于 ARM 的微控制器/f/基于 ARM 的微控制器- forum/1077786/tms570lc4357-query-usage-of-f021-api_fapi_domarginreadbybyte/399699999]#99999]

    当我尝试访问 bl_link.cmd 文件时,它显示“您无权访问此资源”。 请提出建议。

    [/引用]

    应该解决这一问题-我报告 了在 HTTP 403 Forbidden 错误中尝试浏览 https://git.ti.com/下的.cmd 文件时出现的类似问题