1. 项目概述与核心价值在嵌入式开发领域尤其是面对电池供电的物联网节点、可穿戴设备或便携式仪器时功耗管理是决定产品成败的关键。我们常常需要在性能与续航之间寻找最佳平衡点。作为系统的“记忆中枢”Flash存储器的功耗往往被忽视但它内部的高压电荷泵、灵敏放大器等模拟电路在待机时也会持续消耗可观的电流。PXD10微控制器的Flash模块提供了两种精细化的低功耗模式Power-Down Mode和Low Power Mode。理解并正确配置它们意味着你能在系统休眠时将这块“内存大脑”也置于深度睡眠从而将整体静态功耗再压低一个数量级。然而低功耗从来不是简单的“关闭电源”。就像你不能在一个人跑步时突然让他睡觉Flash模块在进入低功耗状态前必须处理好正在进行的擦写操作并妥善“安置”好自身的状态。PXD10的参考手册揭示了其中的复杂性特定寄存器在低功耗模式下访问受限擦除操作可能被挂起唤醒时序需要精确把控。如果配置不当轻则导致数据写入失败重则引发不可预知的系统错误。因此深入理解MCR模块配置寄存器等关键寄存器的每一位含义以及低功耗模式下的状态机转换是开发稳定、低功耗嵌入式系统的必修课。本文将带你深入PXD10 Flash模块的低功耗世界从原理到实操详解每一个配置细节和避坑要点。2. PXD10 Flash模块低功耗模式深度解析PXD10的Flash模块设计了两种低功耗模式它们并非简单的开关而是具有不同唤醒延迟和功耗特性的状态。理解它们的差异是正确应用的前提。2.1 Power-Down Mode深度睡眠Power-Down Mode可以理解为Flash模块的“深度睡眠”状态。在此模式下模块内部绝大多数电路被关闭仅保留维持最基本状态信息所需的极小电流。这是功耗最低的模式。核心特性与访问限制一旦进入Power-Down模式Flash核心及其寄存器阵列将完全不可访问。这意味着CPU无法读取Flash中的指令或数据也无法对Flash控制寄存器进行读写操作。手册中特别指出用户无法读取UMISR0-4、UT1-2及部分UT0寄存器直到退出此模式。同时对所有寄存器的写访问均被锁定。这是一个至关重要的安全机制防止在模块状态不稳定时进行误操作。状态保存与恢复模块被设计为具有状态保持能力。当退出Power-Down模式后Flash模块会返回到进入低功耗模式之前的状态但有一个关键的例外如果进入低功耗模式时模块正在执行擦除操作的高压阶段那么该操作会被挂起。2.2 Low Power Mode浅度休眠Low Power Mode则可视为“浅度休眠”。它关闭了模块内部大部分的直流电流源但可能保留了一些比Power-Down模式更多的电路以实现更快的唤醒。核心特性与对比与Power-Down模式类似进入Low Power Mode后模块Flash核心和寄存器同样不可用于读写。对UMISR0-4、UT1-2及部分UT0寄存器的读取访问也被禁止所有寄存器的写访问被锁定。其最大的不同在于唤醒时间。Low Power Mode的唤醒时间比Power-Down Mode更快。这为系统设计提供了灵活性如果你需要频繁唤醒并快速响应Low Power Mode可能是更好的选择如果你追求极致的休眠功耗且能接受更长的唤醒延迟则应该使用Power-Down Mode。状态恢复机制与Power-Down模式一致退出Low Power Mode后模块同样会恢复到进入前的状态同样需要处理擦除操作被挂起的情况。2.3 模式互斥与操作挂起机制这两种低功耗模式之间存在严格的互斥关系。手册明确指出当Power-Down Mode激活时禁止进入Low Power Mode反之当Low Power Mode激活时也禁止进入Power-Down Mode。这防止了状态机进入混乱或未定义的状态。最需要开发者关注的是擦除Erase和编程Program操作与低功耗模式进入的交互进入低功耗模式时遇到擦除操作如果Flash模块在进入任何一种低功耗模式时正处于擦除操作的高压阶段则MCR[ESUS]擦除挂起位会被硬件自动置1。擦除操作被暂停。用户需要在模块退出低功耗模式后通过先确保MCR[EHV]使能高压位为高再清除MCR[ESUS]位来恢复擦除操作。进入低功耗模式时遇到编程操作如果Flash模块被配置为在编程操作期间进入低功耗模式硬件会保证编程操作完成后模块才会真正进入低功耗模式。这是一个同步过程无需用户干预挂起与恢复。中断响应延迟手册中一个容易被忽略但影响重大的警告是如果Flash模块处于Power-Down模式并且向量表Vector Table仍然映射在Flash地址空间那么中断响应时间将会显著增加因为需要额外插入多个等待状态Wait States来唤醒和准备Flash模块。在实时性要求高的应用中必须考虑将中断向量表重定位到RAM中或者避免在需要快速响应的休眠阶段让Flash处于Power-Down模式。注意在尝试进入低功耗模式前软件必须检查MCR[DONE]位。只有当DONE1表示没有正在进行的高压操作时进入低功耗模式才是安全的。否则可能会破坏正在进行的擦写操作导致数据损坏。3. 核心寄存器配置详解与实操指南寄存器是软件与Flash硬件交互的桥梁。低功耗模式的管理、擦写操作的控制都依赖于对寄存器的精准配置。PXD10的Flash用户寄存器映射在固定的偏移地址我们重点剖析最核心的模块配置寄存器MCR和块锁定寄存器。3.1 模块配置寄存器MCR全位解析与操作流MCR是Flash模块的“总控制台”地址偏移为0x0000。它的每一位都至关重要。下图是其位域布局的简要示意基于手册描述位域名称类型描述与操作要点0EDCrcECC单错误纠正标志。发生ECC单比特错误并纠正后置1需写1清除。5:7SIZE[2:0]r指示Flash阵列大小只读。例如010代表512KB。9:11LAS[2:0]r指示低地址空间配置只读。15MASr指示中地址空间配置只读。16EERrcECC双错误检测标志。发生ECC不可纠正的双比特错误后置1需写1清除。17RWErc读写冲突错误标志。在编程/擦除期间访问Flash矩阵置1需写1清除。20PEASr编程/擦除地址空间选择。0主阵列1测试/影子空间。21DONEr高压操作完成标志。0正在执行高压操作1未执行。进入低功耗模式前必须确保此位为1。22PEGr编程/擦除操作成功标志。仅在DONE从0变1后操作完成或中止有效。27PGMrw编程序列控制。0-1启动编程1-0结束编程。仅在用户模式读ERS0, UT0.AIE0时可置位。29ERSrw擦除序列控制。0-1启动擦除1-0结束擦除。仅在用户模式读PGM0, UT0.AIE0时可置位。30ESUSrw擦除挂起控制。用于挂起和恢复擦除操作与低功耗模式交互紧密。31EHVrw使能高压。这是启动编程/擦除高压阶段的“总开关”。必须在互锁写操作后设置。关操作流程与寄存器交互启动擦除操作确保目标存储块已解锁通过LML/HBL/SLL寄存器。确保MCR[PGM]0,MCR[ESUS]0,UT0.AIE0。设置MCR[ERS]1。此时模块进入擦除序列准备状态。执行特定的互锁写序列通常是向一个特定地址写入一个特定数据模式具体需查数据手册。设置MCR[EHV]1。高压启动MCR[DONE]自动清零开始物理擦除。轮询或等待中断直到MCR[DONE]1。检查MCR[PEG]1确认操作成功。在擦除中进入低功耗模式若在MCR[EHV]1且MCR[DONE]0正在擦除时系统试图让Flash进入低功耗模式。硬件会自动设置MCR[ESUS]1并在一段延迟tESUS后设置MCR[DONE]1表示擦除已挂起模块可以安全进入低功耗。此时MCR[EHV]必须保持为1。退出低功耗并恢复擦除Flash退出低功耗模式。用户需要先确保MCR[EHV]1然后清除MCR[ESUS]0。清除ESUS后MCR[DONE]会再次清零擦除操作从挂起点恢复。启动编程操作流程与擦除类似但设置的是MCR[PGM]1。关键区别如果编程过程中请求进入低功耗模式硬件会完成当前编程操作后再进入不会产生挂起状态。因此编程操作对低功耗模式更“友好”。位写入优先级机制 手册的Table 17-12揭示了MCR关键控制位的写入优先级ERS PGM EHV ESUS。这意味着如果你尝试通过一次写操作同时改变多个位例如同时清除ERS和EHV只有优先级最高的位此处是ERS的变更会生效。这强制了状态转换的顺序性防止软件错误导致非法状态。在实践中务必通过多次独立的写操作来按顺序改变这些位。3.2 存储块锁定机制详解LML HBL SLL保护Flash内容不被意外修改至关重要。PXD10提供了三层锁定机制主锁LML/HBL、副锁SLL以及最终的“或”逻辑判断。1. 锁寄存器结构与使能LML (Low/Mid Lock)偏移0x0004控制低/中地址空间块的锁定。HBL (High Block Lock)偏移0x0008控制高地址空间块的锁定。SLL (Secondary Low/Mid Lock)偏移0x000C为低/中地址空间提供第二套锁定控制。这些寄存器本身也是被锁定的要修改它们内部的锁定位如LLK15-0 HLK5-0等必须先通过写入特定密码来使能对应的“写使能”位LME(LML bit 0)写入密码0xA1A11111至LML寄存器可使能。HBE(HBL bit 0)写入密码0xB2B22222至HBL寄存器可使能。SLE(SLL bit 0)写入密码0xC3C33333至SLL寄存器可使能。使能后直到下一次系统复位前都可以修改具体的锁定位。2. 锁定逻辑与“或”关系最终的块锁定状态由主锁和副锁**按位相“或”**决定。以低地址空间块0为例最终锁定状态 LML.LLK0ORSLL.SLK0只要LML.LLK0或SLL.SLK0中任意一个为1该块就被锁定。只有两者都为0时该块才解锁允许编程和擦除。这种设计提供了灵活性例如可以由引导加载程序Bootloader设置一套锁如LML由应用程序设置另一套锁如SLL共同管理存储区域的保护策略。3. 非易失性锁存与初始化LML HBL SLL在复位时的初始值并非固定而是从Flash测试区域中的非易失性寄存器NVLML NVHBL NVSLL加载而来。这些非易失性寄存器在芯片出厂时通常为全1已擦除状态意味着所有锁定位默认为1锁定。在量产过程中可以通过编程工具修改这些非易失性寄存器的值实现产品的默认保护状态。上电后FPECFlash编程擦除控制器会读取这些值并更新到易失性的LML/HBL/SLL寄存器中。实操心得在开发调试阶段我们通常在软件初始化时通过密码使能并清除所有锁定位以获得完全访问权限。但在产品发布前务必规划好最终的存储分区和保护策略并考虑是否需要在测试区域编程非易失性锁存值以实现上电即保护防止未授权代码修改关键区域如Bootloader区。4. 低功耗模式配置与进出流程实战理论清晰后我们来看如何在代码中安全、正确地实现Flash模块的低功耗管理。以下流程基于典型的中断驱动或轮询式电源管理。4.1 进入低功耗模式前的安全检查与配置在请求系统进入深度休眠如调用__WFI()或__WFE()指令之前负责电源管理的代码必须对Flash模块进行安全检查。/** * brief 检查并配置Flash模块使其准备进入低功耗模式。 * param mode 目标低功耗模式FLASH_LOW_POWER_MODE 或 FLASH_POWER_DOWN_MODE * return bool true: 准备就绪可进入系统低功耗 false: 未就绪不应进入。 */ bool FLASH_PrepareForLowPower(FlashLowPowerMode_t mode) { volatile FLASH_MCR_t *pMCR (FLASH_MCR_t*)FLASH_MCR_BASE_ADDR; // 1. 检查是否有正在进行的高压操作 if ((pMCR-DONE 0) || (pMCR-EHV 1)) { // DONE0 表示高压操作正在进行 // 即使DONE1如果EHV1也表示模块处于“就绪”或“挂起”状态并非完全空闲 // 此时不应进入低功耗返回错误或等待 return false; } // 2. 检查擦除挂起状态。如果ESUS1说明有擦除被挂起模块状态不“干净”。 // 通常我们应该在退出低功耗后恢复它而不是带着挂起状态进入。 // 最佳实践是在进入低功耗前确保没有挂起的操作。 if (pMCR-ESUS 1) { // 可以选择恢复擦除并等待完成或直接返回错误。 // 这里选择返回错误让上层决定是等待还是放弃进入低功耗。 return false; } // 3. 根据目标模式配置Flash控制器的低功耗模式使能位。 // 注意PXD10的具体控制位名称可能不同这里使用伪代码。 // 通常芯片的电源管理单元PMC或SIM有一个寄存器来控制各模块的低功耗模式。 // 例如PMC-LPCR | PMC_LPCR_LPMD(模式); // 使能Flash的指定低功耗模式 // 这一步是通知电源管理单元“当系统休眠时请将Flash置于此模式”。 // 具体寄存器请参考芯片的电源管理章节。 // 伪代码示例 // if (mode FLASH_POWER_DOWN_MODE) { // PMC-REG | PMC_REG_FLASH_PD_EN_MASK; // } else { // PMC-REG | PMC_REG_FLASH_LP_EN_MASK; // } // 4. 可选但推荐如果使用Power-Down模式且对中断响应时间敏感 // 考虑将中断向量表重定位到RAM。 if (mode FLASH_POWER_DOWN_MODE) { // SCB-VTOR (uint32_t)my_ram_vector_table; // 重定位VTOR } return true; // 安全检查通过Flash已配置好 }4.2 退出低功耗模式后的状态恢复与操作续接系统唤醒后Flash模块需要一段时间从低功耗模式恢复。软件必须等待其稳定并处理可能挂起的操作。/** * brief 系统唤醒后复Flash模块至正常工作状态。 */ void FLASH_RecoverFromLowPower(void) { volatile FLASH_MCR_t *pMCR (FLASH_MCR_t*)FLASH_MCR_BASE_ADDR; // 1. 等待Flash模块退出低功耗模式并稳定。 // 芯片手册会提供一个最小的唤醒时间 tWAKE。通常通过延时或查询状态位实现。 // 伪代码while (!(PMC-STATUS PMC_STATUS_FLASH_RDY_MASK)); // 查询就绪位 // 简单延时方法需根据系统时钟计算 // delay_us(FLASH_WAKEUP_TIME_US); // 例如 50us // 2. 检查并恢复挂起的擦除操作 if (pMCR-ESUS 1) { // 存在挂起的擦除操作 // a. 首先确保EHV1 (挂起时EHV应保持为1) if (pMCR-EHV 0) { // 异常情况EHV被意外清除。挂起的操作可能已损坏。 // 处理错误记录日志可能需要执行擦除恢复或错误处理。 handle_flash_error(ERR_ESUS_WITHOUT_EHV); // 安全起见清除ESUS和ERS放弃该操作 pMCR-ESUS 0; pMCR-ERS 0; return; } // b. 确保DONE1 (挂起状态时DONE应为1) if (pMCR-DONE 0) { // 异常情况等待或处理超时 handle_flash_error(ERR_ESUS_DONE_NOT_SET); return; } // c. 清除ESUS位以恢复擦除 pMCR-ESUS 0; // 写0清除挂起状态 // d. 等待DONE位再次清零表示擦除恢复进行 uint32_t timeout MAX_ERASE_TIMEOUT; while ((pMCR-DONE 1) (timeout-- 0)) { // 空循环或短延时 } if (timeout 0) { handle_flash_error(ERR_ERASE_RESUME_TIMEOUT); return; } // e. 等待擦除完成 (DONE从0变回1) timeout MAX_ERASE_TIMEOUT; while ((pMCR-DONE 0) (timeout-- 0)) { // 空循环或短延时 } if (timeout 0) { handle_flash_error(ERR_ERASE_COMPLETE_TIMEOUT); return; } // f. 检查操作结果 if (pMCR-PEG 0) { handle_flash_error(ERR_ERASE_FAILED_AFTER_RESUME); } // 恢复成功可以清除ERS位 pMCR-ERS 0; } // 3. 如果之前重定位了将中断向量表恢复回Flash // SCB-VTOR (uint32_t)FLASH_VECTOR_TABLE_BASE; // 4. 清除可能因低功耗唤醒产生的错误标志如RWE if (pMCR-RWE) { pMCR-RWE 1; // 写1清除RWE位 } if (pMCR-EER) { pMCR-EER 1; // 写1清除EER位 // ECC双错误是严重错误需要更高级别的处理 handle_flash_error(ERR_ECC_DOUBLE); } }4.3 完整的擦除-低功耗-恢复操作示例假设一个场景我们需要擦除一个Flash扇区但在擦除过程中系统因外部事件需要进入低功耗模式之后唤醒并恢复擦除。// 假设已定义好寄存器结构和基地址 #define FLASH_MCR (*((volatile uint32_t *)0x40020000)) #define FLASH_LML (*((volatile uint32_t *)0x40020004)) // 擦除一个扇区的函数简化版未包含全部互锁序列 FlashStatus_t FLASH_EraseSector(uint32_t sectorAddress) { // 0. 解锁目标扇区对应的锁定位假设是低地址空间块0 // 使能LML写权限 FLASH_LML 0xA1A11111; // 密码写入使能LME // 清除LLK0位解锁块0 FLASH_LML ~(1UL 16); // 假设LLK0在bit16 // 1. 等待Flash就绪 (DONE1, EHV0) while(!(FLASH_MCR (121))); // 等待DONE1 if(FLASH_MCR (131)) return FLASH_BUSY; // EHV1异常 // 2. 设置擦除序列 (ERS1) FLASH_MCR | (129); // 设置ERS // 3. 执行擦除命令互锁序列此处为伪代码具体序列查手册 *((volatile uint32_t*)sectorAddress) 0xAAAAAAAA; // 示例互锁写1 *((volatile uint32_t*)(sectorAddress4)) 0x55555555; // 示例互锁写2 // 4. 使能高压开始擦除 (EHV1) FLASH_MCR | (131); // 设置EHV // 此时DONE应由硬件清零 // 5. 等待擦除完成或处理低功耗请求 // 在实际系统中这里可能是中断驱动或协作式任务调度 // 我们在此处轮询但实际应用应避免长时间阻塞 uint32_t timeout 1000000; // 超时计数 while(!(FLASH_MCR (121))) { // 等待DONE1 timeout--; if(timeout 0) return FLASH_TIMEOUT; // **关键点在此循环中系统可能决定进入低功耗** // 假设一个全局标志指示需要进入低功耗 if(system_low_power_requested) { // 系统请求低功耗。我们无法在此处停止硬件擦除。 // 但硬件会检测到低功耗请求并自动处理 // a. 如果擦除已完成DONE即将变1则完成后再进入低功耗。 // b. 如果擦除正在进行硬件会设置ESUS1并在tESUS后设置DONE1挂起擦除。 // 软件只需安全地调用进入低功耗的函数硬件会自动处理挂起。 // 本函数返回一个“操作挂起”的状态。 return FLASH_OPERATION_SUSPENDED; } } // 6. 检查操作结果 if(FLASH_MCR (122)) { // 检查PEG1 FLASH_MCR ~(129); // 清除ERS位结束序列 return FLASH_OK; } else { FLASH_MCR ~((131) | (129)); // 清除EHV和ERS return FLASH_ERROR; } } // 系统低功耗管理任务 void system_enter_low_power(void) { // 1. 检查Flash状态调用准备函数 if(!FLASH_PrepareForLowPower(FLASH_POWER_DOWN_MODE)) { // Flash未就绪可能无法进入最深低功耗或需要延迟 enter_light_sleep_mode(); return; } // 2. 配置其他外设进入低功耗... // 3. 执行WFI/WFE指令进入系统低功耗 __WFI(); // 4. 唤醒后恢复Flash状态 FLASH_RecoverFromLowPower(); // 5. 检查之前挂起的Flash操作并决定是否继续 if(previous_flash_status FLASH_OPERATION_SUSPENDED) { // 从Flash_RecoverFromLowPower()返回后如果之前有挂起的擦除 // 该函数应已将其恢复。我们只需等待其完成并清理状态。 // 或者重新发起擦除操作。 FLASH_ResumeEraseOperation(); } }5. 常见问题、调试技巧与避坑指南在实际开发中仅仅理解手册是不够的很多问题只有在调试时才会暴露。以下是我在多个基于类似Flash架构的项目中积累的经验和常见问题。5.1 典型问题排查速查表问题现象可能原因排查步骤与解决方案进入低功耗后系统无法唤醒或唤醒后跑飞。1. 中断向量表仍在Flash中且Flash处于Power-Down模式导致中断响应过慢或失败。2. 退出低功耗后Flash未稳定就访问。1. 检查进入低功耗前是否将VTOR重定位到RAM。或避免在需要快速中断响应的场景使用Power-Down模式。2. 在FLASH_RecoverFromLowPower()中增加足够的唤醒延迟或查询硬件就绪标志。擦除或编程操作在低功耗唤醒后失败PEG0。1. 唤醒后未正确恢复挂起的操作ESUS/EHV顺序错误。2. 低功耗期间发生了电源波动导致Flash内容损坏。3. 锁定位LML/HBL/SLL在进入低功耗前后状态发生变化。1. 严格遵循“唤醒后先确认EHV1再清除ESUS0”的流程。2. 检查电源完整性确保低功耗期间供电电压在Flash规格范围内。3. 在操作前后读取并打印锁定位状态确认未被意外修改。系统偶尔在尝试配置Flash时卡死。1. 违反了寄存器写入顺序或状态机。2. 在高压操作EHV1期间尝试修改MCR的控制位如PGM/ERS。3. 同时写入了多个受优先级保护的MCR位。1. 使用调试器单步跟踪检查MCR的DONE、EHV位状态是否满足操作前提。2. 确保任何对PGM/ERS/ESUS的写操作都在EHV0且DONE1时进行。3.将对MCR关键位的修改拆分成独立的写操作不要合并。取Flash数据时发生ECC错误EDC或EER置位。1. Flash存储单元因寿命、辐射或低功耗下电压不稳导致比特翻转。2. 在低功耗模式切换过程中进行了非法访问。1. 启用并监控EDC/EER位。单错误可纠正双错误需做容错处理如启用备份扇区。2. 确保软件在Flash进入/退出低功耗的“临界区”内禁止访问Flash。无法修改块锁定位LLK等。1. 未写入正确的密码使能LME/HBE/SLE。2. 在高压操作未完成DONE0或挂起ESUS1时尝试写锁寄存器。3. 目标存储块在物理上不存在如未使用的地址空间对应锁定位只读且为1。1. 确认密码写入操作正确并检查LME/HBE/SLE位是否已变为1。2. 手册强调锁寄存器在互锁写完成后、DONE置位前不可写。必须在DONE1且无挂起时修改锁。3. 查阅芯片数据手册的内存映射图确认操作的地址块有效。5.2 调试技巧与实操心得状态机可视化在调试初期我习惯将MCR的关键位DONE EHV PGM ERS ESUS PEG映射到调试器的Watch窗口并为其添加注释。观察它们在不同操作启动擦除、进入低功耗、唤醒恢复期间的跳变顺序是理解硬件行为最直观的方式。你会发现从设置ERS到DONE清零中间有明确的延迟这对应着硬件内部的序列执行。超时机制必不可少所有等待DONE、PEG等状态位的循环必须添加超时计数器。我曾经遇到过因硬件异常导致DONE位永远不置1的情况没有超时的代码会永远卡死。超时后应执行安全的错误恢复流程例如清除EHV/PGM/ERS位并重置Flash控制器如果支持。“互锁写序列”是关键中的关键手册中提到的“interlock write”是启动擦写操作的钥匙。这个序列通常是向两个特定的Flash地址写入两个特定的数据模式。这个序列必须绝对准确且必须在设置PGM或ERS之后、设置EHV之前执行。很多操作失败都源于此序列错误或时序不对。有些厂商的驱动库会封装成FLASH_EraseSector()函数但自己编写底层驱动时务必从官方例程或驱动库中复制准确的序列。低功耗模式下的电流测量要验证Flash低功耗模式是否真正生效最可靠的方法是用电流表测量。在系统进入深度休眠前后观察整机电流的下降幅度。如果开启了Flash的Power-Down模式但电流下降不明显可能是其他外设如RTC、看门狗、未使用的IO仍在耗电需要逐一排查。利用非易失性锁存NVLxL进行产品保护对于量产产品不要依赖软件在运行时解锁。应该在最终量产固件中将需要永久保护的区域如Bootloader对应的非易失性锁存位编程为“锁定”状态。这样即使软件被恶意修改也无法擦写这些区域。编程这些非易失性寄存器通常需要特殊的工具或算法请参考厂商的编程规范。关于“保留Reserved位”手册中寄存器图里标为“Reserved”或“0”的位务必写0。读取时忽略其值。随意写入1可能导致未定义的行为。通过将上述理论、流程和经验结合起来你就能在PXD10或类似架构的微控制器上游刃有余地管理Flash存储器的低功耗状态在保障数据安全性和操作可靠性的前提下为你的嵌入式产品榨取出每一分宝贵的续航时间。这其中的每一步谨慎操作和状态检查都是产品稳定性的基石。
PXD10 Flash低功耗模式配置与寄存器操作实战指南
发布时间:2026/6/16 10:15:17
1. 项目概述与核心价值在嵌入式开发领域尤其是面对电池供电的物联网节点、可穿戴设备或便携式仪器时功耗管理是决定产品成败的关键。我们常常需要在性能与续航之间寻找最佳平衡点。作为系统的“记忆中枢”Flash存储器的功耗往往被忽视但它内部的高压电荷泵、灵敏放大器等模拟电路在待机时也会持续消耗可观的电流。PXD10微控制器的Flash模块提供了两种精细化的低功耗模式Power-Down Mode和Low Power Mode。理解并正确配置它们意味着你能在系统休眠时将这块“内存大脑”也置于深度睡眠从而将整体静态功耗再压低一个数量级。然而低功耗从来不是简单的“关闭电源”。就像你不能在一个人跑步时突然让他睡觉Flash模块在进入低功耗状态前必须处理好正在进行的擦写操作并妥善“安置”好自身的状态。PXD10的参考手册揭示了其中的复杂性特定寄存器在低功耗模式下访问受限擦除操作可能被挂起唤醒时序需要精确把控。如果配置不当轻则导致数据写入失败重则引发不可预知的系统错误。因此深入理解MCR模块配置寄存器等关键寄存器的每一位含义以及低功耗模式下的状态机转换是开发稳定、低功耗嵌入式系统的必修课。本文将带你深入PXD10 Flash模块的低功耗世界从原理到实操详解每一个配置细节和避坑要点。2. PXD10 Flash模块低功耗模式深度解析PXD10的Flash模块设计了两种低功耗模式它们并非简单的开关而是具有不同唤醒延迟和功耗特性的状态。理解它们的差异是正确应用的前提。2.1 Power-Down Mode深度睡眠Power-Down Mode可以理解为Flash模块的“深度睡眠”状态。在此模式下模块内部绝大多数电路被关闭仅保留维持最基本状态信息所需的极小电流。这是功耗最低的模式。核心特性与访问限制一旦进入Power-Down模式Flash核心及其寄存器阵列将完全不可访问。这意味着CPU无法读取Flash中的指令或数据也无法对Flash控制寄存器进行读写操作。手册中特别指出用户无法读取UMISR0-4、UT1-2及部分UT0寄存器直到退出此模式。同时对所有寄存器的写访问均被锁定。这是一个至关重要的安全机制防止在模块状态不稳定时进行误操作。状态保存与恢复模块被设计为具有状态保持能力。当退出Power-Down模式后Flash模块会返回到进入低功耗模式之前的状态但有一个关键的例外如果进入低功耗模式时模块正在执行擦除操作的高压阶段那么该操作会被挂起。2.2 Low Power Mode浅度休眠Low Power Mode则可视为“浅度休眠”。它关闭了模块内部大部分的直流电流源但可能保留了一些比Power-Down模式更多的电路以实现更快的唤醒。核心特性与对比与Power-Down模式类似进入Low Power Mode后模块Flash核心和寄存器同样不可用于读写。对UMISR0-4、UT1-2及部分UT0寄存器的读取访问也被禁止所有寄存器的写访问被锁定。其最大的不同在于唤醒时间。Low Power Mode的唤醒时间比Power-Down Mode更快。这为系统设计提供了灵活性如果你需要频繁唤醒并快速响应Low Power Mode可能是更好的选择如果你追求极致的休眠功耗且能接受更长的唤醒延迟则应该使用Power-Down Mode。状态恢复机制与Power-Down模式一致退出Low Power Mode后模块同样会恢复到进入前的状态同样需要处理擦除操作被挂起的情况。2.3 模式互斥与操作挂起机制这两种低功耗模式之间存在严格的互斥关系。手册明确指出当Power-Down Mode激活时禁止进入Low Power Mode反之当Low Power Mode激活时也禁止进入Power-Down Mode。这防止了状态机进入混乱或未定义的状态。最需要开发者关注的是擦除Erase和编程Program操作与低功耗模式进入的交互进入低功耗模式时遇到擦除操作如果Flash模块在进入任何一种低功耗模式时正处于擦除操作的高压阶段则MCR[ESUS]擦除挂起位会被硬件自动置1。擦除操作被暂停。用户需要在模块退出低功耗模式后通过先确保MCR[EHV]使能高压位为高再清除MCR[ESUS]位来恢复擦除操作。进入低功耗模式时遇到编程操作如果Flash模块被配置为在编程操作期间进入低功耗模式硬件会保证编程操作完成后模块才会真正进入低功耗模式。这是一个同步过程无需用户干预挂起与恢复。中断响应延迟手册中一个容易被忽略但影响重大的警告是如果Flash模块处于Power-Down模式并且向量表Vector Table仍然映射在Flash地址空间那么中断响应时间将会显著增加因为需要额外插入多个等待状态Wait States来唤醒和准备Flash模块。在实时性要求高的应用中必须考虑将中断向量表重定位到RAM中或者避免在需要快速响应的休眠阶段让Flash处于Power-Down模式。注意在尝试进入低功耗模式前软件必须检查MCR[DONE]位。只有当DONE1表示没有正在进行的高压操作时进入低功耗模式才是安全的。否则可能会破坏正在进行的擦写操作导致数据损坏。3. 核心寄存器配置详解与实操指南寄存器是软件与Flash硬件交互的桥梁。低功耗模式的管理、擦写操作的控制都依赖于对寄存器的精准配置。PXD10的Flash用户寄存器映射在固定的偏移地址我们重点剖析最核心的模块配置寄存器MCR和块锁定寄存器。3.1 模块配置寄存器MCR全位解析与操作流MCR是Flash模块的“总控制台”地址偏移为0x0000。它的每一位都至关重要。下图是其位域布局的简要示意基于手册描述位域名称类型描述与操作要点0EDCrcECC单错误纠正标志。发生ECC单比特错误并纠正后置1需写1清除。5:7SIZE[2:0]r指示Flash阵列大小只读。例如010代表512KB。9:11LAS[2:0]r指示低地址空间配置只读。15MASr指示中地址空间配置只读。16EERrcECC双错误检测标志。发生ECC不可纠正的双比特错误后置1需写1清除。17RWErc读写冲突错误标志。在编程/擦除期间访问Flash矩阵置1需写1清除。20PEASr编程/擦除地址空间选择。0主阵列1测试/影子空间。21DONEr高压操作完成标志。0正在执行高压操作1未执行。进入低功耗模式前必须确保此位为1。22PEGr编程/擦除操作成功标志。仅在DONE从0变1后操作完成或中止有效。27PGMrw编程序列控制。0-1启动编程1-0结束编程。仅在用户模式读ERS0, UT0.AIE0时可置位。29ERSrw擦除序列控制。0-1启动擦除1-0结束擦除。仅在用户模式读PGM0, UT0.AIE0时可置位。30ESUSrw擦除挂起控制。用于挂起和恢复擦除操作与低功耗模式交互紧密。31EHVrw使能高压。这是启动编程/擦除高压阶段的“总开关”。必须在互锁写操作后设置。关操作流程与寄存器交互启动擦除操作确保目标存储块已解锁通过LML/HBL/SLL寄存器。确保MCR[PGM]0,MCR[ESUS]0,UT0.AIE0。设置MCR[ERS]1。此时模块进入擦除序列准备状态。执行特定的互锁写序列通常是向一个特定地址写入一个特定数据模式具体需查数据手册。设置MCR[EHV]1。高压启动MCR[DONE]自动清零开始物理擦除。轮询或等待中断直到MCR[DONE]1。检查MCR[PEG]1确认操作成功。在擦除中进入低功耗模式若在MCR[EHV]1且MCR[DONE]0正在擦除时系统试图让Flash进入低功耗模式。硬件会自动设置MCR[ESUS]1并在一段延迟tESUS后设置MCR[DONE]1表示擦除已挂起模块可以安全进入低功耗。此时MCR[EHV]必须保持为1。退出低功耗并恢复擦除Flash退出低功耗模式。用户需要先确保MCR[EHV]1然后清除MCR[ESUS]0。清除ESUS后MCR[DONE]会再次清零擦除操作从挂起点恢复。启动编程操作流程与擦除类似但设置的是MCR[PGM]1。关键区别如果编程过程中请求进入低功耗模式硬件会完成当前编程操作后再进入不会产生挂起状态。因此编程操作对低功耗模式更“友好”。位写入优先级机制 手册的Table 17-12揭示了MCR关键控制位的写入优先级ERS PGM EHV ESUS。这意味着如果你尝试通过一次写操作同时改变多个位例如同时清除ERS和EHV只有优先级最高的位此处是ERS的变更会生效。这强制了状态转换的顺序性防止软件错误导致非法状态。在实践中务必通过多次独立的写操作来按顺序改变这些位。3.2 存储块锁定机制详解LML HBL SLL保护Flash内容不被意外修改至关重要。PXD10提供了三层锁定机制主锁LML/HBL、副锁SLL以及最终的“或”逻辑判断。1. 锁寄存器结构与使能LML (Low/Mid Lock)偏移0x0004控制低/中地址空间块的锁定。HBL (High Block Lock)偏移0x0008控制高地址空间块的锁定。SLL (Secondary Low/Mid Lock)偏移0x000C为低/中地址空间提供第二套锁定控制。这些寄存器本身也是被锁定的要修改它们内部的锁定位如LLK15-0 HLK5-0等必须先通过写入特定密码来使能对应的“写使能”位LME(LML bit 0)写入密码0xA1A11111至LML寄存器可使能。HBE(HBL bit 0)写入密码0xB2B22222至HBL寄存器可使能。SLE(SLL bit 0)写入密码0xC3C33333至SLL寄存器可使能。使能后直到下一次系统复位前都可以修改具体的锁定位。2. 锁定逻辑与“或”关系最终的块锁定状态由主锁和副锁**按位相“或”**决定。以低地址空间块0为例最终锁定状态 LML.LLK0ORSLL.SLK0只要LML.LLK0或SLL.SLK0中任意一个为1该块就被锁定。只有两者都为0时该块才解锁允许编程和擦除。这种设计提供了灵活性例如可以由引导加载程序Bootloader设置一套锁如LML由应用程序设置另一套锁如SLL共同管理存储区域的保护策略。3. 非易失性锁存与初始化LML HBL SLL在复位时的初始值并非固定而是从Flash测试区域中的非易失性寄存器NVLML NVHBL NVSLL加载而来。这些非易失性寄存器在芯片出厂时通常为全1已擦除状态意味着所有锁定位默认为1锁定。在量产过程中可以通过编程工具修改这些非易失性寄存器的值实现产品的默认保护状态。上电后FPECFlash编程擦除控制器会读取这些值并更新到易失性的LML/HBL/SLL寄存器中。实操心得在开发调试阶段我们通常在软件初始化时通过密码使能并清除所有锁定位以获得完全访问权限。但在产品发布前务必规划好最终的存储分区和保护策略并考虑是否需要在测试区域编程非易失性锁存值以实现上电即保护防止未授权代码修改关键区域如Bootloader区。4. 低功耗模式配置与进出流程实战理论清晰后我们来看如何在代码中安全、正确地实现Flash模块的低功耗管理。以下流程基于典型的中断驱动或轮询式电源管理。4.1 进入低功耗模式前的安全检查与配置在请求系统进入深度休眠如调用__WFI()或__WFE()指令之前负责电源管理的代码必须对Flash模块进行安全检查。/** * brief 检查并配置Flash模块使其准备进入低功耗模式。 * param mode 目标低功耗模式FLASH_LOW_POWER_MODE 或 FLASH_POWER_DOWN_MODE * return bool true: 准备就绪可进入系统低功耗 false: 未就绪不应进入。 */ bool FLASH_PrepareForLowPower(FlashLowPowerMode_t mode) { volatile FLASH_MCR_t *pMCR (FLASH_MCR_t*)FLASH_MCR_BASE_ADDR; // 1. 检查是否有正在进行的高压操作 if ((pMCR-DONE 0) || (pMCR-EHV 1)) { // DONE0 表示高压操作正在进行 // 即使DONE1如果EHV1也表示模块处于“就绪”或“挂起”状态并非完全空闲 // 此时不应进入低功耗返回错误或等待 return false; } // 2. 检查擦除挂起状态。如果ESUS1说明有擦除被挂起模块状态不“干净”。 // 通常我们应该在退出低功耗后恢复它而不是带着挂起状态进入。 // 最佳实践是在进入低功耗前确保没有挂起的操作。 if (pMCR-ESUS 1) { // 可以选择恢复擦除并等待完成或直接返回错误。 // 这里选择返回错误让上层决定是等待还是放弃进入低功耗。 return false; } // 3. 根据目标模式配置Flash控制器的低功耗模式使能位。 // 注意PXD10的具体控制位名称可能不同这里使用伪代码。 // 通常芯片的电源管理单元PMC或SIM有一个寄存器来控制各模块的低功耗模式。 // 例如PMC-LPCR | PMC_LPCR_LPMD(模式); // 使能Flash的指定低功耗模式 // 这一步是通知电源管理单元“当系统休眠时请将Flash置于此模式”。 // 具体寄存器请参考芯片的电源管理章节。 // 伪代码示例 // if (mode FLASH_POWER_DOWN_MODE) { // PMC-REG | PMC_REG_FLASH_PD_EN_MASK; // } else { // PMC-REG | PMC_REG_FLASH_LP_EN_MASK; // } // 4. 可选但推荐如果使用Power-Down模式且对中断响应时间敏感 // 考虑将中断向量表重定位到RAM。 if (mode FLASH_POWER_DOWN_MODE) { // SCB-VTOR (uint32_t)my_ram_vector_table; // 重定位VTOR } return true; // 安全检查通过Flash已配置好 }4.2 退出低功耗模式后的状态恢复与操作续接系统唤醒后Flash模块需要一段时间从低功耗模式恢复。软件必须等待其稳定并处理可能挂起的操作。/** * brief 系统唤醒后复Flash模块至正常工作状态。 */ void FLASH_RecoverFromLowPower(void) { volatile FLASH_MCR_t *pMCR (FLASH_MCR_t*)FLASH_MCR_BASE_ADDR; // 1. 等待Flash模块退出低功耗模式并稳定。 // 芯片手册会提供一个最小的唤醒时间 tWAKE。通常通过延时或查询状态位实现。 // 伪代码while (!(PMC-STATUS PMC_STATUS_FLASH_RDY_MASK)); // 查询就绪位 // 简单延时方法需根据系统时钟计算 // delay_us(FLASH_WAKEUP_TIME_US); // 例如 50us // 2. 检查并恢复挂起的擦除操作 if (pMCR-ESUS 1) { // 存在挂起的擦除操作 // a. 首先确保EHV1 (挂起时EHV应保持为1) if (pMCR-EHV 0) { // 异常情况EHV被意外清除。挂起的操作可能已损坏。 // 处理错误记录日志可能需要执行擦除恢复或错误处理。 handle_flash_error(ERR_ESUS_WITHOUT_EHV); // 安全起见清除ESUS和ERS放弃该操作 pMCR-ESUS 0; pMCR-ERS 0; return; } // b. 确保DONE1 (挂起状态时DONE应为1) if (pMCR-DONE 0) { // 异常情况等待或处理超时 handle_flash_error(ERR_ESUS_DONE_NOT_SET); return; } // c. 清除ESUS位以恢复擦除 pMCR-ESUS 0; // 写0清除挂起状态 // d. 等待DONE位再次清零表示擦除恢复进行 uint32_t timeout MAX_ERASE_TIMEOUT; while ((pMCR-DONE 1) (timeout-- 0)) { // 空循环或短延时 } if (timeout 0) { handle_flash_error(ERR_ERASE_RESUME_TIMEOUT); return; } // e. 等待擦除完成 (DONE从0变回1) timeout MAX_ERASE_TIMEOUT; while ((pMCR-DONE 0) (timeout-- 0)) { // 空循环或短延时 } if (timeout 0) { handle_flash_error(ERR_ERASE_COMPLETE_TIMEOUT); return; } // f. 检查操作结果 if (pMCR-PEG 0) { handle_flash_error(ERR_ERASE_FAILED_AFTER_RESUME); } // 恢复成功可以清除ERS位 pMCR-ERS 0; } // 3. 如果之前重定位了将中断向量表恢复回Flash // SCB-VTOR (uint32_t)FLASH_VECTOR_TABLE_BASE; // 4. 清除可能因低功耗唤醒产生的错误标志如RWE if (pMCR-RWE) { pMCR-RWE 1; // 写1清除RWE位 } if (pMCR-EER) { pMCR-EER 1; // 写1清除EER位 // ECC双错误是严重错误需要更高级别的处理 handle_flash_error(ERR_ECC_DOUBLE); } }4.3 完整的擦除-低功耗-恢复操作示例假设一个场景我们需要擦除一个Flash扇区但在擦除过程中系统因外部事件需要进入低功耗模式之后唤醒并恢复擦除。// 假设已定义好寄存器结构和基地址 #define FLASH_MCR (*((volatile uint32_t *)0x40020000)) #define FLASH_LML (*((volatile uint32_t *)0x40020004)) // 擦除一个扇区的函数简化版未包含全部互锁序列 FlashStatus_t FLASH_EraseSector(uint32_t sectorAddress) { // 0. 解锁目标扇区对应的锁定位假设是低地址空间块0 // 使能LML写权限 FLASH_LML 0xA1A11111; // 密码写入使能LME // 清除LLK0位解锁块0 FLASH_LML ~(1UL 16); // 假设LLK0在bit16 // 1. 等待Flash就绪 (DONE1, EHV0) while(!(FLASH_MCR (121))); // 等待DONE1 if(FLASH_MCR (131)) return FLASH_BUSY; // EHV1异常 // 2. 设置擦除序列 (ERS1) FLASH_MCR | (129); // 设置ERS // 3. 执行擦除命令互锁序列此处为伪代码具体序列查手册 *((volatile uint32_t*)sectorAddress) 0xAAAAAAAA; // 示例互锁写1 *((volatile uint32_t*)(sectorAddress4)) 0x55555555; // 示例互锁写2 // 4. 使能高压开始擦除 (EHV1) FLASH_MCR | (131); // 设置EHV // 此时DONE应由硬件清零 // 5. 等待擦除完成或处理低功耗请求 // 在实际系统中这里可能是中断驱动或协作式任务调度 // 我们在此处轮询但实际应用应避免长时间阻塞 uint32_t timeout 1000000; // 超时计数 while(!(FLASH_MCR (121))) { // 等待DONE1 timeout--; if(timeout 0) return FLASH_TIMEOUT; // **关键点在此循环中系统可能决定进入低功耗** // 假设一个全局标志指示需要进入低功耗 if(system_low_power_requested) { // 系统请求低功耗。我们无法在此处停止硬件擦除。 // 但硬件会检测到低功耗请求并自动处理 // a. 如果擦除已完成DONE即将变1则完成后再进入低功耗。 // b. 如果擦除正在进行硬件会设置ESUS1并在tESUS后设置DONE1挂起擦除。 // 软件只需安全地调用进入低功耗的函数硬件会自动处理挂起。 // 本函数返回一个“操作挂起”的状态。 return FLASH_OPERATION_SUSPENDED; } } // 6. 检查操作结果 if(FLASH_MCR (122)) { // 检查PEG1 FLASH_MCR ~(129); // 清除ERS位结束序列 return FLASH_OK; } else { FLASH_MCR ~((131) | (129)); // 清除EHV和ERS return FLASH_ERROR; } } // 系统低功耗管理任务 void system_enter_low_power(void) { // 1. 检查Flash状态调用准备函数 if(!FLASH_PrepareForLowPower(FLASH_POWER_DOWN_MODE)) { // Flash未就绪可能无法进入最深低功耗或需要延迟 enter_light_sleep_mode(); return; } // 2. 配置其他外设进入低功耗... // 3. 执行WFI/WFE指令进入系统低功耗 __WFI(); // 4. 唤醒后恢复Flash状态 FLASH_RecoverFromLowPower(); // 5. 检查之前挂起的Flash操作并决定是否继续 if(previous_flash_status FLASH_OPERATION_SUSPENDED) { // 从Flash_RecoverFromLowPower()返回后如果之前有挂起的擦除 // 该函数应已将其恢复。我们只需等待其完成并清理状态。 // 或者重新发起擦除操作。 FLASH_ResumeEraseOperation(); } }5. 常见问题、调试技巧与避坑指南在实际开发中仅仅理解手册是不够的很多问题只有在调试时才会暴露。以下是我在多个基于类似Flash架构的项目中积累的经验和常见问题。5.1 典型问题排查速查表问题现象可能原因排查步骤与解决方案进入低功耗后系统无法唤醒或唤醒后跑飞。1. 中断向量表仍在Flash中且Flash处于Power-Down模式导致中断响应过慢或失败。2. 退出低功耗后Flash未稳定就访问。1. 检查进入低功耗前是否将VTOR重定位到RAM。或避免在需要快速中断响应的场景使用Power-Down模式。2. 在FLASH_RecoverFromLowPower()中增加足够的唤醒延迟或查询硬件就绪标志。擦除或编程操作在低功耗唤醒后失败PEG0。1. 唤醒后未正确恢复挂起的操作ESUS/EHV顺序错误。2. 低功耗期间发生了电源波动导致Flash内容损坏。3. 锁定位LML/HBL/SLL在进入低功耗前后状态发生变化。1. 严格遵循“唤醒后先确认EHV1再清除ESUS0”的流程。2. 检查电源完整性确保低功耗期间供电电压在Flash规格范围内。3. 在操作前后读取并打印锁定位状态确认未被意外修改。系统偶尔在尝试配置Flash时卡死。1. 违反了寄存器写入顺序或状态机。2. 在高压操作EHV1期间尝试修改MCR的控制位如PGM/ERS。3. 同时写入了多个受优先级保护的MCR位。1. 使用调试器单步跟踪检查MCR的DONE、EHV位状态是否满足操作前提。2. 确保任何对PGM/ERS/ESUS的写操作都在EHV0且DONE1时进行。3.将对MCR关键位的修改拆分成独立的写操作不要合并。取Flash数据时发生ECC错误EDC或EER置位。1. Flash存储单元因寿命、辐射或低功耗下电压不稳导致比特翻转。2. 在低功耗模式切换过程中进行了非法访问。1. 启用并监控EDC/EER位。单错误可纠正双错误需做容错处理如启用备份扇区。2. 确保软件在Flash进入/退出低功耗的“临界区”内禁止访问Flash。无法修改块锁定位LLK等。1. 未写入正确的密码使能LME/HBE/SLE。2. 在高压操作未完成DONE0或挂起ESUS1时尝试写锁寄存器。3. 目标存储块在物理上不存在如未使用的地址空间对应锁定位只读且为1。1. 确认密码写入操作正确并检查LME/HBE/SLE位是否已变为1。2. 手册强调锁寄存器在互锁写完成后、DONE置位前不可写。必须在DONE1且无挂起时修改锁。3. 查阅芯片数据手册的内存映射图确认操作的地址块有效。5.2 调试技巧与实操心得状态机可视化在调试初期我习惯将MCR的关键位DONE EHV PGM ERS ESUS PEG映射到调试器的Watch窗口并为其添加注释。观察它们在不同操作启动擦除、进入低功耗、唤醒恢复期间的跳变顺序是理解硬件行为最直观的方式。你会发现从设置ERS到DONE清零中间有明确的延迟这对应着硬件内部的序列执行。超时机制必不可少所有等待DONE、PEG等状态位的循环必须添加超时计数器。我曾经遇到过因硬件异常导致DONE位永远不置1的情况没有超时的代码会永远卡死。超时后应执行安全的错误恢复流程例如清除EHV/PGM/ERS位并重置Flash控制器如果支持。“互锁写序列”是关键中的关键手册中提到的“interlock write”是启动擦写操作的钥匙。这个序列通常是向两个特定的Flash地址写入两个特定的数据模式。这个序列必须绝对准确且必须在设置PGM或ERS之后、设置EHV之前执行。很多操作失败都源于此序列错误或时序不对。有些厂商的驱动库会封装成FLASH_EraseSector()函数但自己编写底层驱动时务必从官方例程或驱动库中复制准确的序列。低功耗模式下的电流测量要验证Flash低功耗模式是否真正生效最可靠的方法是用电流表测量。在系统进入深度休眠前后观察整机电流的下降幅度。如果开启了Flash的Power-Down模式但电流下降不明显可能是其他外设如RTC、看门狗、未使用的IO仍在耗电需要逐一排查。利用非易失性锁存NVLxL进行产品保护对于量产产品不要依赖软件在运行时解锁。应该在最终量产固件中将需要永久保护的区域如Bootloader对应的非易失性锁存位编程为“锁定”状态。这样即使软件被恶意修改也无法擦写这些区域。编程这些非易失性寄存器通常需要特殊的工具或算法请参考厂商的编程规范。关于“保留Reserved位”手册中寄存器图里标为“Reserved”或“0”的位务必写0。读取时忽略其值。随意写入1可能导致未定义的行为。通过将上述理论、流程和经验结合起来你就能在PXD10或类似架构的微控制器上游刃有余地管理Flash存储器的低功耗状态在保障数据安全性和操作可靠性的前提下为你的嵌入式产品榨取出每一分宝贵的续航时间。这其中的每一步谨慎操作和状态检查都是产品稳定性的基石。