你好,
我正在研究 FRDM-MCXA266 板上从深度掉电模式唤醒 WUU 的行为。
环境:
- MCU:MCXA266
- 电路板:FRDM-MCXA266
- SDK 示例项目:frdmmcxa266_power_mode_switch_ll_mcxa
- SDK 版本:26.6.000
- 开发环境:MCUXpressoIDE_25.6.136
我在 main() 函数的开头附近添加了以下代码,以便在调用 BOARD_InitHardware() 之前读取 RESET 和唤醒状态。
/*******************************************************************************
* Variables
******************************************************************************/
char *const g_modeNameArray[] = APP_POWER_MODE_NAME;
char *const g_modeDescArray[] = APP_POWER_MODE_DESC;
uint32_t resetCount;
uint32_t resetStatus;
uint32_t resetStickyStatus;
uint32_t wakeupResource;
uint32_t wuuWakeupPinsFlag;
/*******************************************************************************
* Code
******************************************************************************/
int main(void)
{
uint32_t freq;
app_power_mode_t targetPowerMode;
bool needSetWakeup = false;
// --- START ADDED CODE ---
resetStatus = CMC_GetSystemResetStatus(CMC);
resetStickyStatus = CMC_GetStickySystemResetStatus(CMC);
CMC_ClearStickySystemResetStatus(CMC, resetStickyStatus);
wakeupResource = CMC_GetWakeupSource(CMC);
wuuWakeupPinsFlag = WUU_GetExternalWakeUpPinsFlag(WUU0);
WUU_ClearExternalWakeUpPinsFlag(WUU0, wuuWakeupPinsFlag);
// --- END ADDED CODE ---
BOARD_InitHardware();
// --- START ADDED CODE ---
DbgConsole_Printf("CMC_GetSystemResetStatus(CMC) = 0x%x\r\n", resetStatus);
DbgConsole_Printf("CMC_GetStickySystemResetStatus(CMC) = 0x%x\r\n", resetStickyStatus);
DbgConsole_Printf("CMC_GetWakeupSource(CMC) = 0x%x\r\n", wakeupResource);
DbgConsole_Printf("WUU_GetExternalWakeUpPinsFlag(WUU0) = 0x%x\r\n", wuuWakeupPinsFlag);
// --- END ADDED CODE ---
APP_SetVBATConfiguration();
APP_SetSPCConfiguration();
APP_InitWaketimer();相关的完整输出结果如下:
```
正常启动。
######################### ## Power Mode Switch Demo ## #########################
核心时钟频率 = 240000000Hz
电源模式:激活
选择所需的操作
按 A 键进入:运行模式
按 B 键进入:睡眠模式
按 C 键进入:深度睡眠模式
按 D 键进入:关机模式
按 E 键进入:深度关机模式
等待电源模式选择……
Deep 掉电: The whole VDD_CORE voltage domain is 掉电.
请选择唤醒源:
按 A 选择定时器作为唤醒源;
按 B 选择唤醒按钮作为唤醒源;
等待唤醒源选择...
已选择唤醒按钮作为唤醒源。
请按SW2键唤醒。
隔离功率域:VDD_USB。
CMC_GetSystemResetStatus(CMC) = 0x4010
CMC_GetStickySystemResetStatus(CMC) = 0x4011
CMC_GetWakeupSource(CMC) = 0x0
WUU_GetExternalWakeUpPinsFlag(WUU0) = 0x0
正常启动。
```
首次启动时,打印了以下值:
CMC_GetSystemResetStatus(CMC) = 0x110
CMC_GetStickySystemResetStatus(CMC) = 0x110
CMC_GetWakeupSource(CMC) = 0x0
WUU_GetExternalWakeUpPinsFlag(WUU0) = 0x0
然后我选择了深度关机模式,选择了唤醒按钮作为唤醒源,并按下了 SW2。
MCU 已成功唤醒,应用程序也已重新启动,但打印出了以下值:
CMC_GetSystemResetStatus(CMC) = 0x4010
CMC_GetStickySystemResetStatus(CMC) = 0x4011
CMC_GetWakeupSource(CMC) = 0x0
WUU_GetExternalWakeUpPinsFlag(WUU0) = 0x0
我对 CMC RESET 状态的理解是:
- 0x00004010:软件 RESET + 热 RESET
- 0x00004011:软件 RESET + 热 RESET + 深度掉电唤醒 RESET
如果这种解释是正确的,则粘滞状态似乎表明首先发生了深度掉电唤醒重置,然后发生了软件热重置。
我检查了应用程序启动代码 system_MCXA266.c,以及示例源代码,但我找不到 NVIC_SystemReset()、SYSRESETREQ 或 SCB->AIRCR 写入。
我还使用保留的 NOLOAD 变量向 SystemInitHook() 添加了一个计数器。SystemInitHook() 在唤醒后只执行了一次,因此我找不到 SystemInit() 之后进行软件重置的证据。
我的问题是:
我目前对 CMC RESET 状态的理解如下,但如果我对位定义的理解有误,请指正:
英语不是我的母语,所以如果我的解释有任何不清楚的地方,请告诉我。
谢谢!
你好@ka-2020
谢谢你的提问。我将使用相同的设置在我的环境中重现该测试,并调查其行为。一旦我拿到结果,我会将我的发现和所有问题的答案告诉您。
感谢您的耐心和支持。
BR
爱丽丝
感谢您调查此事。
我使用另一个 WUU 外部唤醒引脚进行了额外的测试,并想与大家分享结果。
除了原有的唤醒按钮配置外,我还添加了以下配置:
WUU_SetExternalWakeUpPinsConfig(APP_WUU, 0, &wakeupButtonConfig);然后我使用分配给 WUU 引脚 0 的引脚将设备从深度掉电状态唤醒。设备成功唤醒,但我观察到了与之前相同的结果:
CMC_GetSystemResetStatus(CMC) = 0x4010
CMC_GetStickySystemResetStatus(CMC) = 0x4011
CMC_GetWakeupSource(CMC) = 0x0
WUU_GetExternalWakeUpPinsFlag(WUU0) = 0x0因此,这种行为似乎并非原始 SW2 WUU 引脚所特有的。
调查方面有任何最新进展吗?
如果您需要我提供任何其他日志、源代码、寄存器值或测试结果,请告诉我。
谢谢!
你好@ka-2020
感谢您的回复和耐心等待。
我已根据您的要求进行了测试,并与我们的内部团队进行了讨论。由于对 ROM 行为的澄清需要 ROM 团队的确认,因此需要一些额外的时间进行调查。对于回复延迟,我深表歉意,并感谢您的理解。
1. 从深度掉电状态唤醒后,SRS = 0x4010 和 SSRS = 0x4011 是否正常?
是的。
SSRS :存储自上次主冷RESET以来所有导致系统RESET的源,以及您尚未清除的源。SSRS 在核心软件 RESET 后不会更新。
SRS:每次主热RESET时更新,以指示最近一次RESET的类型/来源。
2. MCXA266 启动 ROM 或扩展引导加载程序在应用程序启动前是否发出软件热复位?->>否。
3. 确定导致深度掉电唤醒的 WUU 引脚的推荐方法是什么?——
对于识别唤醒源引脚, WUU_GetExternalWakeUpPinsFlag()适用于掉电模式,在该模式下 WUU 中断服务例程可以正常执行。但是,在深度 Power-Down 唤醒后无法使用此功能,因为设备会通过 RESET 序列重新启动,并且 WUU 标志已被清除。
顺便问一下,您只使用了一个唤醒引脚,还是启用了多个唤醒引脚?
谢谢!
BR
爱丽丝
你好@ka-2020
感谢您的回复。
我已经将此问题和您的需求高优先级地提交给了我们内部的软件工程团队。我们完全理解这项请求的重要性,并正在积极跟进。
请给我们一些时间进行进一步调查。我会随时向您汇报最新进展,并尽快回复您。
感谢您的耐心和理解。
BR
爱丽丝
你好@Alice_Yang ,
感谢您对此事的调查和澄清。
根据您的解释,WUU 标志似乎在应用程序启动之前,在深度掉电 RESET 序列期间被清除。
在我的测试中,启用了两个 WUU 外部唤醒引脚:原始的 SW2 唤醒引脚和 WUU 外部唤醒引脚 0。
请确认一下,这是否意味着没有软件方法可以识别深度掉电后是哪个 WUU 引脚导致了唤醒?
谢谢!
你好@ka-2020
感谢您的耐心等待。
根本原因已经确定,将在未来的样品芯片版本中实施修复。
由此造成的不便,我们深表歉意,并感谢您的理解。
谢谢!
BR
爱丽丝
你好@Alice_Yang ,
谢谢你的更新。
我了解到该修复方案计划在未来的芯片样品版本中推出。
感谢您的支持。