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.

[参考译文] TMS570LS1227:从 RAM 执行 TI FEE 驱动器

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1165627/tms570ls1227-execution-of-ti-fee-driver-from-ram

器件型号:TMS570LS1227

您好!

     在 我们的现有实施中使用 TI FEE 驱动器代码时、我们遇到一个例外情况、在该实施中、F021闪存 API 从 RAM 中执行。 TI FEE 驱动器代码从闪存中执行。 我们的理解是、由于 TI FEE 驱动器代码调用 F021闪存 API、因此也需要从 RAM 执行。 如果这是准确的、 您能否分享   从 RAM 中执行 TI FEE 驱动器代码所需的更改? 如果没有、请要求您告知   我们此问题的可能原因。

谢谢、此致、

Vimal

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

    尊敬的 Vimal:

    我已开始处理您的问题、我将很快向您提供更新。

    --
    谢谢、此致、
    Jagadish。

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

    尊敬的 Vimal:

    是否可以共享您的代码?

    如果不可能、那么您能否分享有关问题的更多详细信息、例如您正在获得哪个异常、以及您在应用程序中获得异常的确切位置(哪个 API)?

    --
    谢谢、此致、
    Jagadish。

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

    您好 Jagadish、

    当 TI_FeeInternal_PollFlashStatus()函数作为以下块的一部分从 TI_FEE WriteSync()中调用时,我们会获得预取中止:

    while (TI_fee_GlobalVariables[u8EEPIndex].fee_u16BlockSize!=0U)

    u8WriteCount = TI_FeeInternal_WriteDataF021 (false、(uint16) TI_fee_GlobalVariables[u8EEPIndex].fee_u16BlockSize、u8EEPIndex);
    /*避免 MISRA 警告*/
    u8WriteCount=u8WriteCount;
    /*SAFETYMCUSW 91 D MR:16.10 "原因-不需要返回值。"*/
    (空) TI_FeeInternal_PollFlashStatus()
    if (TI_FEE 全局变量[u8EEPIndex].FEE u16BlockSize <= 0x8U)

    TI_FEE 全局变量[u8EEPIndex].FEE u16BlockSize = 0x0U;

    其他

    TI_FEE 全局变量[u8EEPIndex].FEE u16BlockSize=u8WriteCount;

    以下快照 包含一些调试 信息:

    如果需要其他详细信息、请告知我。

    谢谢、此致、

    Vimal

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

    尊敬的 Vimal:

    EEPROM 或 FEE 是闪存组7、您的代码存储在闪存组0中。 您无需从 SRAM 运行 FEE 代码。

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

    您好、QJ Wang、

    我们的部分代码正在  对组0扇区执行读取/写入/擦除操作。 为了实现这一点、 F021闪存 API 从 SRAM 执行。 由于 FEE 代码进行 F021调用、它是否必须 从 SRAM 执行?

    不确定这是否有用、但另一个观察结果是、在异常之前、 写入第一个块时、TI_FEE 内部 StartProgramBlock ()和 TI_Fee_WriteBlockHeader ()的 TI_Fee_WriteSync ()调用会导致 FMSTAT 被设置为0x4010、即非法地址和命令状态失败。 如 之前的响应所述,调用 TI_FeeInternal_PollFlashStatus()时,会发生预取中止。

    谢谢、此致、

    Vimal

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

    要将数据编程到组0中的扇区、必须在 SRAM 外执行 F021闪存 API 和直接调用 API 的函数。

    若要将数据编程到 EEPROM (组7)、可以从闪存组0或 SRAM 执行 F021闪存 API 和 FEE 驱动器。  

    如果您的项目将数据编程到闪存组0和 EEPROM (组7)中的两个扇区、 则 HE F021闪存 API 必须从 SRAM 运行、但 FEE 驱动器可以从闪存0执行。

    您能否共享链接器 cmd 文件以及显示如何初始化 FEE 和编程数据的代码?

    BTW、TMS570LS1227有三个闪存组:两个程序闪存组(组0和组1)和一个闪存组(组7、EEPROM)。 如果您不想将闪存 API 复制到 SRAM、则可以将数据存储到组1而不是组0的扇区。

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

    我刚才写了一个示例供您参考。 此示例在只有一个程序闪存组(组0)的 LS1224器件上进行了测试。

    8字节数据被编程到组0的扇区2:

    2. B 字节的数据被编程到 FEE 中的块#1:

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

    请找到链接器 cmd 脚本和 main()函数:

    e2e.ti.com/.../5342.sys_5F00_link.cmd

    e2e.ti.com/.../7608.sys_5F00_main.c

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

    您好、QJ Wang、

    这个问题最初是通过在  每个 TI_FEE WriteSync()调用之前调用 TI_FEE MainFunction()来解决的。 这种方法已经使用了一段时间、但代码似乎再次崩溃。

    在 共享的示例代码中,在 TI_FEE 读/写函数之后调用 TI_FEE MainFunction()。 同步函数不需要后续调用 TI_fee_MainFunction()。 您能否澄清  为什么需要在 TI_FEE Init()之后调用 TI_FEE MainFunction(),因为流程图没有提到同样的内容?  我们在     我们的代码中使用 TI_fee_Init()、TI_fee_ReadSync ()、TI_fee_WriteSync ()、TI_FeeErrorCode ()和 TI_fee_ErrorRecovery ()函数(TI_fee_GetStatus ()和 TI_fee_GetJobResult ()除外)。  由于 TI_FEE 错误恢复()函数有时可以调用 TI_FEE Init(),我们是否还需要在  TI_FEE 错误恢复()之后调用 TI_FEE 主函数()?

    谢谢、此致、

    Vimal

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

    尊敬的 Vimal:

    调用异步操作后,应定期调用 TI_FEE MainFunction()函数。  

    TI_fee_MainFunction()函数应在调用 TI_fee_Init()后调用,否则虚拟扇区信息记录(快照中的第二个64位字,突出显示部分)不会编程为 FEE。  

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

    您好、QJ Wang、

    感谢您澄清  在 TI_fee_Init()之后调用 TI_fee_MainFunction()的原因。

    我们注意  到,需要在每次调用 TI_fee_WriteSync()之前调用 TI_fee_MainFunction()。 第一次调用似乎是将第三个64位字写入 FEE。 如果没有此 TI_FEE 函数()调用,则代码在 执行 第一个同步写入调用时会卡住。 在 CCS 中进行调试时、注意到步越不会退出 TI_FEE WriteSync()函数。  暂停 代码执行时、可以看到预取中止代码已命中。 非常感谢您对此的想法。

    谢谢、此致、

    Vimal

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

     在 FEE 同步写入操作之前和之后、不需要调用 TI_FEE 主函数()。 如果在同步写入之前有异步操作, 则应在异步操作之后调用 TI_FEE MainFunction(),直到状态变为空闲。

    所有预取中止 都是同步的。  可以通过读取指令故障状态寄存器(IFSR)、指令故障地址寄存器(IFAR)来分析预取中止的原因。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="506337" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1165627/tms570ls1227-execution-of-ti-fee-driver-from-ram/4428131 #4428131"]在 CCS 中进行调试时,注意到步进不会退出 TI_FEE WriteSync()函数。  暂停 代码执行时、可以看到预取中止代码已命中。 感谢您对此的想法。[/QUERP]

    在 CCS/RM46L852中:使用 Fapi_issueProgramming Command 时跳转至 prefetchEntry 发现 调用 FAPI 函数的函数也需要从 RAM 运行、以避免预取中止。

    调用闪存或 RAM 中 FAPI 函数的函数是什么?

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

    您好、QJ Wang、

    当使用以下序列(在示例代码中共享)时、代码按预期工作:

    1.初始化闪存(Fapi_initializeFlashBanks、...)

    2.写入闪存(组0)

    3.初始化 FEE (TI_FEE、...)

    4.写入 FEE (TI_FEE 同步)

    以下 序列会出现问题:

    1.初始化闪存(Fapi_initializeFlashBanks、...)

    2.初始化 FEE (TI_FEE、...)

    3.写入闪存 (组0)

    4.写入 FEE (TI_FEE 同步)

    如果您 对此 有任何想法、敬请关注。

    谢谢、此致、

    Vimal

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

    切斯特、您好!

    调用 FAPI 函数的函数从 RAM 运行。  感谢您的意见。

    谢谢、此致、

    Vimal

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

    您好!

    我尝试了以下序列、写入数据以收费没有问题:

    数据块0被写入 FEE、它是8字节数据数组。

    我的测试中的 Fapi_Init_QJ ()仅初始化闪存组:

    uint32_t fapi_Init_QJ ()

    uint32_t status;

    STATUS=Fapi_initiatizeFlashBanks (((uint32_t) SYS_CLK_FREQ);//用于 API Rev2.01 *

    Fapi_setActiveFlashBank ((Fapi_FlashBankType) 0);
    Fapi_enableMainBankSectors (0xFFFF);//用于 API 2.01*/

    while (fapi_check_FSM_ready_busy!= fapi_Status_FsmReady);
    返回(状态);

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

    您好、QJ Wang、

    在代码快照中、似乎没有写入闪存组0的调用。 我们不在代码中使用异步写入调用。 当在 TI_FEE ()之后和在 TI_FEE WriteSync ()之前按以下顺序写入闪存组0时、就会出现此问题:

    1.初始化闪存(Fapi_initializeFlashBanks、...)

    2.初始化 FEE (TI_FEE、...)

    3.写入闪存 (组0)

    4.写入 FEE (TI_FEE 同步)

    在此附上重现此问题的示例代码以及链接器命令脚本。 如果需要其他详细信息、请告知我。 感谢您为解决此问题提供的帮助。

    谢谢、此致、

    Vimal

    e2e.ti.com/.../8004.HL_5F00_sys_5F00_main.ce2e.ti.com/.../sys_5F00_link_5F00_cmd.txt

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

    我已经弄清楚导致问题的原因。

    1.  FEE Init()使能组7,并禁用其它闪存组。 一次只能启用一个组。

     调用 Flash_Write()后,闪存组7启用,组0禁用

    因此数据不会被写入 FEE。

    请在代码中添加以下声明以手动启用组7:

      flashWREG->FMAC = 0x7;

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

    您好、QJ Wang、

    感谢您帮助解决此问题。 将尝试相同的操作并使用结果进行恢复。 但这意味着、如果我们的代码对闪存和 FEE 进行交错写入、我们需要在每次对组7进行写入之前使用此语句。 这种理解是否准确?

    谢谢、此致、

    Vimal

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

    尊敬的 Vimal:

    没错。 一次只能启用一个组。

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

    您好、QJ Wang、

    我们使用了以下语句,而不是在 TI_FEE WriteSync()调用之前提到的语句(flashWREG->FMAC = 0x7) ,代码按预期工作:

    (空) Fapi_setActiveFlashBank (Fapi_FlashBank7);

    请确认这是可以的。 感谢您为解决此问题提供的所有帮助。

    谢谢、此致、

    Vimal

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

    尊敬的  Vimal:

    没关系。