RA8M1中断唤醒机制详解:WUPEN寄存器配置与低功耗设计实践
1. 项目概述从低功耗睡眠中“叫醒”MCU的艺术在嵌入式开发尤其是电池供电的物联网设备、便携式医疗仪器或智能传感器中我们总在功耗和性能之间走钢丝。设备大部分时间都在“打盹”Deep Sleep或Software Standby模式以微安级的电流维持生命体征。但一旦有任务需要处理——比如定时采集数据、收到一个外部按键信号或者I2C总线上传来主设备的命令——它必须能立刻“醒来”精神抖擞地投入工作。这个“叫醒服务”的核心机制就是中断唤醒。RA8M1作为一款高性能的Arm Cortex-M微控制器其丰富的外设和灵活的低功耗模式是它的亮点。但很多开发者初次接触时往往只关注如何配置外设产生中断却忽略了最关键的一环如何配置中断控制器ICU让特定的中断事件具备将CPU从深度睡眠中“拉回来”的能力。你可能会遇到这样的情况代码里中断服务函数写得好好的在正常运行模式下一切正常可一旦让MCU进入Deep Sleep该来的中断事件发生了MCU却“睡死”过去毫无反应。问题根源十有八九出在ICU的WUPENWake Up Interrupt Enable寄存器配置上。这份手册片段正是解开这个谜题的关键。它详细描述了RA8M1 ICU中用于控制深度睡眠/软件待机模式返回的使能寄存器。简单来说WUPEN寄存器是一个“唤醒源白名单”。不是所有能产生中断的事件都有资格唤醒深度睡眠中的CPU。你必须在这个寄存器里为你期望的唤醒事件比如ULPT定时器下溢、高速比较器输出、I3C总线活动等打上“允许唤醒”的勾它才能真正扮演闹钟的角色。理解并正确配置WUPEN是构建可靠低功耗应用的基石。无论你是正在设计一个靠电池续航数年的传感器节点还是优化一个需要快速响应外部事件的工控设备掌握这套机制都至关重要。2. 核心机制解析中断、睡眠与唤醒的三角关系要理解WUPEN寄存器的作用我们必须先厘清RA8M1中中断处理、低功耗模式与唤醒机制三者是如何协同工作的。这绝非简单的“中断来了就干活”而是一套精密的、有条件的触发链条。2.1 中断处理的标准化流程从外设到CPU在RA8M1中一个中断从产生到被CPU响应遵循Arm Cortex-M架构的标准路径并加入了瑞萨特有的ICU进行路由管理。其核心参与者包括中断源Event Source 即具体的外设模块如通用定时器GPT的匹配比较事件、串行通信接口SCI的接收完成事件、外部引脚IRQ的电平/边沿变化等。每个中断源在ICU中都被分配了一个唯一的事件编号Event Number如表13.4所示。例如ULPT0定时器的下溢中断事件编号是0x040。中断控制器单元ICU 这是RA8M1的中枢神经。它不产生中断而是负责管理和路由。ICU内部有两组关键寄存器IELSRnInterrupt Event Link Setting Register 这是“中断事件链接设置寄存器”。你需要在这里将某个ICU通道n从0到95与一个具体的事件编号Event Number绑定起来。可以把它想象成电话总机的“分机号绑定”操作把分机号101ICU通道绑定到销售部电话事件编号0x040。同时IELSRn中的IR位是中断请求标志当中断事件发生时此位由硬件置1。NVICNested Vectored Interrupt Controller 这是Arm Cortex-M内核自带的中断控制器集成在CPU内部。它负责最终的中断优先级仲裁、抢占和尾链等高级功能。ICU会将绑定好的中断请求提交给NVIC。CPU 最终执行中断服务程序ISR的单元。标准的中断使能流程是配置外设使其能产生中断 - 在ICU的某个IELSRn中设置对应的事件编号 - 在NVIC中使能对应的中断号IRQ number。此时当事件发生CPU在运行模式下就能跳转到ISR执行。2.2 低功耗模式下的“特权”中断WUPEN的作用然而当CPU进入Deep Sleep或Software Standby这类深度低功耗模式时情况发生了根本变化。在这些模式下CPU时钟可能停止大部分高速时钟域关闭系统功耗降至极低。此时并非所有中断都有能力“重启”整个系统。这就是WUPEN寄存器登场的时刻。你可以把它理解为进入深度睡眠模式前需要向ICU保安处提交的一份“紧急联系人名单”。这份名单上的人中断事件才被授权在系统沉睡时用力拍门产生有效唤醒信号。名单之外的中断事件即使发生了ICU也会将其视为“普通访客”由于系统处于深度睡眠保安ICU不会也无法去叫醒沉睡的CPU。WUPEN寄存器的工作原理位使能 WUPEN寄存器中的每一个位对应一个或一组特定的、具备唤醒潜力的中断源。例如ULP0UWUPEN位控制ULPT0定时器下溢中断是否能唤醒系统COMPHS0WUPEN位控制高速比较器0的输出中断是否能唤醒系统。安全属性匹配 手册中特别强调的“Note: The security attribution of this register is set for each wakeup event.” 这一点在涉及TrustZone安全扩展的应用中至关重要。它意味着每个唤醒事件都有其安全属性安全世界或非安全世界而你对该WUPEN位的操作写入必须与事件的安全属性匹配否则操作会被忽略或产生错误这是防止安全漏洞的重要机制。条件触发 仅当同时满足以下三个条件时一个中断事件才能将系统从Deep Sleep/Software Standby模式中唤醒条件A 该中断源在其外设模块中被正确配置并产生中断请求。条件B 该中断事件在ICU的某个IELSRn中进行了正确的绑定和设置。条件C 该中断事件在WUPEN寄存器中对应的使能位被置为1。缺少其中任何一个条件唤醒都不会发生。许多唤醒失败的调试案例问题都出在忽略了条件C没有在WUPEN中显式使能。2.3 中断事件表的深度解读谁有“唤醒资格”手册中的表13.4事件表是我们进行唤醒源选型的“资格名录”。其中有三列直接关系到唤醒能力Canceling CPU Deep Sleep 标记为✓的事件有能力作为从CPU Deep Sleep模式返回的因子。Canceling Software Standby 标记为✓的事件有能力作为从Software Standby模式返回的因子。Canceling Deep Software Standby 标记为✓的事件有能力作为从Deep Software Standby模式返回的因子。这里有一个极其关键的认知点表13.4中的✓仅表示该硬件事件“具备唤醒的物理能力”。这好比一个人有大声喊叫的生理能力。但是他能不能在深夜把你叫醒还取决于你是否允许他在你的卧室门口喊WUPEN寄存器配置以及他是否真的喊了事件发生。例如查看表13.4ULPT0_ULPTI(事件号0x040): 在“Canceling Software Standby”和“Canceling Deep Software Standby”两列都有✓说明它硬件上支持唤醒这两种深度睡眠模式。AGT0_AGTI(事件号0x046): 仅在“Canceling CPU Deep Sleep”有✓说明它只能用于唤醒相对较浅的CPU Deep Sleep模式无法唤醒更深的Software Standby模式。许多通信接口的收发中断如SCI0_RXI 在这些唤醒列中通常是“—”意味着它们根本不能用于从这些深度睡眠模式中唤醒CPU。如果想让设备从深度睡眠中被串口数据唤醒你需要借助其他有唤醒能力的外设如特定的唤醒引脚或低功耗定时器来间接实现。因此设计低功耗唤醒方案的第一步必须是查阅此表确认你计划使用的信号源在硬件层面是否支持目标低功耗模式的唤醒。3. WUPEN寄存器详解与配置实战现在我们聚焦到手册片段的核心——WUPEN1寄存器。理解它的每一位是进行正确配置的前提。3.1 寄存器位域全景分析手册提供了WUPEN1寄存器的完整位域定义。其基地址根据安全世界ICU或非安全世界ICU_NS而不同偏移地址为0x1A4。它是一个32位寄存器但并非所有位都可用。关键使能位解析Bit 3 至 Bit 14 这些是实际可用的唤醒使能位每个位控制一个特定的中断源是否可以作为Deep Sleep/Software Standby的返回因子。位号符号功能描述对应中断源唤醒能力3COMPHS0WUPEN高速比较器0中断唤醒使能比较器-HS0输出变化Deep Sleep / Software Standby8ULP0UWUPENULPT0下溢中断唤醒使能ULPT0定时器计数下溢Deep Sleep / Software Standby9ULP0AWUPENULPT0比较匹配A中断唤醒使能ULPT0与比较寄存器A匹配Deep Sleep / Software Standby10ULP0BWUPENULPT0比较匹配B中断唤醒使能ULPT0与比较寄存器B匹配Deep Sleep / Software Standby11I3CWUPENI3C唤醒条件检测中断唤醒使能I3C总线检测到唤醒条件Deep Sleep / Software Standby12ULP1UWUPENULPT1下溢中断唤醒使能ULPT1定时器计数下溢Deep Sleep / Software Standby13ULP1AWUPENULPT1比较匹配A中断唤醒使能ULPT1与比较寄存器A匹配Deep Sleep / Software Standby14ULP1BWUPENULPT1比较匹配B中断唤醒使能ULPT1与比较寄存器B匹配Deep Sleep / Software Standby保留位与写值要求Bit [2:0], [7:4], [31:15] 这些区域被标记为“—”手册明确说明“These bits are read as 0. The write value should be 0.” 这意味着当你写这个寄存器时必须确保这些保留位写入0。在编程时最安全的做法是使用“读-修改-写”操作或者使用位操作如|只修改目标位避免意外写入保留位。3.2 配置流程与代码示例配置一个中断源用于唤醒需要一套组合拳。下面以使用ULPT0定时器下溢中断将系统从Software Standby模式中定时唤醒为例展示完整的配置流程和代码。步骤1外设模块初始化首先你需要配置ULPT0定时器本身使其能产生下溢中断。/* 假设使用HAL库或类似底层驱动 */ void ULPT0_InitForWakeup(void) { /* 1. 使能ULPT0模块的时钟如果模块需要单独使能 */ R_ULPT0_ClockEnable(); /* 2. 配置ULPT0工作模式选择时钟源通常为低速内部振荡器LOCO或副系统时钟SOSC以在低功耗下运行 */ ULPT0.TCR.BYTE 0x00; // 先停止计数器 ULPT0.TCR.BIT.CKS 2; // 例如选择SOSC (32.768 kHz)作为计数源 ULPT0.TCR.BIT.MODE 0; // 设置为间隔定时器模式 /* 3. 设置定时周期。例如设置从0xFFFF向下计数到0x0000产生下溢。 假设SOSC32768Hz则下溢周期 (预分频) * (计数初值1) / Fclk。 若需1秒唤醒一次且无预分频计数初值 32768 - 1 0x7FFF */ ULPT0.TCNT 0x7FFF; // 设置计数初始值 /* 4. 使能ULPT0的下溢中断在外设级使能 */ ULPT0.TCR.BIT.UIE 1; // 下溢中断使能 /* 5. 启动ULPT0定时器 */ ULPT0.TCR.BIT.CST 1; }步骤2ICU中断事件绑定接下来在ICU中将一个可用的IELSRn通道与ULPT0下溢事件事件号0x040绑定。void ICU_ULPT0_Interrupt_Setup(void) { /* 假设我们使用 IELSR10 (对应IRQ10) 来服务ULPT0下溢中断。 需要查阅向量表表13.3确认IRQ号与IELSRn的对应关系。这里IRQ10对应IELSR10。 */ /* 禁用全局中断防止配置过程中被意外打断 */ __disable_irq(); /* 1. 清除该通道可能已有的旧设置和挂起标志 */ ICU.IELSR10.WORD 0x0000; // 清空整个寄存器包括IR标志和IELS设置 NVIC_ClearPendingIRQ(10); // 清除NVIC中IRQ10的挂起状态 /* 2. 将事件号 0x040 写入 IELSR10.IELS 字段。 IELSRn寄存器中IELS[8:0]位于bit[8:0]。 */ ICU.IELSR10.BIT.IELS 0x040; /* 3. 确保DTCE位为0表示此中断请求发送给CPUNVIC而非DTC */ ICU.IELSR10.BIT.DTCE 0; /* 4. 可选但推荐设置中断优先级。通过NVIC设置 */ NVIC_SetPriority(10, 5); // 设置IRQ10的优先级为5数值越小优先级越高 /* 5. 在NVIC中使能该中断 */ NVIC_EnableIRQ(10); /* 恢复全局中断 */ __enable_irq(); }步骤3WUPEN寄存器使能唤醒功能这是唤醒配置的灵魂一步。在进入低功耗模式前必须设置WUPEN1寄存器中对应的位。void Enable_ULPT0_Wakeup(void) { /* 操作WUPEN1寄存器使能ULPT0下溢中断的唤醒能力。 使用“读-修改-写”或位操作确保不影响其他位。 */ /* 方法一位操作更清晰*/ ICU.WUPEN1.BIT.ULP0UWUPEN 1; // 置1使能ULPT0下溢中断唤醒 /* 方法二读-修改-写 */ // uint32_t temp ICU.WUPEN1.WORD; // temp | (1UL 8); // 将第8位ULP0UWUPEN置1 // ICU.WUPEN1.WORD temp; /* 重要根据你的应用场景可能还需要使能其他唤醒源如按键对应的外部中断。 例如如果IRQ0引脚事件号0x001也用于唤醒则需要配置对应的WUPEN寄存器位。 但注意PORT IRQ事件0x001-0x010的唤醒使能位可能在其他WUPEN寄存器如WUPEN0中 需要查阅完整的手册确定。 */ }步骤4编写中断服务程序ISR中断服务程序中除了处理业务逻辑必须清除中断标志包括外设级和ICU级的标志。/* IRQ10的中断服务函数 */ void IELSR10_IRQHandler(void) { /* 1. 判断并清除外设中断标志对于ULPT0是下溢中断标志 */ if (ULPT0.TSR.BIT.UF) { // 检查下溢标志 ULPT0.TSR.BIT.UF 0; // 写0清除ULPT0下溢标志 } /* 2. 清除ICU中的中断请求IR标志。这是手册13.5.1节强调的关键 必须在退出中断处理程序前读取并确认IR位已清除。 */ if (ICU.IELSR10.BIT.IR) { ICU.IELSR10.BIT.IR 0; // 写0清除IR标志 } /* 3. 你的应用处理逻辑例如设置一个唤醒标志、采集数据等 */ g_wakeup_flag 1; /* 注意NVIC的挂起位会在中断响应时自动清除无需软件操作。 */ }步骤5进入低功耗模式在主循环或特定函数中当条件满足时调用进入低功耗模式的函数。void Enter_Software_Standby(void) { /* 1. 确保所有唤醒源已正确配置已完成步骤1-3 */ /* 2. 确保没有其他未处理的中断挂起 */ /* 3. 配置IO口状态将未使用的引脚设为模拟输入或输出固定电平以减少功耗 */ /* 4. 设置系统进入Software Standby模式所需的寄存器如设置STBYCR寄存器 */ // ... (具体寄存器操作参考电源控制章节) /* 5. 执行WFIWait For Interrupt或WFEWait For Event指令 */ __WFI(); // 执行此指令后CPU进入低功耗模式直到被使能的中断唤醒 } void main(void) { // 系统初始化... ULPT0_InitForWakeup(); ICU_ULPT0_Interrupt_Setup(); Enable_ULPT0_Wakeup(); while(1) { // 执行主要任务... if (need_to_sleep) { g_wakeup_flag 0; Enter_Software_Standby(); // 当被ULPT0中断唤醒后程序会从__WFI()之后继续执行 if (g_wakeup_flag) { // 处理唤醒后的任务 } } } }关键经验在进入低功耗模式前务必进行一次“垃圾”中断标志清除操作。因为某些外设在初始化或模式切换过程中可能会产生毛刺或意外置位中断标志。一个稳健的做法是在使能唤醒和进入睡眠之间读取并清除相关外设和ICU的中断状态寄存器。这可以避免一进入睡眠就立即被一个“陈旧”的中断标志唤醒。4. 高级应用与配置陷阱掌握了基础配置后一些高级场景和易错点更能体现对这套机制理解的深度。4.1 多唤醒源协同与优先级管理在实际项目中系统往往需要响应多种唤醒事件比如既可以被定时器周期性唤醒进行数据上传也可以被用户按键立即唤醒进行交互还可以被通信总线上的特定命令唤醒。配置策略独立使能 在WUPEN寄存器中使能所有需要的唤醒源对应的位。例如同时使能ULP0UWUPEN定时唤醒和配置某个PORT_IRQ对应的唤醒位按键唤醒。中断优先级NVIC 唤醒本身没有“优先级”因为唤醒是系统级行为一旦有效唤醒事件发生CPU就会退出低功耗模式。但是当多个唤醒事件几乎同时发生或系统刚唤醒就面临多个待处理中断时NVIC的中断优先级决定了CPU先响应哪个ISR。对于需要紧急处理的唤醒事件如故障报警应分配更高的NVIC优先级。ISR中的源判断 如果多个唤醒源共享同一个ICU通道这通常不是好设计应尽量避免或者你想在ISR中精确知道是哪个事件唤醒了系统你需要在ISR中检查多个外设的中断标志。更常见的做法是为不同的唤醒源分配不同的ICU通道和IRQ号这样就有独立的ISR逻辑更清晰。4.2 从不同深度睡眠模式唤醒的差异RA8M1的低功耗模式是一个谱系从简单的CPU睡眠Sleep到深度软件待机Deep Software Standby功耗逐级降低但唤醒的限制也逐级增多。CPU Deep Sleep 仅CPU时钟停止大部分外设和内存仍保持供电。几乎所有能产生中断的外设只要在NVIC中使能都可以将其唤醒。WUPEN寄存器在此模式下可能不起作用或作用不同具体需查手册。通常对于较浅的睡眠中断使能NVIC_ISER本身就足够了。Software Standby / Deep Software Standby 这是真正的深度睡眠大部分时钟和电源域被关闭。只有少数特定的、由低功耗域供电的外设如ULPT、RTC、某些比较器、特定唤醒引脚才能继续工作并产生唤醒信号。此时WUPEN寄存器的使能变得绝对必要。而且你必须查阅表13.4确认你使用的外设中断在目标睡眠模式的“Canceling”列中有✓。一个典型陷阱 开发者用GPT通用定时器实现了一个1秒定时器在正常运行模式下工作完美。然后他让系统进入Software Standby并期望GPT中断能唤醒它。结果系统无法唤醒。原因就是GPT模块在Software Standby模式下可能已掉电根本无法运行更谈不上产生中断。必须换用ULPT超低功耗定时器这类在待机模式下仍能工作的外设。4.3 常见配置错误与排查指南以下是我在项目中反复遇到的“坑”及其解决方案问题现象可能原因排查步骤与解决方案进入睡眠后无法被唤醒1.WUPEN未使能 最常见的原因。中断在NVIC和ICU中都配置了但WUPEN位没置1。2.用错了外设 使用的外设在目标低功耗模式下不工作如用GPT而非ULPT。3.中断标志未清除 进入睡眠前该中断的标志位已经是1导致一进入睡眠立即满足唤醒条件但ISR可能因某种原因未执行或标志未清造成逻辑混乱。1. 检查WUPEN寄存器对应位的值确认已置1。2. 核对表13.4确认使用的外设中断支持唤醒目标睡眠模式。3. 在进入低功耗模式前读取并清除外设和ICU的中断状态寄存器。唤醒后程序跑飞或行为异常1.中断服务程序ISR未清除ICU的IR标志 如手册13.5.1节警告这可能导致CPU退出中断后立即再次进入形成“中断风暴”。2.系统时钟未稳定 从深度睡眠唤醒后高速时钟如PLL需要时间重新稳定。如果ISR或唤醒后的代码立即操作依赖高速时钟的外设可能导致失败。1.强制检查 在每一个ISR的末尾务必添加检查并清除ICU对应IELSRn.IR标志的代码。2.添加延时 在唤醒后的初始化代码中检查并等待主时钟源就绪标志如MOSC稳定标志再执行关键操作。特定唤醒源不工作但其他源正常1.安全属性不匹配 在启用TrustZone的系统中试图从非安全世界去使能一个安全世界的唤醒源。2.外设模块时钟未在低功耗下保持 虽然外设本身支持唤醒但其运行所需的时钟在睡眠模式下被关闭。1. 检查安全配置确保对WUPEN寄存器的操作与唤醒源的安全属性一致。2. 查阅电源控制章节确认在进入低功耗模式前已通过寄存器设置如SYSCLK.STBYCR保持该外设所需时钟源的运行。功耗未达到预期值1.唤醒源引脚配置不当 用于唤醒的GPIO引脚配置为上拉/下拉模式在睡眠期间产生了额外的电流通路。2.未使用的唤醒源被使能 WUPEN中使能了未使用的中断源而该中断源对应的外设或引脚有噪声导致频繁误唤醒。1. 将用于唤醒的输入引脚配置为“无上下拉”或符合电路设计的明确电平。将未使用的引脚设为模拟输入或输出固定电平。2. 在进入睡眠前仔细检查WUPEN寄存器只使能绝对必要的位其他位确保为0。4.4 低功耗唤醒设计的最佳实践规划先行 在硬件选型和原理图设计阶段就确定好需要哪些唤醒源按键、定时、通信总线等并选择在深度睡眠下仍能工作的外设如ULPT, RTC, 带唤醒功能的比较器。分层唤醒 设计多级唤醒策略。例如使用ULPT进行周期性“心跳”唤醒检查是否有高级别任务如通过按键或通信标志如果没有则立即再次进入睡眠。这比被一个低优先级事件唤醒后处理大量逻辑更省电。状态机管理 使用一个清晰的应用状态机。唤醒后根据唤醒标志快速判断唤醒原因执行最精简的必要操作然后决定是返回睡眠还是进入更高功耗的工作模式。全面的睡眠前清理清除所有不用于唤醒的中断在NVIC中的使能。将不用的外设模块时钟关掉。配置好所有IO口状态。最后再配置WUPEN和进入睡眠。利用调试工具 RA8M1的调试系统通常支持在低功耗模式下保持连接。利用调试器监控唤醒前后的寄存器状态、中断标志是定位问题最直接的手段。5. 与向量表及事件系统的关联WUPEN寄存器并非孤立的它与ICU的整个事件和向量表系统紧密相连。理解这种关联有助于你在更复杂的系统中进行调试。5.1 中断向量表的映射手册中的表13.3展示了中断向量表。对于IRQ0到IRQ95其中断服务函数的入口地址是由Vector offset决定的。例如IRQ10的向量偏移是0x068那么它的中断服务程序地址就是向量表基址 0x068。当你配置IELSR10.IELS 0x040时你就将ULPT0下溢中断事件号0x040“嫁接”到了IRQ10这个中断线上。因此当ULPT0下溢事件发生并且WUPEN使能它就会触发IRQ10CPU就会跳转到你为IRQ10编写的中断服务函数如IELSR10_IRQHandler中去执行。一个重要的启示 在编写启动文件或中断向量表时你需要为所有可能用到的IRQ号提供默认的中断处理函数甚至是空函数否则如果意外使能了某个未定义的中断会导致硬件错误HardFault。5.2 事件路由的灵活性ICU的IELSRn.IELS字段提供了极大的灵活性。这意味着几乎任何中断事件都可以被路由到几乎任何IRQ线上只要IRQ线空闲。这有什么用呢优先级重组 Arm NVIC的中断优先级是固定的IRQ号越小默认优先级越高不NVIC优先级可软件配置但IRQ号是固定的。通过将高优先级的事件路由到低IRQ号通常默认优先级更高或可配置范围更优的通道上你可以实现更灵活的优先级管理。中断合并 你可以将多个相似功能的、不需要同时处理的中断事件路由到同一个IRQ线上在同一个ISR中通过检查不同外设的标志位来区分和处理。但这会增加ISR的复杂度需谨慎使用。功能预留 为未来扩展预留特定的IRQ线。例如即使当前只用了ULPT0你也可以将其路由到IRQ15而把IRQ0-IRQ14留给更紧急或未来增加的中断。WUPEN寄存器的配置是建立在这种灵活路由的最终环节。它不关心事件被路由到了哪条IRQ线它只关心事件本身是否被授权唤醒。无论ULPT0_ULPTI事件是被路由到IRQ10还是IRQ90只要ULP0UWUPEN位被置1它就能履行唤醒职责。5.3 安全世界TrustZone下的考量对于带有TrustZone安全扩展的RA8M1型号ICU和WUPEN寄存器都有安全ICU和非安全ICU_NS两个视图。这是一个至关重要的安全边界。寄存器访问 从非安全世界Normal World的代码只能访问ICU_NS开头的寄存器地址。如果你想操作安全世界的中断或唤醒源必须通过安全世界提供的服务如Secure Monitor Call来实现。WUPEN安全属性 手册Note中强调的“安全属性匹配”规则意味着一个被定义为安全属性的唤醒事件例如来自安全固件管理的可信硬件其对应的WUPEN使能位只能由安全世界的软件来设置。如果非安全世界的软件尝试去设置它操作会被硬件静默忽略。这防止了非安全软件恶意配置安全唤醒源从而破坏系统的安全状态。因此在双世界系统中设计唤醒逻辑时必须明确划分哪些唤醒源归安全世界管理如安全密钥输入、篡改检测哪些归非安全世界管理如应用层定时器、用户按键。并在系统设计初期就规划好对应的WUPEN配置权限。