您好,NXP技术支持团队,
我有一个关于 S32K328 的 FIRC 时钟配置的问题。
在单核设置中,我将 STM2 模块的 FIRC 时钟源配置为 3MHz(16 格)。在单核配置中,我确认 FIRC 时钟源以 3MHz 的频率正确输出。
但是,一旦我启用多核,即使分频器仍设置为 16,FIRC 时钟源的输出频率也会从 3MHz 变为 48MHz。
在我目前的架构中,MCU 初始化和设置模式只能在 Core 0 上执行。我的问题是,MCU 时钟是否也可以从 Core 1 访问(或重新配置),以及这是否可能是问题的原因。
关于我的配置的补充信息:
工具环境:
我自身分析得出的结论:
在运行时读取 CONFIG_REG_GPR 寄存器中的 FIRC_DIV_SEL 字段时,其值为 3,根据驱动程序代码,这对应于 48MHz(分频器值映射:48MHz→3,24MHz→1,3MHz→2)。我还注意到时钟驱动程序中的分频器写入路径包括 APP_CORE_ACC 权限检查,以及等待安全 BAF (CORE2) 进入 WFI(通过轮询 PRTN0_CORE2_STAT)。我怀疑在多核配置中可能会跳过除法器写入操作。
请问您能否就以下问题提供建议:
感谢您的支持。期待您的回复。
你好,
我已经找到了 问题的 根本原因 。 请查看下面的相关驱动函数 (位于 \Mcu_TS_T40D34M30I0R0\src\Clock_Ip_IntOsc.c 中的 Clock_Ip_SetFircDivSelHSEb) 。
/* Application can write this divider */ if ( ((IP_CONFIGURATION_GPR->CONFIG_REG_GPR & CONFIGURATION_GPR_CONFIG_REG_GPR_APP_CORE_ACC_MASK) >> CONFIGURATION_GPR_CONFIG_REG_GPR_APP_CORE_ACC_SHIFT) == CLOCK_IP_APP_CAN_WRITE) { ... /* FIRC_DIV_SEL write happens here */ } else { /* HSE firmware doesn't allow to write FIRC post divider. */ Clock_Ip_ReportClockErrors(CLOCK_IP_REPORT_WRITE_PROTECTION_ERROR, Config->Name); }
问题在于,在我的多核配置中,代码在全速运行时永远不会进入 if (APP_CORE_ACC == CLOCK_IP_APP_CAN_WRITE) 代码块。我通过在该代码块内添加一个 while(1) 循环验证了这一点——它永远不会被执行。结果, FIRC_DIV_SEL 写入操作被跳过,寄存器保持在复位值 3 (48MHz),而不是配置的 2 (3MHz)。这导致我的 STM 时钟频率比预期快了 16 倍。
然而, 当我在调试模式下运行(单步执行/设置断点)时,同一个代码块执行正常 ,FIRC_DIV_SEL 也 被正确设置为 2(3MHz)。 这种 全速执行和调试执行 之间的差异 是 关键症状。
因此,在 全速多核启动期间, 当 Mcu_InitClock 读取 CONFIG_REG_GPR 中的 APP_CORE_ACC 位时,该位 并未设置为 CLOCK_IP_APP_CAN_WRITE ,但当 我 使用调试器减慢执行速度时,该位就变为可写。
关于我的配置,还有以下补充信息:
请问您能否帮我理解以下问题:
感谢您的支持。期待您的指导。
此致,
你好,
感谢您进行测试并提供详细答复。
关于您提出的关于我实现方式的问题:
1. 我如何配置 FIRC_DIV_SEL:
在我的 Clock_Ip_IrcoscConfigurations_0结构中,FIRC 时钟配置的 IRCOSC 范围设置为 CLOCK_IP_SUPPORTS_3MHZ_FREQUENCY 。因此,预期配置为 3MHz,与您的测试相同。
2. 如何初始化第二个核心/是否需要在另一个核心上调用时钟初始化:
Mcu_InitClock和 Mcu_SetMode都只在 Core 0 上调用。在Core 1 上,我没有调用任何与 MCU时钟相关的 API。
也就是说,我将 通过 进一步的调试来 再次检查这种行为 ,以确认 核心 1 上 没有意外地发生时钟重新配置 。
补充说明:
我也会按照您的建议,评估是否迁移到最新的RTD版本。
我会尽快将调试结果反馈给您 。同时,如果 您对 导致 FIRC_DIV_SEL 最终值为 3(48MHz) 的原因有任何建议(即使时钟 初始化仅在 Core 0 上以 3MHz 配置 执行 ),我 将不胜感激。
此致,
首先,您使用的软件版本比当前版本落后好几个版本,因此我建议您迁移到最新的软件版本。
关于 FIRC_DIV_SEL,我在 S32K3X8EVB-Q289 板上使用 S32K3 IPCF v4.3.0 中的 IPCF_Example_S32K358 进行了一个简单的测试。为了进行本次测试,我修改了 IRCOSC 配置结构(Clock_Ip_IrcoscConfigurations_0),将 IRCOSC 范围从 CLOCK_IP_SUPPORTS_48MHZ_FREQUENCY 更改为 CLOCK_IP_SUPPORTS_3MHZ_FREQUENCY。
运行应用程序并允许内核之间的乒乓通信完成后,我验证了 CONFIG_REG_GPR[FIRC_DIV_SEL] 已正确配置为预期值 (10b),如下图所示。
您能否提供更多关于您实施方案的细节?您是如何配置 FIRC_DIV_SEL 的?你是如何初始化第二个核心的?你是否也在另一个核心上调用了时钟初始化函数?
BR,VaneB