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.

[参考译文] MSPM0G3518-Q1:访问出厂区域问题

Guru**** 2779905 points

Other Parts Discussed in Thread: MSPM0G3519

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1610368/mspm0g3518-q1-accessing-factory-region-issue

器件型号: MSPM0G3518-Q1
主题: MSPM0G3519 中讨论的其他器件

大家好、TI 支持团队

我目前正在实施 安全调试 MSPM0G3519 系列上的功能、利用提供的 SDK 示例和dl_flashctl驱动程序 NONMAIN 区域访问。

我遇到的一个关键问题是 工厂区域 (信息区域)在运行时无法访问。 初始刷新时和系统初始化之前、出厂区域存储器(从开始)0x41C40000包含正确的校准和配置数据。 但是、在执行MCU_Init () 例程之后、Factory Region memory 立即在调试器的内存视图中返回全零。

此外、软件访问该区域的任何尝试(例如,通过)DL_FactoryRegion_getNumBanks()都会导致系统进入Default_Handler。 这表明 A 总线故障 安全锁定、或由系统配置触发的硬件级安全锁定。

您能否澄清问题并提出解决方案?



谢谢、此致、






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

    在工厂区域参考期间、您使用什么时钟?  

    erratum FLASH_ERR_01 [Ref 勘误表 (SLAZ758D) 第 7 页]报告、如果等待状态=2、则对 Factory 区域的引用将遇到总线故障。 使用高速时钟时会(自动)此等待状态设置[Ref TRM (SLAU846C) 第 2.4.5 节]。

    如果要使用高速时钟、则应在切换时钟之前获取/缓存所需的任何工厂数据。

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

    是的、这实际上是问题所在。 我正在 使用高速时钟、当我 将时钟切换到低频时钟时、可以正常读取出厂数据。

    我知道解决方案是在将时钟切换到高速时钟之前读取这些数据、但如果我想在切换后读取这些数据、该怎么办? 是否有办法这样做? 因为我在初始化中切换时钟、并且我在使用 API “DL_FlashCTL_unprotectSector “ 并且该 API 需要读取出厂数据。  

    我考虑了两个解决方案:

    1. 将时钟切换到的器件 LFCLK 在调用此 API 之前和调用之后、我将时钟切换回 HSCLK。
    2. 硬件设计  ULP 时钟分频器到 UDIV_3 而不是 UDIV_2

    请告诉我两种解决方案中的一种是否有效、或者建议另一种解决方案来解决此问题。

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

    这与数据在运行时更改的情况不同。 缓存它,假设你不会受到 RAM 的严重阻碍将是走的方式。 另一种方法是预留持久存储区域、并使用校验和将其缓存到闪存中。 启动程序时、请检查此区域。 如果校验和正常、则继续、否则将值与校验和一起复制到闪存中。

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

    它的工作方式是 driverlib 通过调用 DL_FactoryRegion_initTrimTable () 缓存 SRAM 中的 Factory 区域 (DL_FACTORYREGION_TrimTable ),如(例如)DL_SYSCTL_configSYSPLL () 所示 。 DL_FACTORY_xxx 函数会检查是否已完成此操作、如果已完成、请参考 RAM 副本。

    但我没有看到此初始化在任何 FlashCtl 函数中完成。 我想如果您使用 SYSPLL、应该 (“偶然“)完成、但这在 driverlib 中似乎有点空白。

    您可以尝试在 configSYSPLL 中复制(在代码中)序列、具体来说:

        if (!DL_FactoryRegion_isTrimTableInSram()) {
            DL_FactoryRegion_initTrimTable();
        }

    在切换时钟之前、您需要尽早这样做。 但这可能比更改每次闪存操作的时钟更容易。

    【编辑:轻微澄清】