DRA7x SoC L4PER电源域管理:寄存器配置与低功耗唤醒实战
1. 项目概述DRA7x SoC L4PER电源域管理的核心价值在嵌入式系统开发尤其是汽车电子这类对功耗、实时性和可靠性要求都极为苛刻的领域芯片的电源管理能力直接决定了产品的成败。德州仪器TI的DRA7x系列Jacinto 6 Plus作为高性能汽车信息娱乐SoC其内部集成了复杂的电源、复位和时钟管理PRCM子系统。这个子系统不是简单的“开关电源”而是一套精密的硬件状态机负责协调数十个处理器核心、加速器和外设模块的供电、时钟和复位序列。L4PER低速外设电源域是这套体系中的一个关键部分。你可以把它想象成一个大型办公楼里的“公共办公区”里面容纳了各种支持性部门比如定时器TIMER、通用输入输出GPIO、串行通信接口I2C, UART, SPI、音频端口McASP以及加密引擎AES, SHA等。这个“办公区”的电力供应可以独立于核心的“高管办公区”如MPU、DSP进行控制。当系统进入低功耗状态时我们可以选择性地关闭L4PER的电源以节省能耗但必须确保两件事第一当某个外设需要工作时它能可靠地“唤醒”整个域乃至相关的处理器域第二当电源重新开启后这些外设能恢复到休眠前的状态而不是从头开始否则之前设置的定时器、通信配置就全丢了。这就是我们深入研究L4PER_PRMPower, Reset, and Clock Management寄存器配置与上下文管理的根本原因。它不仅仅是阅读手册更是理解如何让一个复杂SoC在“打盹”和“清醒”之间无缝切换的底层硬件机制。对于驱动工程师、系统架构师和固件开发者而言掌握这些寄存器的每一个比特意味着你能精准地控制功耗、设计可靠的唤醒流程并确保系统状态在任意低功耗循环后的一致性。接下来我将结合手册内容和个人实战经验为你拆解L4PER电源域管理的设计思路、关键寄存器操作以及那些手册上不会写的避坑指南。2. L4PER电源域架构与核心寄存器总览要驾驭L4PER的电源管理首先得看清它的全貌。DRA7x的PRCM模块将L4PER域进一步细分为L4PER1、L4PER2和L4PER3三个子域这种划分通常基于模块的功能相似性或电源门控的粒度需求。所有相关的控制与状态寄存器都映射在L4_WKUP互联总线上基地址为0x4AE0 7400。从提供的寄存器列表可以看出L4PER_PRM的寄存器主要分为三大类它们共同构成了电源管理的“监控与执行”体系第一类域级电源状态控制与状态寄存器这是整个电源域的“总闸门”和“状态仪表盘”。PM_L4PER_PWRSTCTRL (0x4AE0 7400)这是控制寄存器。你通过写这个寄存器来命令L4PER域进入何种电源状态ON, RETENTION, OFF。其中最关键的几个位域是POWERSTATE[1:0]直接控制域的整体电源状态。通常我们只使用0x3ON状态更深的状态转换由PRCM状态机自动管理。LOGICRETSTATE此位决定了在RETENTION保持状态下是仅保持寄存器的值逻辑关闭还是整个逻辑模块都保持供电。对于需要快速唤醒且需保持逻辑运行状态的模块应设置为1。LOWPOWERSTATECHANGE这是一个高级功能位。当域已经处于睡眠状态时设置此位可以请求进入更深的低功耗状态而无需先将域唤醒。这在需要动态调整功耗深度时非常有用。PM_L4PER_PWRSTST (0x4AE0 7404)这是状态寄存器只读。它实时反映了域的当前状态和最后一次进入的状态。POWERSTATEST告诉你当前是ON还是其他状态INTRANSITION位则像一个“忙”指示灯当它为1时表示电源状态转换正在进行中此时不应进行新的状态变更操作。LASTPOWERSTATEENTERED则用于调试记录上一次的电源状态。第二类模块级唤醒依赖Wakeup Dependency寄存器这是实现事件驱动唤醒的关键。每个支持唤醒功能的外设如TIMER10, GPIO2, I2C1, UART1等都有一个对应的PM_L4PER_xxx_WKDEP寄存器。功能这些寄存器定义了当该外设产生一个唤醒事件如定时器中断、GPIO边沿检测、UART接收到数据时它需要去唤醒哪些处理器或子系统域。例如PM_L4PER_TIMER10_WKDEP寄存器中的WKUPDEP_TIMER10_MPU位就控制着TIMER10的中断是否能唤醒MPU子系统以及其依赖的L3_MAIN1, L4PER1/2/3域。设计逻辑这种设计提供了极大的灵活性。你可以配置一个连接在CAN总线上的DCAN2模块在收到报文时只唤醒负责处理的DSP域而让图形处理的GPU继续休眠。精细化地配置这些依赖关系是优化整体功耗的关键。第三类模块级上下文丢失状态寄存器这是系统可靠性的“保险丝”指示器。每个外设模块以及L4PER1/2/3子域本身都有一个对应的RM_L4PER_xxx_CONTEXT寄存器。核心位域主要是LOSTCONTEXT_RFF和LOSTCONTEXT_DFF位。RFF代表 Retention Flip-Flop保持触发器它在电源关闭时由备用电源供电以保持数据DFF代表普通的 D Flip-Flop普通触发器断电后数据会丢失。触发机制当发生特定的复位如L4PER_RST,L4PER_RET_RST,CORE_RET_RST或电源域掉电再上电时对应的丢失位会被硬件自动置1。软件职责系统软件通常是驱动或电源管理框架在初始化或从低功耗状态恢复时必须检查这些位。如果发现LOSTCONTEXT_xxx为1则表明该模块之前的配置和运行状态已丢失软件必须重新初始化该模块配置寄存器、加载上下文等。如果为0则表明上下文得以保持软件可以跳过冗长的初始化过程快速恢复运行。这是实现“瞬时唤醒”和低功耗待机的硬件基础。理解这三类寄存器的分工与协作是进行任何具体配置的前提。它们共同回答了三个核心问题域现在是什么状态PWRSTST - 我想让它变成什么状态PWRSTCTRL- 谁能唤醒它WKDEP- 唤醒后东西还在不在CONTEXT。3. 核心寄存器功能深度解析与配置实战仅仅知道寄存器分类还不够我们必须深入其位域理解每个配置选项背后的硬件行为并转化为可操作的代码或配置步骤。3.1 域级电源控制寄存器PM_L4PER_PWRSTCTRL/ST详解这两个寄存器是操作L4PER电源域的“总开关”和“状态监视器”。PM_L4PER_PWRSTCTRL 关键位域操作指南POWERSTATE (位[1:0])操作通常我们只直接写入0x3ON。将域从OFF或RETENTION状态切换到ON是一个由PRCM硬件状态机管理的序列过程通常不是通过直接写此寄存器完成而是通过更高层的电源管理接口如Linux内核的genpd来触发。直接写此寄存器需极度谨慎。注意手册中0x0,0x1,0x2均标记为Reserved意味着这些状态可能由硬件内部使用或在该芯片上未实现切勿使用。LOGICRETSTATE (位[2])场景选择设置为0仅保持寄存器Retention Registers供电组合逻辑关闭。功耗最低但唤醒后逻辑需要重新稳定恢复时间稍长。设置为1整个逻辑块包括组合逻辑在RETENTION状态下都保持供电。功耗略高但唤醒速度极快逻辑状态完全保持。如何选对于需要极低待功耗且对唤醒后初始延迟不敏感的场景如部分传感器接口可设为0。对于系统关键路径上的模块如某些总线桥接器要求唤醒后立即投入工作应设为1。LOWPOWERSTATECHANGE (位[4])高级用法假设L4PER域已处于RETENTION状态但系统希望进入更深的OFF状态以进一步省电。此时软件可以设置此位为1PRCM硬件会在不唤醒该域的前提下将其状态机推向更深的低功耗状态。操作完成后或状态变为ON时此位自动清零。实操提示这是一个优化功能在简单的低功耗设计中可能用不到。使用前必须确认域已处于睡眠状态并且目标状态是支持的更深状态。PM_L4PER_PWRSTST 状态读取与判断驱动或电源管理代码在发起状态转换前后必须查询此寄存器。// 伪代码示例等待电源域状态转换完成 uint32_t pwr_sts readl(L4PER_PRM_BASE PM_L4PER_PWRSTST_OFFSET); while (pwr_sts (1 20)) { // 检查 INTRANSITION 位 // 转换进行中等待或进行超时处理 udelay(10); pwr_sts readl(L4PER_PRM_BASE PM_L4PER_PWRSTST_OFFSET); } if ((pwr_sts 0x3) ! 0x3) { // POWERSTATEST 不为 ON 转换可能失败或未完成 // 错误处理... }避坑经验状态转换非瞬时写PWRSTCTRL后必须轮询PWRSTST中的INTRANSITION位直到其为0才能认为转换完成。忽略这一步是导致后续外设访问失败或系统不稳定的常见原因。复位后的默认状态芯片冷启动或热复位后POWERSTATE通常是0x3ON但LOGICRETSTATE等位的复位值需要根据你的低功耗策略重新配置不能依赖默认值。3.2 唤醒依赖WKDEP寄存器的策略性配置唤醒依赖配置是低功耗设计的精髓。它决定了系统在“沉睡”时能被哪些事件“叫醒”。以 PM_L4PER_TIMER10_WKDEP (0x4AE0 7428) 为例这个寄存器控制TIMER10模块的中断信号能唤醒哪些上级域。每一位对应一个目标域MPU, IPU1, IPU2, DSP1, DSP2, EVE1, EVE2。配置策略与步骤明确唤醒路径在DRA7x中外设的唤醒信号通常需要经过一个“依赖链”。例如TIMER10要唤醒MPU它需要先唤醒L4PER域本身然后依次唤醒L4PER的上级域L4PER2/3? 此处需查证具体拓扑最后到达MPU。WKDEP寄存器配置的是这个链路的“使能开关”。按需使能绝对不要盲目地使能所有位。例如如果你的应用场景中TIMER10仅用于为DSP1提供周期性中断那么你应该只设置WKUPDEP_TIMER10_DSP11其他位如WKUPDEP_TIMER10_MPU,WKUPDEP_TIMER10_EVE2等保持为0。这可以防止不必要的唤醒节省功耗。配置时机唤醒依赖通常在驱动初始化阶段、在使能该外设中断之前进行配置。并且在系统准备进入低功耗状态前应再次确认这些配置符合当前的睡眠策略。代码示例// 假设我们只需要TIMER10唤醒DSP1和IPU1 void configure_timer10_wakeup(void) { uint32_t reg_val readl(L4PER_PRM_BASE PM_L4PER_TIMER10_WKDEP_OFFSET); // 清除所有唤醒目标位 reg_val ~(0xFF); // 假设低8位控制目标域根据手册调整掩码 // 设置目标DSP1 (位2) 和 IPU1 (位4) reg_val | (1 2) | (1 4); writel(reg_val, L4PER_PRM_BASE PM_L4PER_TIMER10_WKDEP_OFFSET); }关键注意事项级联唤醒使能一个外设对某个处理器域的唤醒通常意味着该处理器域所依赖的整个电源/时钟域链都会被唤醒。例如使能TIMER10唤醒MPU会导致L3_MAIN1和L4PER域也被连带唤醒。功耗评估时要考虑整体影响。共享信号某些WKDEP寄存器如GPIOx_WKDEP有两个IRQ信号IRQ1, IRQ2对应不同的中断线需要根据实际硬件连接来配置正确的位。DMA唤醒对于I2C、McASP等带有DMA功能的模块其WKDEP寄存器中除了IRQ唤醒位还有DMA_DSPx、DMA_SDMA等位。如果该外设需要通过DMA传输数据来唤醒系统必须同时使能对应的DMA唤醒位否则DMA控制器可能无法被激活导致数据传输失败。3.3 上下文丢失CONTEXT寄存器的诊断与恢复这是系统从低功耗状态可靠恢复的生命线。RM_L4PER_xxx_CONTEXT寄存器中的LOSTCONTEXT位是硬件设置的只读状态标志部分可写用于软件清除。工作流程与软件处理复位或上电初始化在任何外设驱动尝试使用该模块前必须先检查其CONTEXT寄存器。状态诊断如果LOSTCONTEXT_DFF 0且LOSTCONTEXT_RFF 0恭喜模块的寄存器和保持寄存器内容都完好无损。驱动可以跳过完整的硬件初始化流程直接恢复之前的运行状态例如重新使能中断。这能实现亚毫秒级的快速唤醒。如果LOSTCONTEXT_DFF 1普通寄存器上下文丢失。必须执行完整的模块初始化序列包括所有配置寄存器的重写。如果LOSTCONTEXT_RFF 1保持寄存器上下文丢失。同样需要完整初始化。有些模块如MMC, UART还有LOSTMEM_xxx_BANK位指示片上内存上下文是否丢失处理逻辑相同。恢复与清除诊断后软件在完成必要的重新初始化后应向该位写入0如果该位是RW类型以清除丢失标志为下一次低功耗循环做准备。但需注意部分寄存器中该位是只读的仅由硬件置位在特定条件如上下文成功恢复后下由硬件自动清除软件需查阅具体模块手册确认。实战代码片段int uart_context_restore(struct uart_device *dev) { void __iomem *context_reg L4PER_PRM_BASE RM_L4PER_UART1_CONTEXT_OFFSET; uint32_t ctx_status readl(context_reg); int need_full_init 0; // 检查上下文丢失状态 if (ctx_status (1 0)) { // 检查LOSTCONTEXT_DFF位假设位0 pr_warn(UART1 DFF context lost, need full init.\n); need_full_init 1; } if (ctx_status (1 1)) { // 检查LOSTCONTEXT_RFF位假设位1 pr_warn(UART1 RFF context lost, need full init.\n); need_full_init 1; } if (ctx_status (1 8)) { // 检查LOSTMEM_RETAINED_BANK位假设位8 pr_warn(UART1 memory context lost, need full init.\n); need_full_init 1; } if (need_full_init) { // 执行完整的UART初始化设置波特率、数据位、停止位、FIFO等 uart_hw_full_init(dev); // 尝试清除丢失标志如果寄存器允许写入 writel(0, context_reg); } else { // 上下文保持完好快速恢复可能只需重新使能时钟和中断 uart_hw_quick_restore(dev); pr_info(UART1 context restored quickly.\n); } return 0; }一个容易忽略的坑LOSTCONTEXT位在上电复位或特定域复位后默认是1表示上下文已丢失。这意味着即使你没有进行任何低功耗操作在驱动首次加载时也可能会读到LOSTCONTEXT1。因此你的驱动初始化代码必须包含对上下文丢失的处理逻辑而不能假设只有从低功耗唤醒才需要。这应该成为DRA7x所有外设驱动编写的标准范式。4. 典型工作流程与实操案例配置GPIO唤醒与上下文恢复让我们通过一个具体的场景将上述所有知识点串联起来配置GPIO2的下降沿中断用于将系统从深度休眠中唤醒并确保GPIO2模块的上下文在唤醒后得以正确恢复。步骤1系统分析与规划目标GPIO2引脚上的下降沿事件唤醒MPU子系统以及必要的L3_MAIN1和L4PER域。前提MPU、L3_MAIN1、L4PER域在休眠前已被置于合适的低功耗状态如RETENTION。上下文GPIO2模块的上下文中最重要的是引脚方向输入/输出、上下拉配置、中断使能和类型边沿/电平等。我们希望这些配置在唤醒后仍然有效。步骤2休眠前的配置与检查// 1. 配置GPIO2唤醒依赖允许其IRQ1信号唤醒MPU域 void configure_gpio2_wakeup_dependency(void) { uint32_t reg_val readl(L4PER_PRM_BASE PM_L4PER_GPIO2_WKDEP_OFFSET); // 使能 GPIO2 IRQ1 对 MPU 的唤醒依赖 (位0) // 注意根据手册位0对应 WKUPDEP_GPIO2_IRQ1_MPU reg_val | (1 0); // 根据需求可能还需要使能对DSP1等的依赖 // reg_val | (1 2); // 例如使能对DSP1的唤醒 writel(reg_val, L4PER_PRM_BASE PM_L4PER_GPIO2_WKDEP_OFFSET); } // 2. 配置GPIO2模块本身设置为输入、下降沿触发、使能中断 void configure_gpio2_module_for_wakeup(int gpio_pin) { // 假设GPIO2相关控制寄存器基址为GPIO2_BASE // a. 设置引脚方向为输入 writel(readl(GPIO2_BASE OE_OFFSET) | (1 gpio_pin), GPIO2_BASE OE_OFFSET); // b. 清除可能存在的旧中断状态 writel(1 gpio_pin, GPIO2_BASE IRQSTATUS_RAW_0_OFFSET); // c. 设置下降沿检测 writel(readl(GPIO2_BASE FALLINGDETECT_OFFSET) | (1 gpio_pin), GPIO2_BASE FALLINGDETECT_OFFSET); // d. 使能该引脚的系统唤醒能力GPIO模块内部唤醒使能位 writel(readl(GPIO2_BASE IRQWAKEN_0_OFFSET) | (1 gpio_pin), GPIO2_BASE IRQWAKEN_0_OFFSET); // e. 使能该引脚的普通中断如果需要 // writel(readl(GPIO2_BASE IRQSTATUS_SET_0_OFFSET) | (1 gpio_pin), GPIO2_BASE IRQSTATUS_SET_0_OFFSET); } // 3. 检查并保存GPIO2上下文状态可选用于调试 uint32_t save_gpio2_context_status(void) { return readl(L4PER_PRM_BASE RM_L4PER_GPIO2_CONTEXT_OFFSET); }步骤3进入低功耗序列由系统级PM代码执行系统软件如Linux内核的genpd将MPU、L3_MAIN1等域置于低功耗状态。PRCM硬件自动处理依赖关系最后将L4PER域置于请求的状态如RETENTION。芯片进入深度休眠。步骤4唤醒与恢复流程当GPIO2引脚出现下降沿GPIO2模块检测到边沿产生内部唤醒信号。该信号根据PM_L4PER_GPIO2_WKDEP的配置触发MPU及上级域的唤醒序列。电源域逐级上电时钟恢复。MPU从复位向量或暂停点开始执行唤醒后的第一段代码通常是唤醒处理程序或操作系统调度器。步骤5驱动恢复与上下文检查// 在GPIO2驱动或系统唤醒后的早期初始化代码中 void gpio2_post_wakeup_restore(int gpio_pin) { uint32_t ctx_status readl(L4PER_PRM_BASE RM_L4PER_GPIO2_CONTEXT_OFFSET); // 检查RFF上下文是否丢失GPIO2_CONTEXT的位1 if (ctx_status (1 1)) { // LOSTCONTEXT_RFF pr_err(GPIO2 RFF context lost! Re-initializing module.\n); // 必须执行完整的GPIO2模块初始化 // 1. 可能需要对GPIO2模块进行一次软复位如果支持 // 2. 重新配置所有寄存器方向、上下拉、去抖、中断类型等 full_gpio2_reinit(gpio_pin); // 3. 清除丢失标志如果寄存器可写 writel(ctx_status ~(1 1), L4PER_PRM_BASE RM_L4PER_GPIO2_CONTEXT_OFFSET); } else { pr_info(GPIO2 context preserved. Quick restore.\n); // 上下文保持通常只需要重新使能中断控制器中的中断线即可 // 因为GPIO模块的配置如边沿检测类型仍然有效 enable_irq(GPIO2_IRQ_NUMBER); } // 清除GPIO2模块内的中断挂起位 writel(1 gpio_pin, GPIO2_BASE IRQSTATUS_0_OFFSET); }关键要点唤醒依赖配置是“使能”它打开了唤醒的通路但不保证上下文不丢失。上下文是否丢失取决于电源状态OFF会丢失RETENTION可能保持和复位信号是否触发。上下文检查是“必须”无论你是否预期它会丢失。这是编写健壮驱动的基础。恢复策略要分层根据LOSTCONTEXT标志决定是进行耗时长的完整初始化还是快速恢复。这能显著优化唤醒延迟。5. 常见问题排查与调试技巧实录在实际开发和调试中你会遇到各种与电源管理相关的问题。以下是一些典型问题及其排查思路问题1配置了唤醒依赖但系统无法被外设唤醒。排查清单电源域状态确认目标唤醒域如MPU以及L4PER域本身是否支持你试图进入的低功耗状态有些深度睡眠状态可能关闭了某些域的唤醒接收电路。WKDEP寄存器配置使用调试器或内核日志确认你写入PM_L4PER_xxx_WKDEP寄存器的值是否正确。是否使能了正确的位是否意外覆盖了其他位的配置外设自身唤醒使能WKDEP寄存器是“通路开关”但外设模块内部通常还有一个“信号发生器开关”。例如GPIO模块除了配置WKDEP还必须设置IRQWAKEN寄存器来允许该引脚产生唤醒事件。对于UART可能需要使能特定的“唤醒使能”位。务必查阅具体外设的TRM章节。中断与唤醒信号路径确认你使用的中断线IRQ1还是IRQ2与WKDEP寄存器中配置的位如IRQ1_MPUvsIRQ2_MPU是否匹配。时钟与电源外设所在的电源域和时钟域在休眠时是否仍然有保持供电和时钟对于某些外设即使电源域处于RETENTION如果功能时钟被关闭也可能无法检测事件。问题2系统唤醒后外设工作不正常数据错乱或寄存器值被重置。首要怀疑对象上下文丢失。排查步骤在唤醒后的驱动初始化函数中第一时间读取并打印对应的RM_L4PER_xxx_CONTEXT寄存器值。如果LOSTCONTEXT_DFF或LOSTCONTEXT_RFF为1则证明硬件上下文已丢失。你需要检查系统进入的低功耗状态是否过深如OFF vs RETENTIONOFF状态肯定会丢失DFF上下文。是否有意外的复位信号如L4PER_RST在休眠期间被触发如果上下文标志为0但仍有问题则可能是软件逻辑错误例如驱动在休眠前未正确保存某些易失性状态如DMA缓冲区指针、FIFO状态。唤醒后时钟频率或电源电压未稳定就访问外设。问题3如何验证唤醒依赖配置是否生效静态验证在系统启动后、进入低功耗前通过调试接口如JTAG或内核驱动读取PM_L4PER_xxx_WKDEP寄存器确认其值与预期一致。动态验证这是一个高级调试技巧。你可以编写一个测试驱动配置好外设和唤醒依赖。让系统进入目标低功耗状态。触发外设事件如给GPIO一个边沿信号。测量系统唤醒的延迟并通过串口或内存日志查看唤醒后的执行流。如果成功唤醒说明路径基本正确。你还可以在唤醒处理函数中读取PRCM模块的些状态寄存器来观察唤醒源的记录。问题4多个唤醒源同时存在时如何确定是哪个唤醒了系统DRA7x的PRCM模块通常有唤醒源状态寄存器Wakeup Source Status Registers分布在各个电源域或系统级的PRM模块中。在唤醒后的初始化代码中查询这些寄存器可以确定是哪个或哪些唤醒事件触发了此次唤醒。这对于调试复杂的多唤醒源系统至关重要。你需要查阅TRM中关于“Wakeup Source Management”的章节。调试工具与技巧使用TI的CCSCode Composer Studio和JTAG调试器可以在线查看和修改所有PRCM寄存器设置硬件断点甚至在CPU暂停时观察电源域状态。内核日志与FTrace在Linux环境下启用电源管理相关的调试日志如CONFIG_PM_DEBUG并使用Ftrace跟踪电源管理回调函数的执行顺序和时间。电源与时钟测量使用示波器或电流探头测量关键电源轨的电压和电流波形以及外设模块的时钟信号。这可以直观地看到电源域的开关时序和唤醒事件后的响应延迟。6. 总结与进阶思考深入理解并正确配置DRA7x的L4PER电源域寄存器是释放该平台低功耗潜力的关键。这个过程远不止是“填寄存器”它要求开发者建立起清晰的硬件状态机模型状态意识时刻清楚系统中各个域MPU, DSP, L3_MAIN, L4PER处于ON、RETENTION还是OFF状态。依赖意识任何操作唤醒、访问都要考虑电源、时钟、复位的依赖关系。上下文意识任何从低功耗状态的返回都必须以检查上下文状态为起点。从提供的寄存器手册片段中我们还能看到一些更精细的设计例如PM_L4PER_PWRSTCTRL中的NONRETAINED_BANK_ONSTATE和RETAINED_BANK_ONSTATE位它们控制着域内不同存储体在ON状态下的行为。这暗示了芯片内部可能对不同用途的存储器进行了更细致的电源分区管理。在实际项目中我建议将对这些寄存器的操作封装成统一的、可移植的驱动层API。例如提供一个prcm_l4per_configure_wakeup(module_id, target_domains)函数和一个prcm_l4per_check_context(module_id)函数。这样上层业务驱动只需关注功能而将复杂的电源管理细节交给底层专家模块处理。最后务必记住电源管理配置是系统级行为。修改一个外设的唤醒依赖可能会影响其他无关外设或处理器的功耗。在最终产品定型前必须在各种真实使用场景下如播放音乐时待机、导航时休眠进行全面的功耗和唤醒可靠性测试。手册上的位域定义是静态的而系统的功耗行为是动态的唯有通过严谨的实践才能让这些寄存器配置真正为你的产品创造价值。