2389772_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2389772_zh-CN

2389772_zh-CN

S32K328 – 启用多核时,FIRC 时钟分频器 (DIV16) 不生效

您好,NXP技术支持团队,

我有一个关于 S32K328 的 FIRC 时钟配置的问题。

在单核设置中,我将 STM2 模块的 FIRC 时钟源配置为 3MHz(16 格)。在单核配置中,我确认 FIRC 时钟源以 3MHz 的频率正确输出。

但是,一旦我启用多核,即使分频器仍设置为 16,FIRC 时钟源的输出频率也会从 3MHz 变为 48MHz。

在我目前的架构中,MCU 初始化和设置模式只能在 Core 0 上执行。我的问题是,MCU 时钟是否也可以从 Core 1 访问(或重新配置),以及这是否可能是问题的原因。

关于我的配置的补充信息:

  • 我正在使用 AUTOSAR 环境,并添加了 RM(资源管理器)模块以实现多核支持。
  • Domain0 主服务器:核心 0,Domain1 主服务器:核心 1。已为每个功能域授予所有内存和外围设备访问权限。

工具环境:

  • MCAL RTD 3.0.0
  • EB Tresos 27.1.0

我自身分析得出的结论:
在运行时读取 CONFIG_REG_GPR 寄存器中的 FIRC_DIV_SEL 字段时,其值为 3,根据驱动程序代码,这对应于 48MHz(分频器值映射:48MHz→3,24MHz→1,3MHz→2)。我还注意到时钟驱动程序中的分频器写入路径包括 APP_CORE_ACC 权限检查,以及等待安全 BAF (CORE2) 进入 WFI(通过轮询 PRTN0_CORE2_STAT)。我怀疑在多核配置中可能会跳过除法器写入操作。

请问您能否就以下问题提供建议:

  1. 为什么启用多核时 FIRC 分频器设置(DIV 16)没有生效,导致输出频率为 48MHz 而不是 3MHz?
  2. 在这种情况下,是否支持或需要从 Core 1 访问或重新配置 MCU 时钟。
  3. 在多核配置中,是否由于 APP_CORE_ACC 权限检查或 Secure BAF WFI 超时而跳过分频器写入,以及如何确保正确应用分频器。

感谢您的支持。期待您的回复。

此致,

AWS-LIBRARIES-S32K3

Re: S32K328 – FIRC Clock Divider (DIV16) Not Applied When Multicore Is Enabled

你好,

我已经找到了 问题的 根本原因 请查看下面的相关驱动函数 (位于 \Mcu_TS_T40D34M30I0R0\src\Clock_Ip_IntOsc.c 中的 Clock_Ip_SetFircDivSelHSEb) 。

c
/* 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 ,但当 我 使用调试器减慢执行速度时,该位就变为可写。

关于我的配置,还有以下补充信息:

  • Mcu_InitClock和 Mcu_SetMode仅在 Core 0 上调用。Core 1 (CM7_1) 不调用任何 MCU时钟 API。
  • 核心 1通过 MC_ME (PRTN0_CORE1_*) 从核心 0 启动。
  • 我没有加载任何HSE 应用固件。
  • 同样的配置在单核处理器中也能正常工作(FIRC_DIV_SEL = 2 / 3MHz)。
  • 工具环境:MCAL RTD 3.0.0,EB Tresos 27.1.0。

请问您能否帮我理解以下问题:

  1. CONFIG_REG_GPR 中的 APP_CORE_ACC 位由什么控制 ? SBAF 在什么条件下 授予 应用程序核心对 FIRC_DIV_SEL 的写入权限
  2. 为什么 单核 模式下该 位会被正确设置, 而 在多核配置下(以全速运行时) 却不会被设置 ?启动 CM7_1 或添加多核启动 流程是否会改变 SBAF 授予此访问权限的时间和方式?
  3. 由于该代码块 在调试器下 执行 正确 ,但速度并非全速, 这强烈暗示 SBAF 授予写入权限与 Core 0 调用 MCU_InitClock 之间存在时序/顺序问题。如何 确保 Core 0 执行时钟 初始化 之前, SBAF 已授予 APP_CORE_ACC = APP_CAN_WRITE 权限 ?
  4. 在多核配置中,是否存在特定的启动配置(IVT、生命周期或SBAF相关设置)来决定是否授予应用程序核心此访问权限

感谢您的支持。期待您的指导。

此致

Re: S32K328 – FIRC Clock Divider (DIV16) Not Applied When Multicore Is Enabled

你好,

感谢您进行测试并提供详细答复。

关于您提出的关于我实现方式的问题:

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 上 没有意外地发生时钟重新配置 。

补充说明:

  • 单核模式下,FIRC_DIV_SEL 读取为 2 (3MHz),并且工作正常。
  • 多核处理器中,FIRC_DIV_SEL 读取为 3 (48MHz),导致 STM 时钟周期比预期快 16 倍。

也会按照您的建议,评估是否迁移到最新的RTD版本。

我会尽快将调试结果反馈给您 。同时,如果 您对 导致 FIRC_DIV_SEL 最终值为 3(48MHz) 的原因有任何建议(即使时钟 初始化仅在 Core 0 上以 3MHz 配置 执行 ),我 将不胜感激。

此致

Re: S32K328 – FIRC Clock Divider (DIV16) Not Applied When Multicore Is Enabled

@dpsdprtmvl

首先,您使用的软件版本比当前版本落后好几个版本,因此我建议您迁移到最新的软件版本。

关于 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),如下图所示。

VaneB_0-1783015826914.png

您能否提供更多关于您实施方案的细节?您是如何配置 FIRC_DIV_SEL 的?你是如何初始化第二个核心的?你是否也在另一个核心上调用了时钟初始化函数?


BR,VaneB

Tags (1)
No ratings
Version history
Last update:
2 weeks ago
Updated by: