在 S32K3 芯片中,当 Boot 和 App 都调用 Mcu_GetResetReason 导致复位原因被清除时,可以通过以下步骤解决:
问题分析
- 根本原因:
Mcu_GetResetReason 在首次调用时会清除复位原因寄存器,导致 App 无法获取有效值。
- 关键点:需要将 Boot 获取的复位原因传递给 App,且避免寄存器被清除。
解决方案
1. 保存复位原因到保留的 RAM 区域
步骤:
定义保留内存区域:在链接脚本中分配一段 非初始化(NoInit)的 RAM 区域,确保在复位时数据保留(适用于热复位场景)。
/* Boot 和 App 的链接脚本 */
MEMORY {
RAM_NOINIT (rwx) : ORIGIN = 0x2000F000, LENGTH = 0x4 /* 4字节存储复位原因 */
}
SECTIONS {
.boot_reset_reason (NOLOAD) : {
KEEP(*(.boot_reset_reason))
} > RAM_NOINIT
}
Boot 保存复位原因:在 Boot 中调用 Mcu_GetResetReason 后,将结果写入保留区域。
// Boot 代码
__attribute__((section(".boot_reset_reason"))) volatile uint32_t resetReason;
void BootMain() {
resetReason = Mcu_GetResetReason(); // 保存复位原因
// 跳转到 App...
}
App 读取保留值:App 直接从保留区域获取复位原因,不调用 Mcu_GetResetReason。
// App 代码
extern volatile uint32_t resetReason;
void AppMain() {
uint32_t reason = resetReason; // 直接读取保留值
// 处理复位原因...
}
2. 修改 Boot 逻辑避免清除寄存器
- 步骤:
- 仅 Boot 或 App 调用一次:如果 Boot 不需要复位原因,则移除其调用,让 App 首次调用以获取值。
- 手动清除寄存器:若硬件允许,Boot 读取后手动清除复位原因(需查阅寄存器文档)。
3. 配置复位保留 RAM
- 关键点:确保保留的 RAM 区域在热复位(如看门狗复位)时不被初始化。
验证与注意事项
- 测试场景:测试冷启动、看门狗复位、软件复位等场景,确保保留值正确。
- 复位类型影响:冷启动时 RAM 内容会丢失,需结合 Flash 存储或其他方案(如仅热复位时使用保留值)。
- 寄存器文档:查阅 S32K3 参考手册,确认复位原因寄存器的行为(是否支持多次读取或需手动清除)。
通过上述方法,可在 Boot 和 App 之间可靠传递复位原因,避免寄存器被意外清除。
在 S32K3 芯片中,当 Boot 和 App 都调用 Mcu_GetResetReason 导致复位原因被清除时,可以通过以下步骤解决:
问题分析
- 根本原因:
Mcu_GetResetReason 在首次调用时会清除复位原因寄存器,导致 App 无法获取有效值。
- 关键点:需要将 Boot 获取的复位原因传递给 App,且避免寄存器被清除。
解决方案
1. 保存复位原因到保留的 RAM 区域
步骤:
定义保留内存区域:在链接脚本中分配一段 非初始化(NoInit)的 RAM 区域,确保在复位时数据保留(适用于热复位场景)。
/* Boot 和 App 的链接脚本 */
MEMORY {
RAM_NOINIT (rwx) : ORIGIN = 0x2000F000, LENGTH = 0x4 /* 4字节存储复位原因 */
}
SECTIONS {
.boot_reset_reason (NOLOAD) : {
KEEP(*(.boot_reset_reason))
} > RAM_NOINIT
}
Boot 保存复位原因:在 Boot 中调用 Mcu_GetResetReason 后,将结果写入保留区域。
// Boot 代码
__attribute__((section(".boot_reset_reason"))) volatile uint32_t resetReason;
void BootMain() {
resetReason = Mcu_GetResetReason(); // 保存复位原因
// 跳转到 App...
}
App 读取保留值:App 直接从保留区域获取复位原因,不调用 Mcu_GetResetReason。
// App 代码
extern volatile uint32_t resetReason;
void AppMain() {
uint32_t reason = resetReason; // 直接读取保留值
// 处理复位原因...
}
2. 修改 Boot 逻辑避免清除寄存器
- 步骤:
- 仅 Boot 或 App 调用一次:如果 Boot 不需要复位原因,则移除其调用,让 App 首次调用以获取值。
- 手动清除寄存器:若硬件允许,Boot 读取后手动清除复位原因(需查阅寄存器文档)。
3. 配置复位保留 RAM
- 关键点:确保保留的 RAM 区域在热复位(如看门狗复位)时不被初始化。
验证与注意事项
- 测试场景:测试冷启动、看门狗复位、软件复位等场景,确保保留值正确。
- 复位类型影响:冷启动时 RAM 内容会丢失,需结合 Flash 存储或其他方案(如仅热复位时使用保留值)。
- 寄存器文档:查阅 S32K3 参考手册,确认复位原因寄存器的行为(是否支持多次读取或需手动清除)。
通过上述方法,可在 Boot 和 App 之间可靠传递复位原因,避免寄存器被意外清除。
举报