NXP MCU 技术论坛
直播中

好名字

11年用户 968经验值
擅长:可编程逻辑
私信 关注
[问答]

S32K3 Boot跳转到App时,App无法获取重置原因怎么解决?

我现在正在使用 S32K3 芯片,但我遇到了一个问题
Boot 和 App 都使用函数 Mcu_GetResetReason,但该函数会在第一次调用时清除 reset Reason。所以当 Boot 跳转到 App 时,App 无法获取重置原因。
你能告诉我怎么解决吗

回帖(1)

杨平

2025-3-27 18:17:17

在 S32K3 芯片中,当 Boot 和 App 都调用 Mcu_GetResetReason 导致复位原因被清除时,可以通过以下步骤解决:


问题分析



  • 根本原因Mcu_GetResetReason 在首次调用时会清除复位原因寄存器,导致 App 无法获取有效值。

  • 关键点:需要将 Boot 获取的复位原因传递给 App,且避免寄存器被清除。




解决方案


1. 保存复位原因到保留的 RAM 区域




  • 步骤




    1. 定义保留内存区域:在链接脚本中分配一段 非初始化(NoInit)的 RAM 区域,确保在复位时数据保留(适用于热复位场景)。


      /* Boot 和 App 的链接脚本 */
      MEMORY {
      RAM_NOINIT (rwx) : ORIGIN = 0x2000F000, LENGTH = 0x4  /* 4字节存储复位原因 */
      }

      SECTIONS {
      .boot_reset_reason (NOLOAD) : {
           KEEP(*(.boot_reset_reason))
      } > RAM_NOINIT
      }



    2. Boot 保存复位原因:在 Boot 中调用 Mcu_GetResetReason 后,将结果写入保留区域。


      // Boot 代码
      __attribute__((section(".boot_reset_reason"))) volatile uint32_t resetReason;

      void BootMain() {
      resetReason = Mcu_GetResetReason();  // 保存复位原因
      // 跳转到 App...
      }



    3. App 读取保留值:App 直接从保留区域获取复位原因,不调用 Mcu_GetResetReason


      // App 代码
      extern volatile uint32_t resetReason;

      void AppMain() {
      uint32_t reason = resetReason;  // 直接读取保留值
      // 处理复位原因...
      }





2. 修改 Boot 逻辑避免清除寄存器



  • 步骤

    1. 仅 Boot 或 App 调用一次:如果 Boot 不需要复位原因,则移除其调用,让 App 首次调用以获取值。

    2. 手动清除寄存器:若硬件允许,Boot 读取后手动清除复位原因(需查阅寄存器文档)。



3. 配置复位保留 RAM



  • 关键点:确保保留的 RAM 区域在热复位(如看门狗复位)时不被初始化。

    • 在 S32K3 中,通过 SMU(System Monitoring Unit)MPU(Memory Protection Unit) 配置 RAM 保留。

    • 示例代码(启动文件配置):
      // 在 startup 代码中跳过保留 RAM 的初始化
      void SystemInit() {
      // 默认初始化所有 RAM,但排除保留区域
      __HAL_SYSTEM_INIT_EXCLUDE_RAM(0x2000F000, 0x4);
      }





验证与注意事项



  • 测试场景:测试冷启动、看门狗复位、软件复位等场景,确保保留值正确。

  • 复位类型影响:冷启动时 RAM 内容会丢失,需结合 Flash 存储或其他方案(如仅热复位时使用保留值)。

  • 寄存器文档:查阅 S32K3 参考手册,确认复位原因寄存器的行为(是否支持多次读取或需手动清除)。




通过上述方法,可在 Boot 和 App 之间可靠传递复位原因,避免寄存器被意外清除。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分