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:TI 引导加载程序初始化期间的 RM48 AC (电源)欠压中断会破坏闪存、但不会破坏 HalCoGen 生成的电路板初始化

Guru**** 2473260 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/674324/rm48l952-rm48-ac-power-brownout-interrupts-during-ti-bootloader-init-corrupts-flash-but-not-with-halcogen-generated-init-of-board

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

你(们)好。 我们使用的是 Hercules RM48l952zwt。 对于用于 RM 48和4.3.00 HalCoGen 的5.2.12 TI 引导加载程序。当有一个 AC (电源)欠压时、一个使用 HalCoGen 生成的初始化代码引导的电路板是可以的。 但是、 我们随附了 TI 引导加载程序、然后加载 HalCogen 代码和我们的应用程序。Hercules 板上具有 TI 引导加载程序版本、该次要板会启动、然后加载 halcogen 软件的其余部分、如果 是交流、则会损坏组1、2和组7上的闪存 引导加载程序运行期间会产生波动(欠压)。  我们需要在 TI 引导加载程序中进行哪些更改来初始化电路板、使其与 halcogen 生成的初始化电路板的代码一样稳定、但这种情况不会发生?  谢谢你。

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

    当您指出引导加载程序包含 Halcogen 代码时、您能否描述它是如何加载的? 即、您的描述听起来好像引导加载程序在每次启动时都将代码编程到器件闪存中一样。 是这样吗?

    如果是这种情况、您需要确保在此期间电压保持稳定。 SW 无法知道电源是否有足够的容量对闪存进行编程、电压下降将导致无效编程位。 我知道解决此问题的唯一方法是包含一个电源保留和/或外部电压监控器。 备用电源可以是硬件中的超级电容器或电池电源、当电压降至器件最小值以下或接近器件最小值时、可以"接管"。 电压监控器可用于确定电源转换到保留区的阈值、也可用于指示电源突降时 MCU 上的拉复位。 如果拉取复位、也存在写入操作正在进行并可能损坏数据的风险、但如果第一个启动未正确完成、则下一次启动将允许重新编程。

    如果您尝试在 SW 中执行某项操作、则必须与使用 ADC 监控电源电压相关。 这里的挑战是、如果 ADC 的基准电压也受到影响、您可能会看到每个 ADC 计数的电压成比例变化、从而掩盖了该问题。 另一种方法是使用外部电压监控器在电源接近跳闸点时向 MCU 发出信号、使其完全处于工作电压限制范围内、以便 MCU 有时间正常关闭并保护闪存免受损坏。 这当然意味着电压转换必须受到足够的抑制、以便有时间进行检测、通知和反应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Chuck、

     感谢你能抽出时间。

    问题1. 当您指出引导加载程序包含 Halcogen 代码时、您能否描述它是如何加载的?

    闪存中没有基于 halcogen 的应用程序代码。 引导加载程序位于0x00000000、基于 halcogen 的代码位于闪存的不同部分。 是否希望我上传我们下载并正在使用的 TI 引导加载程序版本? 我们下载并使用的 TI 引导加载程序会启动基本电路板、然后跳转到闪存中的另一个位置、以使用我们在 Code Composer 中编译的应用程序加载霍尔根生成的代码、使其支持引导加载程序(引导加载程序项目在 Code Composer 中是单独的)。 如果有人在 unstabe ac 方面遇到问题、则会在引导加载程序运行时发生、即闪存损坏。 如果在引导加载程序加载了基于 halcogen 的应用程序后 AC 发生什么情况、则没有问题、也没有问题、我们在没有引导加载程序的板上运行基于 halcogen 的应用程序(Code Composer 上的调试版本)。 但是、如果是在引导加载程序运行期间、则 RM48闪存会损坏。 为什么我问在 TI 引导加载程序初始化代码中可以做些什么与 HalCoGen 生成的初始化代码相同、因此引导加载程序的行为与 halcogen 代码相同。

    问题2. 如果是这种情况、您需要确保在此期间电压保持稳定。

    我们无法控制客户现场的电源、旧建筑物和接线等问题、因为他们正在将 RM48板插入其中

    使用上面描述的选项、HalCoGen 代码是否正在执行这个操作、这就是为什么当 AC 不稳定时、这个代码没有问题? 我们能否在 TI 引导加载程序中进行这些更改、以便引导加载程序的行为方式相同? HalCoGen 设置了哪些寄存器来防止这种情况? 我可以上传 TI 引导加载程序和 TI halcogen 自动生成代码、以便您可以看到差异。  再次感谢你。

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

    MCU 在直流电上运行。 交流电必须经过某种逆变器/稳压器。 这是系统问题。 在系统设计过程中、应使用可过滤交流骤降的稳压器或添加某种电源保留来防止欠压、在这种情况下、我们将欠压定义为 MCU 电源电压超出指定电压的点 最小值和最大值。 当电源电压超出指定限值时、器件的运行是不确定的。 最有可能发生的情况是、当在引导加载程序运行期间发生掉电时、CPU 跳转到执行闪存写入的代码中的某个位置(即、闪存 API 中的某个位置)、这会导致闪存损坏。 假设您的应用程序/ Halcogen 生成的代码没有包含闪存 API 或者至少应用程序大小要大得多、那么代码跳转到访问闪存操作的部分代码的可能性就会降低。

    为了保护运行、唯一可能要做的其他事情是使用 MPU 或其他一些保护机制来防止没有权限的代码部分访问闪存 API 代码。 如果您使用的是 SafeRTOS、这可能具有一些功能。 这可能有帮助、也可能不有帮助。 产生不确定性的原因如上所述、当超出指定电压范围时、CPU 的运行是不确定的、因此我们无法真正保证 CPU 或 RTOS 将按预期运行。

    实际上、防止这些掉电的最佳方法是适应前面提到的硬件条件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好、Chuck、

     谢谢你。 工程团队希望我为您提供附件。 请参阅随附的上传内容、 当交流电不稳定时具有此问题的 TI 引导加载程序以及当交流电不稳定时、HalCoGen 代码正常。 这样、您就可以看到初始化代码在这两者之间有何不同。 我们通过引导加载程序代码进行了 grep 操作、但未看到它在写入闪存的位置。 当它为我们运行时、它只应跳转到闪存中应用代码所在的另一个位置、并将其加载到 RAM 中并执行。 如果 TI 引导加载程序中有正在写入闪存的代码、并且是此问题的根本原因、我们可以在哪里找到它、因为我们要删除 IF (但我找不到它)。 但您同时拥有 halcogen 生成的初始化代码和 TI 引导加载程序、因此您可以看到我的意思。 再次感谢你。

    e2e.ti.com/.../2553.HalCoGen-_2800_2_2900_.zip

    e2e.ti.com/.../6557.boot_5F00_sdcard.zip

    谢谢、

    塔米

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

    您好、Chuck、您好。您是否收到了我的回复以及我们正在使用的 TI 引导加载程序和 halcogen 软件包的上传内容? 或者、对于您来说、这仍然是假日周、下周我们应该听到吗?  谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Chuck、我们进行了逆向工程、并在 HalCoGen 初始化代码和引导加载程序初始化代码之间进行了比较。 其中一些差异包括:

    1.in 函数_c_int00:

    1.1 _coreInitRegisters_();#31未在 halcogen 版本中初始化、#19未在引导加载程序版本中初始化

    1.2_coreInitStackPointer_();**两个版本的#31和内存分配都不同

    1.3 _coreEnableEventBusExport_();引导加载程序版本中缺少

    1.4_coreEnableFlashEcc_();引导加载程序版本中缺失

    1.5 _errata_CORTEXR4_66_();在引导加载程序版本中缺失、但没有要复制的源代码、它位于哪个库中?

    1.6 _errata_CORTEXR4_57_();引导加载程序版本中缺少、但没有要复制的源代码、它位于哪个库中?

    1.7不在引导加载程序版本中。 if (esmREG->SR1[2])!= 0U){ for (;;){}//* Wait */

    在函数 systemInit 中、引导加载程序版本中缺少多路复用器

    3.在函数设置中:systemREG1->PLLCTL1设置为不同= 0x00000000U | 0x20000000U |(0x1F)<<24U | 0x00000000U |((6U - 1U)<<16U)|((120U - 1U)<<8U);//在 HalCoGen 版本中设置为150U

    4.在函数中,设置闪存:flashWREG->FBFALBACK 的设置不同。 在引导加载程序版本= 0x00000000 |(SYS_ACTIVE << 14U)|(SYS_SLEEP << 12U)|(SYS_SLEEP << 10U)|(SYS_SLEEP << 8U)

    |(SYS_SLEEP<< 6U)|(SYS_SLEEP << 4U)|(SYS_ACTIVLE<< 2U)| SYS_ACTIVE;

    在 HalCoGen 版本= 0x000000000000U |(UINT32)((UINT32) SYS_ACTIVE << 14U)/*组7 */|(UINT32)(((UINT32) SYS_ACTIVE << 2U)/*组1 */|(UINT32)(((UINT32) SYS_ACTIVE << 0U);//组0 *


    5.在函数 trimPLO 中:引导加载程序版本设置不同 systemREG1->LPOMONCTL =(1U << 24U)|(16U << 8U)| 8U;// halcogen 版本、设置为16U


    6.在函数映射中:

    6.1 systemREG1->CDDIS 在引导加载程序版本中设置不同=(false << 4)/* AVCLK 1 off */|(true << 5)/* AVCLK 2 off */|(false << 8)/* VCLK3 off */|(false << 10)/* AVCLK 3 off */ |(false << 11);// AVCLK 4 off */

    在 HalCoGen 版本=(UINT32)((UINT32) 0U <<4U)/* AVCLK 1 OFF */|(UINT32)((UINT32) 1U <<5U)/* AVCLK 2 OFF */|(UINT32)(UINT32) 0U <<8U)/* VCLK3(UINT3)/关闭(UINT32)
    |(uint32)((uint32) 0U << 10U)//* AVCLK 3 off */|(uint32)(((uint32) 0U << 11U);//* AVCLK 4 off */

    6.2引导加载程序代码中缺少 systemREG1->PLLCTL2和 systemREG1->CLKCNTL,但在 HalCoGen 代码中设置

    6.3 systemREG2->VCLKACON1设置不同。 在引导加载程序版本=(1U << 24)| 1 << 20U |(SYS_VCLK << 16)|(1U << 8)| 1 << 4U 中

    在 HalCoGen 版本=(uint32)((uint32)(1U - 1U)<< 24U)|(uint32)((uint32) 0U << 20U)|(uint32)(((uint32) SYS_VCLK << 16U)|(uint32)(uint32)(uint32)< uint32 (uint32)| uint32

    7.在引导加载程序版本中、F021 API 库的版本不同(2.1.00、Cortex R4BE 和 LE 库)、而 HalCoGen 集成版本不同(仅 Cortex R4 LE V3D16)

    我们能否安全地更改引导加载程序代码、使其与 HalCoGen 生成的代码相同? 对于我们没有的勘误代码、我们可以从哪里获得库? 我们能否安全地将 HalCoGen 版本的 F021库替换为引导加载程序版本? 再次感谢你。