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.

[参考译文] RM48L952:哪个闪存控制器寄存器允许 FAPI 访问组0和组1

Guru**** 2482105 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/703546/rm48l952-which-flash-controller-register-allows-fapi-access-to-banks-0-and-1

器件型号:RM48L952
主题中讨论的其他器件:HALCOGEN

您好!

 我们使用 Hercules 板 rm48l952zwt 和 halcogen 4.03.00来构建驱动程序和应用程序代码、并在组0扇区0上使用 TI 引导加载程序进行引导、然后跳转到基于 halcogen 的驱动程序/应用程序代码。 我们发现 TI 引导加载程序存在一个问题、即如果引导加载程序发生电源欠压、则会损坏闪存的内容。 如果我们仅使用基于 halcogen 构建的驱动程序的纯调试版本、则这不是问题、它会锁定组0和组1的访问、并且只允许通过 EEPROM/FLASH 仿真 API 访问组7。 但是、我们需要引导加载程序、因为我们当然希望允许在现场动态升级我们的应用程序。 在另一个线程中、TI 工程师表示 TI 将使用更新版本的引导加载程序、因为适用于我们平台的引导加载程序已使用了大约6年。  由于我们必须为客户解决这个问题、与此同时、我们从 HalCoGen 生成的代码中创建了一个引导加载程序、这个代码没有欠压问题、这是因为在 HalCoGen 生成的代码中、缺省情况下会阻止对闪存进行擦除/写入的访问。 现在、我们只希望在升级的情况下允许使用 TI 引导加载程序允许的 FAPI 库进行擦除/写入访问(从而将掉电的风险限制为仅在升级期间)、我们使用闪存控制器中的哪些寄存器来实现这一点 (例如、BROT、FBSE 等)并且可以在扇区级别控制擦除/写入访问(并且可以通过不启用写入/擦除访问来保护组的其余部分不受欠压影响)、还是仅在整个组级别阻止擦除/写入访问或允许访问?  谢谢你。

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

    您使用哪种引导加载程序、CAN、UART 或以太网?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

     它是 TI 引导加载程序的5.2.12版本、您的一位同事 Jean Marc 帮助引导加载程序使用 FAPI 驱动程序通过 SDCard 通过 SPI 加载新的应用程序映像(我们不使用 CAN、以太网接口的 UART)。

    因此、对于 Jean Marc、旧的5.2.12 TI 引导加载程序会检查闪存中应用程序将设置或清除的位、具体取决于是否升级到新软件。 如果标志被清零、它将在 HalCoGen 驱动程序上构建的应用程序开始时跳转到闪存扇区。 如果您还记得、问题是我们的一些客户在引导加载程序运行时遇到了 TI 平台欠压、这会损坏闪存、但如果欠压发生在进入基于 HalCoGen 的应用程序时、则不会出现问题。 当我们等待 TI 的正式新版本时、我们从我们正在使用的 HalCoGen 创建了一个引导加载程序、当然、由于闪存被锁定为擦除/写入、我们不会遇到欠压问题。 但是、现在、当我们需要引导加载程序来替换闪存其他扇区中的应用时、我们需要能够通过寄存器解锁闪存、以使用升级来替换应用。 这至少将风险限制为仅在每年进行几次升级时。 所有其它引导将是缺省值、就像 HalCoGen 那样、它锁定闪存、这样一个欠压将不会损坏闪存。  如果您希望我上传引导加载程序、请告诉我。 所以我们只是想知道我们需要使用哪些寄存器来允许擦除/写入、就像在5.2.12版本中一样、我们可以在运行时更改以允许升级的产生。  谢谢你。

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

    您好 QJ、

     请参阅随附的。 第一个 zip 文件是基于 TI 引导加载程序的引导加载程序项目、在引导加载程序运行时、闪存的欠压损坏问题、但我们可以访问闪存进行升级、 和基于 halcogen 的第二个引导加载程序(我同时包含了 HalCoGen 4.3.00和4.7.00供您查看、只需排除您不关心的 halcogen 驱动程序目录)、现在它受到保护、不会被欠压、但我们不再有权访问闪存进行升级。  谢谢你。 塔米

    e2e.ti.com/.../2818.OriginalTIBootloaderBased.zip

    e2e.ti.com/.../4578.HalcoGenBootloaderBased.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    闪存组保护寄存器和扇区使能寄存器可用于保护闪存不被写入/擦除。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 QJ、

    非常感谢。 我使用的是2013年8月版本的 RM48参考手册。 所以

    FFF8 7030h FBPROT 闪存组保护寄存器
    位字段值描述
    31-1保留0读取返回0。 写入无效。
    0 PROTL1DIS PROTL1DIS:禁用1级保护
    1级保护禁用位。 将该位置位会禁止对的写操作
    OTPPROTDIS 位以及所有组的扇区使能寄存器 FBSE。 清除此项
    位启用保护并禁用对 OTPPROTDIS 寄存器位的写入访问、以及
    FBSE 寄存器。
    0级1保护被禁用。
    启用1级1保护。

    那么、我必须设置 FBPROT 位0 = 0?

    和 FFF8 7034h FBSE 闪存组扇区使能寄存器
    位字段值描述
    31-16保留0读取返回0。 写入无效。
    15-0 BSE 组扇区启用
    每个位对应于 FMAC 寄存器指定的组中的一个闪存扇区。 位0
    对应于扇区0、位1对应于扇区1等 这些位只能在时置位
    PROTL1DIS = 1且处于特权模式。
    0相应的编号扇区被禁用以进行编程或擦除访问。
    1相应的编号扇区被启用以进行编程或擦除访问。


    对于针对组0/1中相应扇区的 FBPROT、必须将这些位设置为1?

    我还需要执行_coreddisableFlashEcc_()吗? 再次感谢您、Tammy

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

    您好 QJ、

    因此、如果技术手册的版本正确、我们必须在下面进行操作、但 PROTL1DIS 在哪里将其设置为1等? 该手册指出、要修改 FBSE、我们必须将 FMAC 设置为我们要擦除/编程的组、并且"...只有当 PROTL1DIS = 1且处于特权模式时才能设置这些位...":

    (笑声)
    _coreDisableFlashEcc_();
    flashWREG->FBPROT = 0;//0 1级保护被禁用。
    ?? //这些位只能在 PROTL1DIS = 1且处于特权模式时置位。
    flashWREG->FMAC = 0;//由 FMAC 寄存器组0指定的组
    flashWREG->FBSE = 0x7FF0;//组0,不包括带有引导加载程序的前四个扇区
    flashWREG->FMAC = 0;//由 FMAC 寄存器组1指定的组
    flashWREG->FBSE = 0x7FFF;//组1

    //擦除应用程序闪存区
    FapiStatus = bootloader_FlashEraseApplication();

    此外、当我们设置成对 FMAC、然后设置 FBSE 时、我们可以先执行两个组、还是必须集成到使用 FAPI 进行闪存擦除的位置、以便针对该组上的相对扇区从组进行闪存擦除? 基于 TI 的引导加载程序代码与我在 HalCoGen 中使用的代码相同、并且在输入闪存访问代码之前完成了所有操作、因此现在需要执行的操作似乎很奇怪。 谢谢你。

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

    F021闪存 API 中的两个函数可用于启用组和扇区:
    Fapi_setActiveFlashBank (...);
    Fapi_enableMainBankSectors (...)
    我认为您的闪存擦除/程序函数[bootloader_FlashEraseApplication()]使用这两个函数。 在调用函数之前、无需启用组/扇区。

    引导加载程序通常处于特权模式、应用程序处于用户模式(如果要切换到特权模式、用户需要调用 SVC 等)。 组和扇区在用户模式下受到保护。

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

    您好 QJ、

    感谢您的理解。 您是否看到我上传的 zip 文件(请参阅上面的几个注释)? Fapi 函数在 HalCoGen 4.3.00或4.7.00生成的引导加载程序上不起作用。 好消息是欠压问题消失了、但相同的 Fapi 函数无法再访问闪存。 再次感谢您、Tammy

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

    您好 QJ、

    如果上传未完成、我会再附加一次时间。 请参阅随附的。 第二个 zip 文件是基于 TI 引导加载程序的引导加载程序项目、其中包含引导加载程序运行时闪存欠压损坏问题、但我们可以访问闪存进行升级、第一个 zip 文件是基于 halcogen 的引导加载程序 (我同时包含 了 HalCoGen 4.3.00和4.7.00、让您看到基于 HalCoGen 的引导加载程序都设置了寄存器、因此 FAPI 函数不具有访问权限、现在它受到保护、不受欠压影响、但我们不再可以访问闪存进行升级。  

    sys_core.asm 寄存器中的一些差异、例如、在 HalCoGen 生成的 sys_core 中:

     ;切换到系统模式(共享用户模式寄存器)(M = 11111)
     CPS #31

    而另一个 TI 引导加载程序 sys_core.asm

    ;切换回 Supervisor 模式(M = 10011)
     CPS #19

    那么、我们需要将问题从系统模式切换到监控器模式、以便 FAPI 库能够访问吗?

    谢谢你。 塔米

    e2e.ti.com/.../1882.HalcoGenBootloaderBased.zip

    e2e.ti.com/.../8787.OriginalTIBootloaderBased.zip

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

    F021闪存 API 必须在特权模式(用户模式除外)下运行、才能访问 FMC 控制器寄存器。 系统模式是特权模式、可以运行 F021闪存 API。

    我使用 HAlCoGen 中的驱动程序创建了一个 UART 引导加载程序、它可以将应用程序代码编程到 bank1。 我在 TMS570LC43x MCU 上对其进行了测试。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    QJ、您好、我们在 RM48上。 当我单击链接时、我没有看到您所执行的引导加载程序。 您能否再次连接以便我能够在 HalCoGen 为 RM48生成的与 MS570之间进行比较? 您是否使用了比 TI 提供的 RM48版本更新版的 FAPI 库?  谢谢。 塔米

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    QJ、大家好、好消息是、我单步执行的过程更加深入。 当我在尝试执行 FAPI 函数之前按照上面的建议禁用 ECC 和清除 FBROT 时、它看起来工作正常、现在单步执行。

    _coreDisableFlashEcc_();
    flashWREG->FBPROT = 0;//0 1级保护被禁用。

    我现在将在没有调试器的情况下测试运行情况。 再次感谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tammy、

    1. HALCoGen 生成的硬件驱动程序和我在原始引导加载程序中使用的先前驱动程序的工作方式相同。

    我使用 HalCoGen 生成的硬件驱动程序生成了一个新的 UART 引导加载程序、运行正常。 这适用于 LS3137器件(我找不到 RM48 HDK)。 您可以为 RM48器件修改它(更改器件型号、选择小端字节序而不是 big32)、并在电路板上进行测试。  

    e2e.ti.com/.../2376.TMS570LS3137HDK_5F00_UART_5F00_Bootlader.7z

    BTW、您需要检查硬件设计以找出导致欠压的电源问题。 导致复位的压降超出器件规格。

     从 TI.com 下载的引导加载程序是一个示例、因此它不会经过全面审查、以便在安全系统中使用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您测试我今天给您的引导加载程序时、请在以下位置添加一个断点:

    大小= YMODE_Receive (UART、&TAB_1024[0]);

    在 BL_UART.c 中

    否则它不起作用。 我稍后将解决延迟问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 QJ、好的、现在就试一下。 谢谢你。